Piet ist aus mehreren Gründen eine interessante Programmiersprache. Heute konzentrieren wir uns auf einen Grund: den Rollbefehl . Der Befehl roll stammt ursprünglich aus PostScript und bietet eine leistungsstarke Möglichkeit, den Stapel zu bearbeiten.
Der Befehl roll fügt die beiden obersten Elemente des Stapels ein und verwendet sie als Parameter. Wir werden den ersten turns
und den zweiten Wert als geknallt bezeichnen depth
. Eine Drehung in die Tiefe n nimmt das oberste Element des Stapels auf, macht es zum n-ten Element im Stapel und verschiebt jedes der darüber liegenden Elemente um eins nach oben. Wenn turns
negativ, erfolgt dies in umgekehrter Richtung. Das heißt, das n-te Element wird nach oben und die anderen Elemente nach unten verschoben. Dies wird mehrfach wiederholt abs(turns)
.
Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die einen Stack aufnimmt und diesen Stack nach Ausführung eines Rolls zurückgibt.
Regeln
- Die Ein- und Ausgabe kann in einer Liste, einem Array, einer Zeichenfolge mit Trennzeichen, jeweils in einem Element oder in einem anderen vernünftigen Format erfolgen. Die Ausgabe muss dasselbe Format wie die Eingabe haben.
depth
wird niemals negativ sein und wird niemals größer als die Länge des Stapels.- Der Eingabestapel enthält immer mindestens zwei Elemente.
- Das ist Code-Golf, also gewinnt die kürzeste Antwort in jeder Sprache. Daher werde ich keine Antwort annehmen.
- Standardlücken sind verboten.
Testfälle
in: out:
2
4
1 3
2 4
3 1
4 2
5 5
6 6
in: out:
-2
3
1 2
2 3
3 1
in: out:
-42
0
1 1
2 2
3 3
4 4
5 5
Antworten:
Haskell ,
6462 BytesEdit: -2 bytes: @xnor hat etwas gesehen, woran ich falsch gedacht habe.
r
nimmt und gibt eine Liste vonInt
s zurück.Probieren Sie es online!
splitAt n l
Teilt eine Listel
am Index aufn
,mod
berechnet den Rest der Division und++
verkettet Listen.quelle
(%)=splitAt
Infix definieren .JavaScript (ES6),
4947 BytesBearbeiten: 2 Bytes dank @Shaggy gespeichert, indem die Stack-Elemente als separate Parameter verwendet werden. Erläuterung:
1
das obere Element zumdepth
Element verschoben. Eine Drehung2
verschiebt die beiden oberen Elemente usw. Sie können dies jedoch auch erreichen, indem Sie die Elemente zwischen Drehung und Tiefe nach vorne verschieben.splice
concat
Entfernt diese Elemente und stellt sie den übrigen Elementen voran. (Ich hätte stattdessen ein Array-Verständnis verwenden können, da es dieselbe Länge hat.)slice
ist der zweite Parametersplice
die Anzahl der zu entfernenden Elemente.quelle
(t%d+d)%d
dasselbe wiet%d
?%
ist Rest, also gibt es eine negative Antwort, wennt
es negativ ist.(t,d,...a)=>
festlegen, dass die Eingabe jeweils in einem Element übergeben wird.CJam, 31 Bytes
Eingabe und Ausgabe sind Arrays auf dem Stapel, wobei das letzte Element die Oberseite des Stapels darstellt.
Stack-Trace:
quelle
Mathematica,
5850 BytesEdit: Danke an Martin Ender für das Speichern von 8 Bytes.
Erläuterung:
Reine Funktion, die eine Liste erwartet, bei der der Listenanfang die Spitze des Stapels darstellt. Wir übergeben die Elemente der Liste in die reine Funktion
Take[x={##3},#2]~RotateLeft~#~Join~Drop[x,#2]&
.x
wird auf die Reihenfolge der Elemente gesetzt, die mit dem dritten Argument beginnt. Dann drehen wir das erste#2
(zweite Argument) Elementx
nach links#
(erstes Argument) und dannJoin
die restlichen Elemente vonx
.Es würde retten
3
Bytes wenn wir die Stack-Elemente nur als Argumente an die Funktion übergeben würden, anstatt sie zunächst in einer Liste zu haben, aber dann stimmen die Eingabe- und Ausgabeformate nicht überein.Ursprüngliche Lösung:
Diese Kette von Infix-Funktionen hat etwas wirklich Befriedigendes. Ersetzt eine Liste durch das erste Element
t
, das zweite Elementd
und die verbleibenden Elementex
mit dem Ergebnis, dass die erstend
Elemente{x}
nach links gedrehtt
und die verbleibenden Elemente nach links verbunden werden{x}
.quelle
±
Präfixfunktion anstelle einer Ersetzungsregel verwenden, und ein weiteres Byte, indem SieTakeDrop
Folgendes ausnutzen :±{t_,d_,x___}:=#~RotateLeft~t~Join~#2&@@{x}~TakeDrop~d
...&[1, 1, 3, 4]
und zurück{3, 4}
oder tut dies manuell mit einemApply
am Anfang:Take[x={##3},#2]~RotateLeft~#~Join~Drop[x,#2]&@@#&
(nur klar sein, mein erster Vorschlag läßt die@@#&
).Ruby, 40 Bytes
Probieren Sie es online!
Nimmt die Eingabe als Liste und gibt eine Liste zurück. Die Tatsache, dass ein eingebautes Modul
rotate
vorhanden ist, das sowohl positive als auch negative Drehungen verarbeiten kann, macht dies trivial.quelle
Python,
141988774 BytesDank @Cole 11 Bytes gespart
Erhält Eingaben als Liste, wobei das letzte Element oben im Stapel steht.
Verwendet den 0ⁿ-Trick, um den Modulo-Operator für die Nulltiefe und die Vorzeichenanpassung von Python zu filtern, um den Teil der Liste zu bestimmen, der zerlegt werden soll.
quelle
f(s,t,d)
?f(s,t,d)
(Eingabe ist der gesamte Stapel).r=-t%d-d
. Auch das Ersetzens*0**d
durchs*(d<1)
behält die Byteanzahl bei, verbessert aber möglicherweise die Lesbarkeit (nicht, dass dies das Ziel ist).0**0==1
In Python wusste ich das allerdings nicht , das ist interessant.-t%d-d
als Wert (wie ich vorher), denn wennd
sie0
diese eine Division durch Null Ausnahme auslösen würde.JavaScript ES6,
10992 BytesProbieren Sie es online!
Erhält Eingaben in Form eines Arrays von Ganzzahlen.
Hat auch die Zählung zum Pfeil: P
Erläuterung:
Der Code verwendet die Shift-Funktion, um die ersten beiden Elemente der Liste zu extrahieren.
Sie erhält dann den absoluten Wert des ersten Elements, dh die Anzahl der Umdrehungen.
Da Javascript mit Null indexiert ist, muss der Tiefenindex um 1 verringert werden.
Wenn der Tiefenindex 0 oder 1 war, sollte sich nichts ändern, aber aufgrund der Abnahme würde der Index 0 Änderungen verursachen. Verlassen Sie daher die Schleife, wenn der Tiefenindex nicht <= 0 ist.
Die Splice-Funktion (a, b) gibt das Unterarray der Länge b mit dem Startindex a aus dem Array zurück und lässt das ursprüngliche Array ohne diese Elemente.
In Verbindung mit dem Rest des ursprünglichen Arrays handelt es sich um eine einzelne Drehung des Arrays um den Tiefenindex.
Durch n-maliges Durchführen dieser Operation, wobei n die Anzahl der Umdrehungen ist, ist das resultierende Array das Ergebnis des Rollenoperators.
quelle
Python 2 , 48 Bytes
Probieren Sie es online!
quelle
TI-Basic,
141150 Bytes (nicht konkurrierend)Edit: Fehler behoben, bei dem die Tiefe Null ist (+9 Bytes)
TI-Basic unterstützt keine Listen mit der Länge 0, daher funktioniert dieser Ansatz bei Eingaben mit zwei Längen nicht.
Erläuterung:
quelle
seq(
.Batch, 163 Bytes
Übernimmt Eingaben als Befehlszeilenparameter und gibt eine durch Leerzeichen getrennte Liste aus. Die Parameter zwischen
t
undd
werden in dier
Variable extrahiert , sodass sie ders
Variablen vorangestellt werden können, die alle anderen Parameter empfängt.quelle