Definieren wir den Prozess des Zerquetschens einer Reihe von Zahlen. In einem Schwarm lesen wir das Array von links nach rechts. Wenn wir an einem Punkt zwei gleiche Elemente in einer Reihe antreffen, entfernen wir das erste und verdoppeln das zweite. Hier ist zum Beispiel der Prozess des Zerquetschens des folgenden Arrays
[5,2,2,3]
^
[5,2,2,3]
^
[5,2,2,3]
^
[5,4,3]
^
[5,4,3]
^
Das gleiche Element kann mehrfach zusammengebrochen werden, zum Beispiel [1,1,2]
wird , [4]
wenn zerkleinert.
Wir werden ein Array als nicht zerlegbar bezeichnen, wenn der Prozess des Zerlegens dieses Arrays es nicht ändert. Zum Beispiel [1,2,3]
ist immer noch [1,2,3]
nach zerkleinert.
Ihre Aufgabe ist es, ein Array zu nehmen und die Anzahl der Crushs zu bestimmen, die erforderlich sind, um es unzerbrechlich zu machen. Sie benötigen nur Ganzzahlen im Bereich von 0 bis 2 32 -1
Dies ist Codegolf, daher werden die Antworten in Bytes bewertet, wobei weniger Bytes besser sind.
Testfälle
[1] -> 0
[1,1] -> 1
[2,1,1] -> 2
[4,2,1,1] -> 3
[2,2,2,1,1] -> 3
[0,0,0,0] -> 1
[4,0,0,0,4] -> 1
[4,0,0,0,0,4] -> 1
[] -> 0
quelle
[1,1,2,4,8]
1 oder 4 zurückgeben?0,0,0,0
es nur so war1
. Es könnte eine Idee sein, irgendwo explizit zu erwähnen, dass wir zählen, wie oft wir ein Array durchlaufen müssen, um es vollständig zu zerstören, und nicht , wie ich anfangs dachte, wie oft wir insgesamt 2 Zahlen zusammen zerstören.Antworten:
x86-Assembly (64-Bit),
66-65ByteZeichenfolgenanweisungen waren hilfreich. Off-by-One-Fehler in einer 64-Bit-Umgebung zu beheben, war nicht der Fall.
Voll Quellcode kommentiert:
Ich kann versuchen, dies in 32-Bit zu tun, wenn auch nur zum Spaß, da mich diese REX-Präfixe wirklich umgebracht haben.
Bearbeiten: ein Byte weniger, indem lodsq durch add,% rdx durch% rax ersetzt und zwei cld's zu einem reduziert werden.
quelle
Pyth , 22 Bytes
Überprüfen Sie alle Testfälle.
quelle
Haskell , 66 Bytes
Probieren Sie es online!
Erläuterung
f
ist eine Funktion, die eine Liste zerquetscht. Es macht den Crush wie in der Frage beschrieben.g
ist eine Funktion, die die Anzahl der Quetschungen zählt. Wennf x==x
,g x=0
andersg x=1+g(f x)
.quelle
g(f x)
aufg$f x
+
eine höhere Priorität hat als$
Paradoc (v0.2.10), 16 Bytes (CP-1252)
Probieren Sie es online! / mit Kopf- / Fußzeile, die alle Testfälle prüft
Nimmt eine Liste auf den Stapel und ergibt eine Zahl auf dem Stapel.
Um ehrlich zu sein, ist die Implementierung ziemlich unkompliziert. Zerlegt eine Liste, indem sie mit einem Sentinel -1 beginnt, die Liste durchläuft, jedes Element verschiebt und dem Element darunter hinzufügt, wenn sie gleich sind. Am Ende haben wir die -1 abgeschnitten. Wir zerkleinern nur gleiche Zahlen zusammen und alle Zahlen des Problems sind nicht negativ, so dass der -1-Sentinel den Zerkleinerungsprozess nicht beeinflusst. Wenn die Zerkleinerung implementiert ist, müssen nur die Iterationen bis zum festgelegten Punkt gezählt werden.
Erläuterung:
Wenn wir annehmen könnten, dass die Eingabe nicht leer ist, bräuchten wir den Sentinel nicht und könnten 2 Bytes sparen:
{(\ε=k+x}]}IL(
Eine weitere lustige Tatsache: Wir verlieren nur 2 Bytes, wenn wir uns zwingen, nur ASCII zu verwenden:
{1m\{=k+x}e]1>}IL(
quelle
JavaScript (ES6), 86 Byte
Ungolfed und erklärt
Tests
Code-Snippet anzeigen
quelle
a.length>n
ist das gleiche wiea[n]!=[]._
. In diesem Fall (da alle Elemente im Array Zahlen größer als -1 sind) ist es dasselbe wiea[n]>-1
. Aucha[i]==a[++i]&&x
ist das gleiche wiea[i]-a[++i]||x
.1/a[i]
funktioniert auch, um ein weiteres Byte zu speichern.JavaScript, 67 Byte
Probieren Sie es online!
quelle
Brain-Flak , 144 Bytes
Probieren Sie es online!
Erläuterung
Die Zerkleinerungsfunktion berechnet die Anzahl der Artikelpaare, die zusammen zerkleinert wurden:
quelle
Java 8, 120 Bytes
Ein Lambda von
List<Long>
bisInteger
. Eingabeliste muss implementierenremove(int)
(zBArrayList
). Zuweisen zuFunction<List<Long>, Integer>
.Probieren Sie es online
Ungolfed Lambda
c
zählt die Anzahl der bisherigen Crushs,i
ist der Index in der Liste undf
gibt an, ob die Liste nach Abschluss einer Iteration weiter zerkleinert werden soll. Innerhalb der Schleifen wird jedes benachbarte Paar verglichen.i
wird bedingungslos inkrementiert. Wenn also ein Element durch Quetschen entfernt wird,i
wird es zuerst dekrementiert, um das Inkrement aufzuheben. Das vorherige Element wird aus der Liste entfernt.Danksagung
quelle
valueOf
Cache nicht erreichen. Beispiel:{128L, 128L}
. Das liegt daranl.get(i)==l.get(i-1)
, was durch ersetzt werden solltel.get(i).equals(l.get(i-1))
.l.get(i)-l.get(i-1)==0
funktionieren. Vielen Dank!Perl 5 , 96 Bytes
94 Code, 2 für
-pa
Probieren Sie es online!
quelle
JavaScript (ES6), 70 Byte
Erläuterung:
Testfälle:
Code-Snippet anzeigen
quelle
Python 2 ,
112110108107105100 BytesBearbeiten: 2 Bytes durch Entfernen
or
in der return-Anweisung gespeichertBearbeiten: Speichert 2 Bytes, indem
i
als Index das zweite der beiden Elemente verwendet wird, auf die zugegriffen werden sollBearbeiten: 1 Byte dank @ Mr.Xcoder gespeichert
Bearbeiten: 7 Bytes dank @jferard gespeichert
Probieren Sie es online!
quelle
JavaScript (ES6), 83 Byte
Erläuterung: Die Elemente werden rekursiv aus dem ursprünglichen Array extrahiert, und es werden eindeutige Werte angehängt,
b
währendc
ein Flag angibt, ob das Array erfolgreich komprimiert wurde.quelle
J, 54 Bytes
Probieren Sie es online!
Auf keinen Fall mein bestes Golf. Sicherlich muss es eine bessere Möglichkeit geben, eine Liste mit einem Element in ein Atom umzuwandeln.
Erläuterung
zerquetschen
Dies zerquetscht ein Array einmal. Das Array muss umgekehrt angegeben werden, da die Einfügung von J von rechts nach links funktioniert (was ich heute gelernt habe). Dies ist nicht besonders wichtig, da wir nur die Anzahl der möglichen Ausdrücke für das Array ausgeben müssen.
mal
Dies ist ziemlich einfach: Wenden Sie Crush auf das Array an, bis das Ergebnis konvergiert. Es gibt jedoch einige Probleme, mit denen ich mich befassen musste, und die viel mehr Code ergeben, als ich erwartet hatte.
Erstens, wenn sich die Zerkleinerung auf ein einzelnes Element reduziert, befindet sich dieses Element tatsächlich in einer Liste mit einem Element (dh es ist nicht atomar), sodass die Funktion erneut angewendet wird, was zu einer Überzählung führt. Um dies zu beheben, benutzte ich einen Hack, der mir einfiel, um eine einzelne Elementliste auf ein Atom zu reduzieren, das ist
".@":
(in einen String konvertieren und dann auswerten).Zweitens
crush
Fehler in der leeren Liste. Ich denke, Sie können mit insert (/
) definieren, wie sich eine Funktion beim Empfang leerer Eingaben verhalten soll , aber ich konnte nach einer flüchtigen Betrachtung nichts finden, daher verwende ich eine andere Problemumgehung. Diese Problemumgehung besteht darin_
, der Liste (unendlich) voran zu stellen, da sie sich nie darauf auswirkt, wie oft das Array komprimiert wird (_ > 2^64
). Dies führt jedoch zu einer einzelnen Elementliste, die aus_
dem Vorhandensein der leeren Liste besteht, sodass wir vor dem Zerkleinern erneut in ein Atom konvertieren müssen .quelle
Jelly , 21 Bytes
Probieren Sie es online!
quelle
R , 142 Bytes
Schrecklich, ich bin sicher, dass es einen klügeren Weg gibt.
R ganze Zahlen sind eigentlich alle höchstens
2^31-1
.Probieren Sie es online!
quelle