Früher habe ich den Prozess des Zerquetschens eines Arrays definiert
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,4]
^
[5,2,2,4]
^
[5,2,2,4]
^
[5,4,4]
^
[5,4,4]
^
[5,8]
^
Beachten Sie, dass dasselbe Element mehrmals reduziert werden kann. In dem Beispiel 2,2,4
wurde 8
in einem einzigen Durchgang zusammengefasst.
Jetzt ist es ganz einfach, Arrays zu zerkleinern. Ihre Aufgabe ist es, ein Array positiver Ganzzahlen als Eingabe zu verwenden und das größte Array auszugeben, das die Eingabe bilden kann, wenn es wiederholt zerkleinert wird. Beispielsweise wird die Anordnung [4]
durch Zerkleinern gebildet, [2,2]
das wiederum durch Zerkleinern gebildet wird [1,1,1,1]
. Da wir keine ganzzahligen Werte haben [1,1,1,1]
können, können wir sie nicht weiter auflösen und sind somit unsere Antwort.
0
In Ihrem Eingabearray wird niemals ein angezeigt, da solche Arrays auf unbestimmte Zeit erweitert werden können. Sie werden auch niemals einen Fall mit zwei gleichen ungeraden Zahlen nebeneinander erhalten. Solche Fälle können nicht das Ergebnis einer Quetschung sein.
Dies ist Codegolf, daher werden Antworten mit der Größe ihrer Quelle in Byte bewertet, wobei weniger Byte besser sind.
Bevor Sie mit der Beantwortung beginnen, möchte ich nur sagen, dass diese Herausforderung wesentlich schwieriger ist, als es scheint. Überprüfen Sie Ihre Intuition und stellen Sie sicher, dass Ihre Antwort alle Testfälle besteht.
Testfälle
[] -> []
[5] -> [5]
[6] -> [3,3]
[8] -> [1,1,1,1,1,1,1,1]
[4,8] -> [1,1,1,1,1,1,1,1,1,1,2]
[2,8] -> [1, 1, 1, 1, 2, 1, 1, 1, 1]
[4,4] -> [1,1,1,1,1,1,1,1]
quelle
[1,1,1,1,1,1,1,1,1,1,2]
produzieren[4, 8]
statt[8, 4]
? sollte dies sein[1,>1,1,1,1,1,1,1,1,1,2]
,[2,1,>1,1,1,1,1,1,1,2]
,[2,>2,1,1,1,1,1,1,2]
,[4,1,>1,1,1,1,1,2]
,[4,2,1,>1,1,1,2]
,[4,2,>2,1,1,2]
,[4,>4,1,1,2]
,[8,1,>1,2]
,[8,2,>2]
,[8,4]
?[1,>1,1,1,1,1,1,1,1,1,2]
,[2,>1,1,1,1,1,1,1,1,2]
,[2,1,>1,1,1,1,1,1,1,2]
,[2,2,>1,1,1,1,1,1,2]
,[2,2,1,>1,1,1,1,1,2]
,[2,2,2,>1,1,1,1,2]
,[2,2,2,1,>1,1,1,2]
,[2,2,2,2,>1,1,2]
,[2,2,2,2,1,>1,2]
,[2,2,2,2,2,>2]
,[2,2,2,2,4>]
, zweiter Durchlauf:[2,>2,2,2,4]
,[4,>2,2,4]
,[4,2,>2,4]
,[4,4,>4]
,[4,8>]
. Hoffentlich klärt das alles auf. Wenn Sie möchten, dass sich ein Code die vorherige Frage ansieht, gibt es Antworten, die eine Brechfunktion implementieren.[4, 4]
sollte entfernt werden, da wir dieses Array nach einer Stretch => Crush-Sequenz nie mehr bekommen können, da dies mit[8]
Antworten:
JavaScript (Node.js) ,
237221213186 BytesProbieren Sie es online!
Dieser Algorithmus berechnet optimal gedehnte Arrays, indem er jede Zahl bis zum Maximum dehnt und dann, falls erforderlich, ein Zahlenpaar an der richtigen Stelle zurückdrückt, wodurch effektiv ein "Crush-Blocker" erzeugt wird, der die Crush-Sequenz der vorhergehenden Zahl unterbricht.
Zum Beispiel:
[1, 1, 1, 1, 1, 1]
gibt[4,2]
einmal zerkleinert,[1, 1, 1, 1, 2]
ergibt aber[2, 4]
Die Herausforderung besteht darin, zu bestimmen, wo genau ein Crush-Blocker platziert werden soll, damit das Zerkleinern des resultierenden Arrays das richtige Ergebnis liefert:
[2, 4]
erfordert einen Crush - Blocker (die gestreckte Zahl ist1
, wiederholt und[1, 1]
ist kürzer als[1,1,1,1]
), aber[4, 2]
und[2, 6]
erfordert nicht einen
die vorherige gestreckte Sequenz aufrufen und die obige Bedingung überprüft wird, ist die aktuelle Sequenz eine Wiederholung dern
Sequenz. Um die Crush-Sequenz der vorherigen Nummer zu unterbrechen, müssen wir den Crush-Blocker am Ende der zweitenn
Sequenz der aktuellen Nummer platzieren, um sie zu dehnen. Beispiel:[2, 8] => [(1, 1)=n, (1, 1) + (2) + (1, 1) + ...]
oder[4, 8] => [(1, 1, 1, 1)=n, (1, 1, 1, 1) + (1, 1, 2) + ...]
quelle
Gelee , 42 Bytes
Probieren Sie es online!
Volles Programm. Extrem ineffizient, funktioniert aber.
quelle
Python 2 ,
230228226 BytesArbeitet durch Iteration aller möglichen Listen mit der gleichen Summe wie die Eingabe einer. Entfernen Sie diejenigen, die in einem zerkleinerten Zustand nicht mit dem Eingabearray übereinstimmen, und wählen Sie das längste aus.
Edit: -2 Bytes durch Entfernen der
if
in der HauptfunktionBearbeiten: -2 Bytes durch Entfernen von zwei unnötigen eckigen Klammern
Probieren Sie es online!
Erläuterung
Hauptfunktion, verantwortlich für die Suche nach allen möglichen Lösungen und die Auswahl der längsten
Crush-Funktion, die prüft, ob y gleich einem der Crushs ist.
Generiere alle möglichen Permutationen mit der angegebenen Summe
quelle
05AB1E ,
4137 BytesProbieren Sie es online!
Port meiner Javascript-Lösung.
Erklärungen:
quelle