Récemment, j'ai posté une question sur les jeux Diffy qui est restée sans réponse. C'est très bien, la question est vraiment difficile, mais je voudrais poser une question plus facile sur les jeux Diffy afin que nous puissions faire bouger les choses.
Comment fonctionne Diffy
Copié à partir de Find Diffy Games
Le jeu Diffy fonctionne comme suit: Vous commencez avec une liste d'entiers non négatifs, dans cet exemple, nous utiliserons
3 4 5 8
Ensuite, vous prenez la différence absolue entre les nombres adjacents
(8) 3 4 5 8
5 1 1 3
Ensuite, vous répétez. Vous répétez jusqu'à ce que vous réalisiez que vous êtes entré dans une boucle. Et puis généralement le jeu recommence depuis le début.
3 4 5 8
5 1 1 3
2 4 0 2
0 2 4 2
2 2 2 2
0 0 0 0
0 0 0 0
La plupart des jeux se terminent par une chaîne de tous les zéros, ce qui est considéré comme un état de perte, mais quelques rares jeux sont bloqués dans des boucles plus grandes.
Tâche
Étant donné l'état de départ d'un jeu Diffy, déterminez si le jeu atteint ou non un état de tous les zéros. Vous devez générer une valeur Truthy ou Falsy pour chacun des deux états. Ce qui correspond à ce qui n'a pas d'importance.
L'objectif est de minimiser le nombre d'octets dans votre source.
la source
1 1 0
est périodique, tout42 42 41
comme un tel état.n
est impaire, le jeu ne passe à zéro que si tous les nombres sont égaux. Si la longueur est une puissance de 2, elle va toujours à zéro.n
éléments et un maximumm
prend au plus desn * bit_length(m)
étapes. Donc,n*m
c'est aussi une limite supérieure. Une limite supérieure plus forte estt(n) * bit_length(m)
, oùt(n)
est la plus grande puissance de 2 qui est un facteur den
.Réponses:
Pyth, 6 octets
Suite de tests
Ce programme est très suave. 0 (faux) signifie tous les zéros, tout le reste (véridique) ne signifie pas tous les zéros.
Comment ça marche:
la source
Mathematica, 52 octets
Fonction pure prenant une liste d'entiers non négatifs en entrée et retournant
True
ouFalse
.Abs[#-RotateLeft@#]&
est une fonction qui exécute un tour du jeu diffy. (Techniquement, cela devrait l'êtreRotateRight
, mais la réponse ultime n'est pas affectée, et bon, octet libre.) DoncNest[...,#,R]
ExécuteR
tours du jeu diffy, puis1>Max@
détecte si le résultat est des zéros.Comment savons-nous combien de tours de jeu diffy
R
faire? Sim
est la plus grande valeur dans l'entrée, notez que nous ne produirons jamais un entier plus grand quem
le nombre de tours que nous faisons. Le nombre total de listes de longueurl
d'entiers non négatifs tous bornés parm
est(m+1)^l
. Donc, si nous effectuons des(m+1)^l
tours du jeu diffy, nous sommes assurés d'avoir vu une liste deux fois d'ici là, et nous serons donc dans la partie périodique du jeu. En particulier, le jeu se termine par tous les zéros si et seulement si le résultat des(m+1)^l
tours du jeu est la liste des zéros. Cette expression est ce quiMax[1+#]^Tr[1^#]
calcule.la source
Gelée , 13 octets
Sorties 0 (falsey) si l'état tout zéro sera atteint, sinon une valeur véridique (un entier positif) est retournée.
Essayez-le en ligne!
Utilise l'observation d'abord faite par Greg Martin que les nombres dans le tableau ne peuvent jamais quitter le domaine [0, m] où m est l'élément maximal dans l'entrée, donc effectuer (m + 1) l tours où l est la longueur de l'entrée sera suffire.
Comment?
la source
PHP, 144 octets
affiche 0 pour tout zéro et toute valeur entière positive pour vrai
Version en ligne
Étendu
la source
array_push
? Mais pourquoi ?$_GET
comme entrée, vous devez supposer qu'il contient une chaîne.?0[0]=1&0[1]=1&0[2]=0
ou?0[]=1&0[]=1&0[]=0
est un tableau de chaînes mais cela n'a pas d'importance. Mais vous avez raison, je pourrais le raccourcir avec?0=1&1=1&2=0
pourquoi pas àrray_push` Je suis sûr que vous ou Titus trouvez de meilleures façons de raccourcir cela.array_push($e,$e[$c=0]);
est tout simplement identique à$e[]=$e[$c=0];
et vous utilisez même déjà la syntaxe ($r[]=$n
). Vous l'utilisez déjàmax
maintenant, vous devez donc également le remplacerend($r)
par$n
car$n
est toujours égal àend($r)
l'exécution de l'écho.R (3.3.1), 87 octets
Renvoie zéro pour un jeu se terminant par tous les zéros et un nombre positif sinon.
exploite le même fait par Greg Martin et utilise le diff intégré pour faire la diff
la source
Röda , 80 octets
Essayez-le en ligne!
Non golfé:
la source
05AB1E , 13 octets
Renvoie 1 s'il se termine par des zéros et 0 sinon.
Essayez-le en ligne!
Explication
Utilise la limite supérieure des arrondis :
max(input)*len(input)
expliquée par xnor dans la section des commentaires.la source
J, 22 octets
Renvoie
0
(qui est effectivementfalse
en J) pour un jeu dégénéré se terminant par tous les zéros. Renvoie1
(true
) si la nième itération contient un nombre non nul, où n est égal au plus grand entier de la séquence d'origine multiplié par la longueur de la liste. Voir la réponse de Greg Martin expliquant pourquoi cela est vrai.Traduction:
*
>./
^:( )
#
multipliée par*
la plus grande valeur de la liste>./
:|&
de(- )
et1&|.
Exemples:
la source
JavaScript (ES6),
95 9290 octetsExplication
Fonction récursive qui s'appelle tant que le compteur (qui commence à la valeur maximale dans la liste plus un à la puissance de la longueur de la liste [
= (max + 1)**length
]) n'est pas nul. À chaque appel, le compteur est décrémenté et lorsqu'il atteint zéro, tous les éléments de la liste sont vérifiés par rapport à zéro. S'ils sont tous égaux à zéro, le programme retournetrue
etfalse
sinon.la source
PHP,
123115prendre une entrée via HTTP obtenir par exemple
?3&4&5&8
enregistre quelques octets.Imprime 1 s'il atteint tous les zéros ou rien d'autre.
prend la liste des arguments via la ligne de commande. J'ai l'impression que cela peut être joué encore plus loin (en regardant @Titus).
la source
Python 3.6, 101 octets
Prend un tuple de nombres et retourne False s'il se termine par des zéros et True s'il boucle.
la source
JavaScript (ES6),
8483 octetsRetourne
true
pour un jeu se terminant par tous les zéros,false
sinon.Tester
Afficher l'extrait de code
la source