Überblick
Einige von Ihnen kennen möglicherweise die Kolakoski-Sequenz ( A000002 ), eine bekannte selbstreferenzielle Sequenz mit der folgenden Eigenschaft:
Es ist eine Sequenz, die nur Einsen und Zweien enthält, und für jede Gruppe von Einsen und Zweien entspricht sie sich selbst, wenn Sie die Länge der Läufe addieren, nur der halben Länge. Mit anderen Worten, die Kolakoski-Sequenz beschreibt die Länge der Läufe in der Sequenz selbst. Dies ist die einzige Sequenz, die dies ausführt, mit Ausnahme der gleichen Sequenz, bei der die erste 1 gelöscht wurde. (Dies gilt nur, wenn Sie sich auf Sequenzen aus 1s und 2s beschränken - Martin Ender)
Die Herausforderung
Die Herausforderung ist, eine Liste von ganzen Zahlen gegeben:
- Ausgang ,
-1
wenn die Liste keine Arbeits Präfix der Kolakoski Sequenz ist. - Geben Sie die Anzahl der Iterationen aus, bevor die Sequenz erstellt wird
[2]
.
Das ausgearbeitete Beispiel
Verwenden Sie das bereitgestellte Bild als Beispiel:
[1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1] # Iteration 0 (the input).
[1,2,2,1,1,2,1,2,2,1,2] # Iteration 1.
[1,2,2,1,1,2,1,1] # Iteration 2.
[1,2,2,1,2] # Iteration 3.
[1,2,1,1] # Iteration 4.
[1,1,2] # Iteration 5.
[2,1] # Iteration 6.
[1,1] # Iteration 7.
[2] # Iteration 8.
Daher ist die resultierende Zahl 8
für eine Eingabe von [1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1]
.
9
ist auch in Ordnung, wenn Sie 1-indizieren.
Die Test Suite (Sie können auch mit Unteriterationen testen)
------------------------------------------+---------
Truthy Scenarios | Output
------------------------------------------+---------
[1,1] | 1 or 2
[1,2,2,1,1,2,1,2,2,1] | 6 or 7
[1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1] | 8 or 9
[1,2] | 2 or 3
------------------------------------------+---------
Falsy Scenarios | Output
------------------------------------------+---------
[4,2,-2,1,0,3928,102904] | -1 or a unique falsy output.
[1,1,1] | -1
[2,2,1,1,2,1,2] (Results in [2,3] @ i3) | -1 (Trickiest example)
[] | -1
[1] | -1
Wenn Sie verwirrt sind:
Wahrheit: Irgendwann werden zwei erreicht, ohne dass ein Zwischenschritt andere Elemente als 1
und enthält 2
. -Einkorn Enchanter 20 hours ago
Falsy: Endwert ist nicht [2]
. Zwischenbegriffe enthalten etwas anderes als etwas aus der Menge [1,2]
. Ein paar andere Dinge, siehe Beispiele.
Dies ist Code-Golf , die niedrigste Byteanzahl ist der Sieger.
-1
?[2]
bis ich den[2,2,1,1,2,1,2]
Testfall gesehen habe.1
und enthält2
.[1]
als Testfall hinzuzufügen .Antworten:
Haskell ,
12687797675 Bytes39 Bytes gespart dank Ørjan Johansen
Probieren Sie es online!
Dieser Fehler bei fehlerhafter Eingabe.
quelle
f
(und damit!
) kann eine Menge unter Verwendung lazy Produktion + verkürzt werdenspan
/length
anstelle von Akkumulatoren. Probieren Sie es online![1]
import Data.List;f l=length<$>group l
. (<$>
ist ein Synonym fürmap
hier.) Anstatt zwei verschiedene-1
Fälle zu haben, ist es auch kürzer, ein@(_:_:_)
Muster zu verwenden, um zu erzwingen, dass der Hauptfall nur mit der Länge> = 2 Listen übereinstimmt. Probieren Sie es online!05AB1E , 22 Bytes
Probieren Sie es online!
Erläuterung
quelle
[1,1,2,2,1,2,1,1,2,2,1,2,2,1,1,2,1,1]
SCALA, 290 (282?) Zeichen, 290 (282?) Bytes
Es hat mich sooo lang gekostet ... aber ich bin endlich fertig!
mit diesem Code:
Ich weiß nicht, ob ich das
var u=t
in die Bytes zählen soll, wenn icht
bedenke , dass ich es nicht während des Algorithmus verwende (die Kopie dient nur dazu,var
anstelle des Parameterst
, der alsval
- danke ScaLa - betrachtet wird, ein änderbares zu erhalten ). Bitte sag mir, ob ich es zählen soll.Hart genug. Probieren Sie es online!
PS: Ich habe darüber nachgedacht, es rekursiv zu machen, aber ich muss einen Zähler als Parameter der rekursiven "Unterfunktion" übergeben. Diese Tatsache veranlasst mich, zwei Funktionen zu deklarieren, und diese Zeichen / Bytes sind nichts als verloren.
EDIT: Ich musste ändern (?), Weil wir nicht sicher sind, ob wir den
[1]
Fall berücksichtigen sollen . Also hier ist der geänderte Code:Es ist nicht optimiert (ich habe ein Duplikat "out" für die gleichen Bedingungen: wenn ich
[2]
ankomme und wenn param[2]
getrennt behandelt wird).NEW COST = 342 (Ich habe den Titel nicht absichtlich geändert)
quelle
[1]
[2]
[1]
niemals[2]
und sollte daher -1 zurückgeben .JavaScript,
146142 BytesBeim ersten Versuch mit Code-Golf scheint es, dass das "Zurück" in der größeren Funktion ziemlich mühsam ist ...
Auch die Überprüfung von b = 1 und b = 2 nimmt einige Bytes in Anspruch ...
Hier ist der Code:
Erläuterung
Testdaten (unter Verwendung der angegebenen Testdaten)
Edit 1: 146 -> 142: Widerruf meiner Bearbeitung beim Reduzieren von Bytes, da dies die Ausgabe beeinflusst; und einige Änderungen an der letzten Anweisung
quelle
f=a=>{for(i=t=!a[0];a[1];)r=[],c=j=0,a.map(a=>{t|=a-1&&a-2;a-c&&(0<j&&r.push(j),c=a,j=0);j++}),(a=r).push(j),i++;return t||a[0]-2?-1:0^i}
Speichert 5 Bytes (for-Schleife statt while; Kommas vs geschweifte Klammern; && vs if). Sie können den Closure Compiler von Google ( closure-compiler.appspot.com ) verwenden, um diese Optimierungen für Sie durchzuführenGelee ,
2625222120 BytesProbieren Sie es online!
Dieser Code funktionierte erst mit 20 Bytes richtig und ich bemerkte es nicht einmal. es ist im
[2,2]
Testfall fehlgeschlagen . Sollte jetzt perfekt funktionieren.quelle
JavaScript (ES6),
1271269580 Byte0-indiziert. Wirft
"ReferenceError: X is not defined"
und"InternalError: too much recursion"
auf schlechte Eingabe.Testfälle
Code-Snippet anzeigen
quelle
Clojure, 110 Bytes
Ein Basic
loop
mit einer Vorabprüfung von Randfällen. Gibtnil
für ungültige Eingaben zurück. Ich wusste nicht,(= [2] '(2))
isttrue
: oquelle
Python 2, 146 Bytes (nur Funktion)
Gibt bei einer falschen Eingabe 0 zurück (ok, da 1-indiziert). Benutze es einfach so:
quelle
Mathematica, 82 Bytes
Function
die wiederholt{2}
durch das undefinierte SymbolT
, eine Liste von (einem oder mehreren)1
s und2
s mit der nächsten Iteration und alles andere mit,0
bis ein fester Punkt erreicht ist, ersetzt, dann gibt dieFirstPosition
des SymbolsT
im resultierendenFixedPointList
Minus zurück1
. Ausgabe ist,{n}
won
die (1
-indexierte) Anzahl von Iterationen ist, die benötigt werden, um{2}
nach dem Wahrheitsfall und-1+Missing["NotFound"]
dem Falschfall zu suchen.Wenn die Ausgabe
n
eher als sein muss{n}
, kostet es drei weitere Bytes:quelle
Python 2 ,
184 163156 BytesPython 2 , 156 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Gelee , 17 Bytes
Probieren Sie es online!
quelle
Python 2 , 122 Bytes
Probieren Sie es online!
Python 3 , 120 Bytes
Probieren Sie es online!
Erläuterung
Eine neue Sequenz (w) wird initialisiert, um die nächste Iteration der Reduktion zu speichern. Ein Zähler (c) wird initialisiert, um die Anzahl der Iterationen zu verfolgen.
Jedes Element in der Originalsequenz (den Originalsequenzen) wird mit dem vorherigen Wert verglichen. Wenn sie gleich sind, wird der Wert des letzten Elements von (w) um 1 erhöht. Wenn sie unterschiedlich sind, wird die Sequenz (w) um [1] erweitert.
Wenn w == [2] ist, wird der Zähler (c) zurückgegeben. Wenn die ursprüngliche (n) Sequenz (en) andere Elemente als 1 und 2 enthält, wird ein Wert von -1 zurückgegeben. Ist dies nicht der Fall, wird die Funktion rekursiv mit der neuen Folge (w) als (s) aufgerufen und der Zähler (c) um 1 erhöht.
quelle
def f(s,c=2,j=0,w=[1]):
, aber das ergibt ein anderes Ergebnis. Kann jemand erklären, warum das so ist?R, 122 Bytes
Besteht alle Testfälle. Löst ansonsten einen oder mehrere Fehler aus. Ich hasse Gültigkeitsprüfungen. Dieser Code hätte so gut gespielt werden können, wenn die Eingaben nett gewesen wären. Es wäre kürzer, selbst wenn die Eingabe eine Folge von 1 und 2 wäre, nicht notwendigerweise ein Präfix der Kolakoski-Folge. Hier müssen wir überprüfen, ob sowohl der Anfangsvektor (sonst wäre der Testfall
[-2,1]
bestanden) als auch der resultierende Vektor (sonst[1,1,1]
wäre bestanden).quelle
Ruby ,
81.77BytesProbieren Sie es online!
Bearbeiten: 4 Bytes durch Konvertieren in rekursives Lambda gespeichert.
Gibt 1-indizierte Anzahl von Iterationen oder 0 als Falsey zurück.
Verwendet die Chunk-Methode von Ruby Enumerable, die genau das tut, was wir brauchen - sie gruppiert aufeinanderfolgende Läufe mit identischen Zahlen. Die Längen der Läufe bilden das Array für die nächste Iteration. Die Iteration wird fortgesetzt, solange das Array länger als 1 Element ist und keine anderen Zahlen als 1 und 2 gefunden wurden.
quelle
Pyth , 45 Bytes
Probieren Sie es online!
Das ist wohl noch golfen. Es ist definitiv golfen, wenn es so
.?
funktioniert, wie ich es mir erhofft hatte (es ist eineelse
Struktur für das Innerste anstatt für das Äußerste)quelle
Perl 5
-p
, 71 BytesProbieren Sie es online!
1
-indexiert. Ausgaben0
für falsy.quelle