Jouons à un jeu à un joueur appelé sauter le tableau . Pour jouer, vous n'avez besoin que d'un tableau d'entiers, par exemple a
. Vous commencez à une certaine position i
et à chaque tour, vous sautez à une nouvelle position. À son tour n
,
- si
n
c'est pair, vous sautez en position absoluea[i] mod length(a)
, - si
n
est impair, vous sautez à la position relative(i + a[i]) mod length(a)
.
L'indexation du tableau commence à zéro. Vous pouvez compter le premier saut comme un tour 0
ou un tour 1
, ce qui donne un jeu différent. Puisque l'espace d'état du jeu est fini (votre coup est déterminé par votre position et la parité du nombre de tours), vous finirez bien sûr par entrer dans une boucle de longueur égale. Indique loop(a, i, b)
la longueur de cette boucle, lorsque le premier saut est compté comme un tour b
.
Contribution
Un tableau non vide a
d'entiers avec lesquels jouer.
Production
Le nombre maximum p
tel que, lorsque vous commencez sur une position i
et comptez le premier tour comme l'un 0
ou l' autre 1
, vous entrez finalement une boucle de longueur 2 * p
. En d'autres termes, votre sortie est le nombre
max { loop(a, i, b)/2 : i in [0 .. length(a)-1], b in [0,1] }
Règles
Vous pouvez donner une fonction ou un programme complet. Le plus petit nombre d'octets gagne et les failles standard sont interdites.
Cas de test
[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
est défini comme toujours positif (-1 mod 5 == 4
) contrairement à C. Est-ce le cas?mod
, qui donne toujours des résultats non négatifs.Réponses:
Pyth : 28 caractères (Python 2: 116 caractères)
Usage:
Essayez-le ici: Pyth Compiler / Executor
Il attend une liste d'entiers en entrée
[0,2,5,4,-9,0,-1,1,-1,1,-6]
Explication:
J'ai remarqué une propriété importante de la fonction
loop
: pour chacuni
il y a unj
, de sorte queloop(a,i,0) == loop(a,j,1)
et vice versa. Par conséquent, nous devons seulement calculer les valeursloop(a,i,b)
deb=0
.Preuve: Si le est un cycle
i -> j -> k -> ... -> z -> i
avecb = 0
, alors il existe le cyclej -> k -> ... -> z -> i -> j
avecb = 1
.Par conséquent, un script simple peut fonctionner de la manière suivante. Itérer sur tout
i
et essayer d'atteindrei
par le calcul itératifi = a[(i + a[i]) mod len(a)] mod len(a)
. Comme ce calcul peut se dérouler dans un cycle sansi
, nous annulons le calcul après leslen(a)
étapes. Ensuite, nous imprimons le cycle maximum.Une implémentation Python 2 ressemble à ceci ( 125 caractères }:
Pour l'implémentation de pyth, j'ai utilisé une approche légèrement différente. Pour chacun,
i
je calcule la liste des postes et cherchei
dans cette liste.édition: Python 2: 116 caractères
La solution de @proud haskeller était de quelques caractères plus courte que ma solution Python, j'ai donc dû la raccourcir un peu.
La différence est que je calcule le nombre de manière récursive plutôt qu'itérative.
la source
Python - 157
la source
len(a)
une variable et remplacez tous leslen(a)
s par le nom de cette variable, vous pouvez enregistrer certains caractères.t+=1;t%=2
->t^=1
etif t: j=(j+a[j])%z else: j=a[j]%z
->j=(t*j+a[j])%z
while c not in s[:-1]:
pourrait l'êtrewhile(c in s[:-1])-1:
.j
, car cette boucle affecte le contenu derange(z)
ài
au lieu de l'incrémenter. Remplacez simplementj
pari
pour enregistrer 4 caractères.Haskell,
120105cela génère une liste infinie pour chaque point de départ (pour des raisons de golf, nous itérons sur toutes les valeurs au lieu de tous les index, qui sont équivalents). puis il calcule le cycle de chaque liste (la durée du cycle
xs
estxs % []
).il utilise les observations de @ jakubes sur les cycles. parce qu'il fait 2 pas à la fois, nous n'avons pas besoin de diviser par 2 à la fin.
Edit : utilise maintenant l'astuce de @ MthViewMark pour supprimer les premiers
n
éléments afin de garantir un cycle avec le premier élément. au fait, j'ai réussi à jouer son algorithme aux112
personnages:la source
Haskell - 139 caractères
Exemples:
Cela utilise l'observation de @ jakube selon laquelle il suffit de vérifier la moitié des valeurs de départ, tout en effectuant 2 étapes par itération.
la source
where
le précédent]
. Avez-vous également essayé d'utilisercycle l!!i
au lieu del!!mod n(length l)
?b
et utiliser un protecteur de motif|n<-l a
pour éliminer lewhere
.Python, 160
La fonction de réponse est
j
.La fonction récursive
l
renvoie la longueur de boucle pour un tableau donné, le début et le premier tour, et la fonctionj
trouve le max.la source
lambda
.Mathematica,
189 162161 octetsSi les fonctions anonymes sont autorisées - 161 octets:
Sinon - 163 octets:
Exécuter ceci sur tous les cas de test:
Résulte en:
Python 2, 202 octets
DEMO
C'est presque un portage de ma réponse Mathematica.
la source
For
avec 3 arguments est généralement plus court queWhile
(puisque vous pouvez enregistrer sur un point-virgule devant leFor
).Mathematica,
113112 caractèresExemple:
la source
ised 82
Le premier argument ne compte pas dans la longueur (initialisation du tableau dans
$1
etb
initialisation dans$2
- sélectionnez le "jeu").la source