Diese Herausforderung steht im Zusammenhang mit einigen Funktionen der MATL-Sprache im Rahmen des Events Sprache des Monats im Mai 2018 . Assoziierte Herausforderung: Funktion Zwischenablage: Kopieren .
Einführung
Die Funktions-Zwischenablage von MATL speichert ("kopiert") die Eingaben zu den vier letzten Aufrufen für normale Eingabeaufnahmefunktionen. Normale Funktionen sind der häufigste Funktionstyp in MATL. Eingabeaufnahme bedeutet, dass die Funktion mindestens eine Eingabe aufnimmt. Der gespeicherte Inhalt der Zwischenablage kann auf den Stapel geschoben ("eingefügt") werden.
Bei dieser Abfrage wird der Inhalt der Zwischenablage als Eingabe verwendet. Es wird angenommen, dass alle Funktionen, die diesen Zwischenablagezustand erzeugt haben, eine oder mehrere positive Ganzzahlen als Eingaben verwendeten. So kann der Zustand der Zwischenablage durch eine Liste von Nummernlisten dargestellt werden. (Weitere Informationen darüber, wie die Zwischenablage tatsächlich gefüllt ist, finden Sie in der entsprechenden Aufforderung. Dies ist jedoch für die aktuelle nicht erforderlich.)
Interpretation des Inhalts der Zwischenablage
Beispiel 1
Die erste innere Liste bezieht sich auf den letzten Funktionsaufruf und so weiter, also auf den Zustand der Zwischenablage
[[11, 28], [12, 16], [4], [5, 6]]
zeigt an, dass der letzte Funktionsaufruf zwei Eingänge hat, nämlich 11
, 28
; vorletzten Anruf hat Eingänge 12
, 16
; usw. (Dieser Zwischenablagezustand wird durch den Code im ersten Beispiel der zugehörigen Abfrage erzeugt.)
Beispiel 2
Wenn es nicht genügend Funktionsaufrufe gegeben hat , sind einige nachgestellte innere Listen in der Zwischenablage leer:
[[7, 5], [], [], []]
(Dies wird von einem Programm erzeugt, das einfach 7
und hinzufügt. 5
)
Beispiel 3
Funktionsaufrufe können eine beliebige Anzahl von Eingaben haben , mindestens jedoch 1
(Funktionen, die keine Eingaben annehmen, ändern den Status der Zwischenablage nicht). So ist auch folgendes möglich.
[[3], [2, 40, 34], [7, 8, 15], []]
Zugriff auf den Inhalt der Zwischenablage
Der Inhalt der Funktions-Zwischenablage wird mit der Funktion von MATL M
(die übrigens keine normale Funktion, sondern eine Zwischenablage-Funktion ist) auf den Stapel verschoben . Diese Funktion verwendet eine positive Ganzzahl als Eingabe und verschiebt einen Teil des Inhalts der Zwischenablage wie folgt auf den Stapel. In Bezug auf den Status der Zwischenablage in Beispiel 1:
[[11, 28], [12, 16], [4], [5, 6]]
1M
Gibt alle Eingaben zum letzten Funktionsaufruf zurück. Also, für das in Betracht gezogenen Beispiel, gibt es11
,28
.- In ähnlicher Weise
2M
,3M
und das4M
Rück alle Eingaben an den zweiten, dritten und vierten letzten Funktionsaufrufe. So2M
gibt12
,16
;3M
gibt4
; und4M
gibt5
,6
. - Zahlen jenseits
4
ausgewählter einzelner Eingänge für Funktionsaufrufe, die mehr als einen Eingang belegt haben. So5M
gibt die letzte Eingabe in den letzten solchen Anruf. In unserem Fall gibt dies28
.6M
gibt die vorhergehende individuelle Eingabe zurück11
.7M
gibt die letzte Eingabe des vorletzten Aufrufs zurück, das heißt16
, und8M
gibt12
. Nun9M
gibt6
. Beachten Sie, wie Eingaben4
übersprungen werden, da dies die einzige Eingabe in ihrem Funktionsaufruf war. Zuletzt10M
gibt5
.
Für den Zwischenablage-Status in Beispiel 3:
[[3], [2, 40, 34], [7, 8, 15], []]
1M
gibt3
.2M
gibt2
,40
,34
.3M
gibt7
,8
,15
.4M
hat undefiniertes Verhalten (für die Zwecke dieser Herausforderung), da es nur drei Funktionsaufrufe gab.5M
gibt34
.6M
gibt40
.7M
gibt2
.8M
gibt15
.9M
gibt8
,10M
gibt7
.11M
,12M
, ... haben auch nicht definiertes Verhalten .
Die Herausforderung
Eingabe :
- den Zustand der Zwischenablage als eine Liste von Listen oder ein anderes vernünftiges Format;
- eine positive ganze Zahl n .
Ausgabe : Das Ergebnis des Aufrufs der Funktion M
mit n als Eingabe. Die Ausgabe erfolgt in einer oder mehreren Zahlen mit einem eindeutigen Trennzeichen oder in einem angemessenen Format wie einer Liste oder einem Array.
Klarstellungen:
- Der Status der Zwischenablage besteht aus vier Nummernlisten. Einige der nachfolgenden Listen sind möglicherweise leer, wie in den Beispielen 2 und 3. Bei Bedarf können Sie die Zwischenablage auch ohne die nachfolgenden leeren Listen eingeben. So würde Beispiel 3 werden
[[3], [2, 40, 34], [7, 8, 15]]
. - Alle Zahlen in der Zwischenablage sind positive Ganzzahlen, möglicherweise mit mehr als einer Ziffer.
- Die Nummer n ist garantiert gültig. So kann zum Beispiel 3 oben
n
nicht4
oder sein11
.
Zusätzliche Regeln:
Eingabe und Ausgabe können mit jedem vernünftigen Mittel erfolgen .
Programme oder Funktionen sind in jeder Programmiersprache zulässig . Standardlücken sind verboten .
Kürzester Code in Bytes gewinnt.
Testfälle
Clipboard state
Number
Output(s)
[[11, 28], [12, 16], [4], []]
2
12, 16
[[11, 28], [12, 16], [4], []]
5
28
[[7, 144], [12], [4, 8], [3, 4, 6]]
1
7, 144
[[7, 144], [12], [4, 8], [3, 4, 6]]
10
4
[[30], [40], [50, 60], [70, 80, 90]]
2
40
[[30], [40], [50, 60], [80, 90]]
7
90
[[15], [30], [2, 3, 5], [4, 5, 10]]
3
2, 3, 5
[[15], [30], [2, 3, 5], [4, 5, 10]]
7
2
quelle
Antworten:
Gelee , 8 Bytes
Probieren Sie es online!
quelle
ḊƇ
Alle Nicht-Singletons auswählen,U
umkehren undẎ
abflachen. Für die Eingabe[[11, 28], [12, 16], [4], []]
erhält dieser[16, 12, 28, 11]
die Werte von5M
through8M
. Stellen Sie nun die ursprüngliche Eingabe dieser Liste voran⁸;
und indizieren Sie sie in der resultierenden Liste durch die andere Eingabe⁹ị
.U
es nicht das Ergebnis umkehrtḊƇ
, sondern jedes seiner Elemente. Nur wenn ich irgendwie reduzieren könnteḊƇUẎ⁸;
...Haskell ,
56 5147 Bytes-5-9 Bytes dank Laikoni ( Musterübereinstimmung , um Länge> 1 zu gewährleisten unddo
-Notation über Listenverständnis zu verwenden)!Probieren Sie es online!
Punktfrei,
5855 Bytes-3 Bytes dank Laikoni (verschieben
([]:)
und ersetzenid
)!Alternativ könnten wir diese pointfree Version verwenden
(!!).(([]:)<>map pure.(>>=reverse).filter((1<).length))
.quelle
APL (Dyalog Unicode) , 17 Byte
Probieren Sie es online!
quelle
JavaScript (Node.js) , 57 Byte
Probieren Sie es online!
Dies ist eine anonyme Curry-Funktion. Führen Sie es mit
( function code )(clipboard)(n)
Erläuterung
quelle
JavaScript (ES6), 72 Byte
Übernimmt Eingaben in der Currying-Syntax
(clipboard)(n)
.Probieren Sie es online!
quelle
Python 2 ,
6056 BytesDanke an Jonathan Allan für -4 Bytes.
Probieren Sie es online!
quelle
Java 8, 110 Bytes
Ein Lambda (Curry), das den Status der Zwischenablage als
int[][]
und die Nummer alsint
und zurückgibtint
oderint[]
(eine einzelne Nummer kann durch einen der beiden Typen zurückgegeben werden).Probieren Sie es online
Ungolfed
quelle
05AB1E , 12 Bytes
Probieren Sie es online!
Erläuterung
quelle
Schale , 12 Bytes
Probieren Sie es online!
Erläuterung
Ziemlich direkter Hafen der Haskell-Antwort:
quelle
R , 58 Bytes
Probieren Sie es online!
Nimmt
M
alslist
Vektorenc()
; Wenn Sie also[[
mitlist(
,[
mitc(
und]
mit ersetzen ,)
sollten Sie die Testfälle in R-Testfälle umwandeln.Gibt für Eingaben
n<=4
mit "undefiniertem Verhalten"NULL
und für andere ungültige Eingaben einen "Index außerhalb der Grenzen" -Fehler aus.quelle
[n]
anstelle von durchkommen[[n]]
.Stax ,
121413 BytesFühren Sie es aus und debuggen Sie es
Erläuterung:
Stax, 12 Bytes
Unverpackt:
Dies ist ein Block, also kann ich den loswerden
]|u
, aber ich weiß nicht, ob dies gültig ist, da es einen Block packt.quelle
J ,
3322 Bytes-11 Bytes (1/3 kürzer) dank der FrownyFrog-Lösung!
Probieren Sie es online!
Meine anfängliche Lösung:
J , 33 Bytes
Nicht glücklich - ich bin mir ziemlich sicher, dass es viel weiter golfen werden kann.
Erläuterung:
Eine dyadische Funktion, deren rechtes Argument der Zustand der Zwischenablage ist. Das linke Argument ist
n
<:@[
subtrahiere 1 vom linken Argument{
Wählt dasi
(oben berechnete) th-Element aus der Liste auf der rechten Seite aus(...)
die gesamte Liste#
Kopieren]
aus der Liste der Zwischenablage Zustand(1<#)
die Unterlisten mit einer Länge größer als 1|.&.>
Drehe jede kopierte Unterliste<"0@;
raze and box - fügt jede Nummer in ein separates Feld ein,
Hängt die neue Liste an die Liste des Zwischenablagezustands an@]
macht das gesamte Verb in (...) monadischProbieren Sie es online!
quelle
0;
am besten. Vielen Dank!V + Coreutils ,
53 45 43 4240 Bytes-9 Bytes dank DJMcMayhem (mit
VGÇ /d
mehr als:,$g/^[^ ]*$/d
,D@"dd
über"aDÀdd
und!!
über:.!
)!Mein allererster Versuch bei V (Tipps erwünscht!), Der folgende Code verwendet zur besseren Lesbarkeit eingekreiste Zeichen (zB
ⓞ
für\xf
):Probieren Sie es online!
Hexdump
Erläuterung
Die erste Zeile enthält n und die folgenden Zeilen enthalten die Einträge der Zwischenablage. Bei mehreren Eingaben wird jeder Eintrag durch Leerzeichen getrennt:
quelle
Rot , 91 Bytes
Probieren Sie es online!
quelle
C (gcc) , 176 Bytes
Probieren Sie es online!
Nimmt das Array als eine Liste von 4 Start / Ende-Zeigerpaaren, dann n.
Beschreibung:
quelle