Einführung
Ich habe die Klasse der Ameisenpermutationen in einer früheren Herausforderung definiert . Zur Erinnerung, eine Permutation p der Zahlen von 0 bis r-1 ist antsy, wenn für jeden Eintrag p [i] mit Ausnahme der ersten, gibt es einige früheren Eintrag p [ik] derart , dass p [i] == p [ ik] ± 1 . Aus Spaß stellte ich auch fest, dass es für r ≥ 1 genau 2 r-1 Ameisenpermutationen der Länge r gibt . Dies bedeutet, dass es eine Eins-zu-Eins-Entsprechung zwischen den Ameisenpermutationen der Länge r und den Binärvektoren der Länge r-1 gibt. In dieser Herausforderung besteht Ihre Aufgabe darin, eine solche Korrespondenz zu implementieren.
Die Aufgabe
Ihre Aufgabe ist es, ein Programm oder eine Funktion zu schreiben , die einen Binärvektor der Länge 1 ≤ n ≤ 99 aufnimmt und eine Ameisenpermutation der Länge n + 1 ausgibt . Die Permutation kann entweder 0-basiert oder 1-basiert sein (dies muss jedoch konsistent sein), und die Eingabe und Ausgabe kann in jedem vernünftigen Format erfolgen. Außerdem müssen unterschiedliche Eingänge immer unterschiedliche Ausgänge liefern. Ansonsten können Sie jede gewünschte Permutation zurückgeben.
Die niedrigste Byteanzahl gewinnt.
Beispiel
Die (0-basierten) Ameisenpermutationen der Länge 4 sind
0 1 2 3
1 0 2 3
1 2 0 3
1 2 3 0
2 1 0 3
2 1 3 0
2 3 1 0
3 2 1 0
und Ihr Programm sollte einen von ihnen für jeden der acht Bitvektoren der Länge 3 zurückgeben:
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
quelle
0 1
und0 0 1
sollte Ausgänge unterschiedlicher Länge geben.Antworten:
Jelly ,
121110 BytesProbieren Sie es online!oder generiere alle Permutationen der Länge 4 .
Wie es funktioniert
quelle
Python 2,
6260 BytesVielen Dank an @xnor für das Golfen mit 2 Bytes!
Teste es auf Ideone .
quelle
x=0,
?0,
ist ein Tupel. Ohne das Komma würde die Zuordnung über x fehlschlagen.n
zu tun[n*len(x)]
und die Karte in eine Liste comp zu ändern.Python, 54 Bytes
Verwendet das folgende Verfahren:
Zum Beispiel
l=[1,0,1,0]
gibtf(l) == [2,1,3,0,4]
Das Voranstellen einer 0 würde ebenfalls zum selben Ergebnis führen. Das
enumerate
ist klobig, ich werde sehen, ob es rekursiv besser geht.quelle
sum
und keine Slicing-Syntax gab.JavaScript (ES6),
484745 BytesEs stellte sich heraus, dass dies der Methode von @ETHproductions ähnlich war, mit der Ausnahme, dass ich das erste Element direkt berechnet und dann anhand des Binärvektors festgestellt hatte, ob jede Ziffer ein neues Hoch oder ein neues Tief ist. Bearbeiten: 1 Byte dank @ETHproductions gespeichert. 2 Bytes werden gespeichert, indem mit Null begonnen und anschließend angepasst wird. Meine vorherige Methode erwies sich als ähnlich wie die @ Dennis-Methode, nahm jedoch 54 Bytes in Anspruch:
quelle
Perl, 33 Bytes
Beinhaltet +1 für
-p
Gib den Vektor als String ohne Leerzeichen in STDIN an:
antsy.pl
:quelle
JavaScript (ES6), 52 Byte
Probieren Sie es aus:
Erläuterung
Dies nutzt die Tatsache aus, dass bei der Umkehrung einer Ameisenpermutation jedes Element entweder 1 mehr als das Maximum der vorherigen niedrigen Einträge oder 1 weniger als das Minimum der vorherigen hohen Einträge ist. Indem wir einen höheren Gegenstand als einen
0
niedrigeren Gegenstand als einen bezeichnen1
, können wir eine exakte Eins-zu-Eins-Entsprechung zwischen den Ameisenpermutationen der Länge n und den Binärvektoren der Länge n - 1 erzeugen .Das Beste, was ich mit Dennis 'Technik machen konnte, sind
5751 Bytes:xnors Lösung ist 56 (dank @Neil 1 Byte gespart):
quelle
i-i*x
könnte seini*!x
.Haskell, 40 Bytes
Dennis 'Python-Lösung spielt wunderbar in Haskell mit
map
undfold
. Es ist kürzer als meine Versuche, meine direkte Einstiegskonstruktion zu portieren:quelle
Batch, 127 Bytes
Übernimmt die Eingabe als Befehlszeilenparameter, die Ausgabe erfolgt zeilengetrennt. (Auf STDIN können Sie ohne zusätzliche Kosten durch Leerzeichen getrennt eingeben.)
quelle