Lassen Sie uns ein Ein-Spieler-Spiel namens Jump the Array spielen . Zum Spielen benötigen Sie beispielsweise nur eine Reihe von ganzen Zahlen a
. Sie beginnen an einer bestimmten Position i
und springen in jeder Runde zu einer neuen Position. Am Turn n
,
- wenn
n
gerade, springt man zur absoluten Positiona[i] mod length(a)
, - Wenn
n
ungerade ist, springen Sie zur relativen Position(i + a[i]) mod length(a)
.
Die Array-Indizierung beginnt bei Null. Sie können den ersten Sprung als Zug 0
oder Zug zählen 1
, was ein anderes Spiel ergibt. Da der Zustandsraum des Spiels endlich ist (Ihr Zug wird durch Ihre Position und die Parität der Zugnummer bestimmt), werden Sie natürlich irgendwann eine Schleife von gerader Länge eingeben. Geben Sie loop(a, i, b)
die Länge dieser Schleife an, wenn der erste Sprung als Drehung gezählt wird b
.
Eingang
Ein nicht leeres Array a
von Ganzzahlen, mit denen das Spiel gespielt werden soll.
Ausgabe
Die maximale Anzahl p
, sodass Sie, wenn Sie an einer bestimmten Position beginnen i
und die erste Abbiegung als entweder 0
oder zählen 1
, schließlich eine Längenschleife eingeben 2 * p
. Mit anderen Worten, Ihre Ausgabe ist die Zahl
max { loop(a, i, b)/2 : i in [0 .. length(a)-1], b in [0,1] }
Regeln
Sie können eine Funktion oder ein vollständiges Programm angeben. Die kleinste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig.
Testfälle
[0] -> 1
[-213] -> 1
[1,3,12,-1,7] -> 1
[2,3,5,7,9,11,13,17,19] -> 2
[-2,3,-5,7,-9,11,-13,17,-19,23,-27] -> 3
[0,2,5,4,-9,0,-1,1,-1,1,-6] -> 4
mod
ist-1 mod 5 == 4
anders als in C als immer positiv ( ) definiert . Ist das der Fall?mod
, der immer nicht negative Ergebnisse liefert.Antworten:
Python : 28 Zeichen (Python 2: 116 Zeichen)
Verwendung:
Probieren Sie es hier aus: Pyth Compiler / Executor
Es erwartet eine Liste von Ganzzahlen als Eingabe
[0,2,5,4,-9,0,-1,1,-1,1,-6]
Erläuterung:
Mir ist eine wichtige Eigenschaft der Funktion aufgefallen
loop
: Für jedei
gibt es einj
, also dasloop(a,i,0) == loop(a,j,1)
und umgekehrt. Daher müssen wir nur die Werteloop(a,i,b)
für berechnenb=0
.Beweis: Wenn das ein Zyklus
i -> j -> k -> ... -> z -> i
mit istb = 0
, dann existiert der Zyklusj -> k -> ... -> z -> i -> j
mitb = 1
.Daher kann ein einfaches Skript folgendermaßen funktionieren. Iteriere über alles
i
und versuche esi
durch iteratives Rechnen zu erreicheni = a[(i + a[i]) mod len(a)] mod len(a)
. Da diese Berechnung ohne einen Zyklus ablaufen kanni
, brechen wir die Berechnung nachlen(a)
Schritten ab. Dann drucken wir den maximalen Zyklus.Eine Python 2- Implementierung sieht folgendermaßen aus ( 125 Zeichen ):
Für die Pyth-Implementierung habe ich einen etwas anderen Ansatz gewählt. Für jeden
i
berechne ich die Liste der Positionen und suchei
in dieser Liste.Bearbeiten: Python 2: 116 Zeichen
Die Lösung von @proud haskeller war einige Zeichen kürzer als meine Python-Lösung, daher musste ich sie ein wenig kürzen.
Der Unterschied ist, dass ich die Zahl rekursiv statt iterativ berechne.
quelle
Python - 157
quelle
len(a)
eine Variable eingeben und allelen(a)
s durch den Namen dieser Variablen ersetzen , können Sie einige Zeichen speichern.t+=1;t%=2
->t^=1
undif t: j=(j+a[j])%z else: j=a[j]%z
->j=(t*j+a[j])%z
while c not in s[:-1]:
könnte seinwhile(c in s[:-1])-1:
.j
, da diese Schleife den Inhalt von zuweistrange(z)
,i
anstatt ihn zu erhöhen. Ersetzen Sie einfachj
miti
zu speichern 4 Zeichen.Haskell,
120105dies erzeugt eine unendliche Liste für jeden Startpunkt (aus Golfgründen iterieren wir über alle Werte anstelle aller Indizes, die äquivalent sind). dann berechnet es den Zyklus jeder Liste (die Zykluslänge von
xs
istxs % []
).es verwendet @ jakubes Beobachtungen über Zyklen. weil es 2 Schritte auf einmal macht, müssen wir am Ende nicht durch 2 teilen.
Bearbeiten : Verwenden Sie jetzt den @ MthViewMark-Trick zum Löschen der ersten
n
Elemente, um sicherzustellen, dass Sie einen Zyklus mit dem ersten Element haben. Übrigens habe ich es geschafft, seinen Algorithmus auf112
Charaktere zu beschränken:quelle
Haskell - 139 Zeichen
Beispiele:
Dies nutzt die Beobachtung von @ jakube, dass Sie nur die Hälfte der Startwerte prüfen müssen, während Sie 2 Schritte pro Iteration ausführen.
quelle
where
zum vorherigen zerquetschen]
. Haben Sie auch versucht,cycle l!!i
anstelle von zu verwendenl!!mod n(length l)
?b
und einen Musterschutz verwenden, um das|n<-l a
zu beseitigenwhere
.Python, 160
Funktion zur Beantwortung ist
j
.Die rekursive Funktion
l
gibt die Schleifenlänge für ein bestimmtes Array, Start und erste Runde zurück, und die Funktion ermitteltj
die max.quelle
lambda
.Mathematica,
189 162161 BytesWenn anonyme Funktionen erlaubt sind - 161 Bytes:
Ansonsten - 163 Bytes:
Laufen dies auf allen Testfällen:
Ergebnisse in:
Python 2, 202 Bytes
DEMO
Dies ist fast eine Portierung meiner Mathematica-Antwort.
quelle
For
mit 3 Argumenten ist in der Regel kürzer alsWhile
(da man vor dem Semikolon speichern kannFor
).Mathematica,
113112 ZeichenBeispiel:
quelle
ised 82
Das erste Argument zählt nicht zur Länge (Array-Initialisierung in
$1
undb
Initialisierung in$2
- wählen Sie das "Spiel").quelle