Il est notoire que déterminer si une machine de Turing s'arrête est indécidable, mais ce n'est pas nécessairement le cas pour les machines plus simples.
Une machine Foo est une machine avec une bande finie, où chaque cellule de la bande a un entier ou le symbole d’arrêt h
, par exemple:
2 h 1 -1
Le pointeur d'instruction commence par pointer vers la première cellule:
2 h 1 -1
^
A chaque étape, le pointeur d'instruction avance du nombre indiqué, puis annule ce nombre. Ainsi, après une étape, les 2
cellules avancent et se transforment 2
en -2
:
-2 h 1 -1
^
La machine Foo continue ainsi jusqu'à ce que le pointeur d'instruction pointe vers le symbole d'arrêt ( h
). Alors, voici la pleine exécution de ce programme:
2 h 1 -1
^
-2 h 1 -1
^
-2 h -1 -1
^
-2 h -1 1
^
-2 h 1 1
^
La bande est également circulaire. Par conséquent, si le pointeur d’instruction se déplace d’un côté à l’autre de la bande, il passe de l’autre côté, par exemple:
3 h 1 3
^
-3 h 1 3
^
-3 h 1 -3
^
-3 h -1 -3
^
-3 h -1 3
^
3 h -1 3
^
Une chose intéressante à propos de ces machines Foo est que certaines ne s’arrêtent pas, par exemple:
1 2 h 2
^
-1 2 h 2
^
-1 -2 h 2
^
-1 -2 h -2
^
-1 2 h -2
^
-1 2 h 2
^
Ce programme continuera à boucler dans ces quatre derniers états pour toujours.
Alors, écrivez un programme qui détermine si une machine Foo s'arrête ou non! Vous pouvez utiliser n’importe quel format d’entrée (raisonnable) que vous aimez pour les machines Foo, et vous pouvez choisir d’utiliser0
comme symbole d’arrêt. Vous pouvez utiliser deux sorties distinctes pour le cas où cela s’arrête et le cas où ce n’est pas le cas. Votre programme doit bien sûr générer une réponse dans un délai déterminé pour toutes les entrées valides.
C'est du code-golf , alors essayez de rendre votre programme aussi court que possible!
Cas de test
2 h 1 -1
Halts
3 h 1 3
Halts
h
Halts
1 1 1 1 h
Halts
2 1 3 2 1 2 h
Halts
3 2 1 1 4 h
Halts
1 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 h -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36
Halts
2 h
Does not halt
1 2 h 2
Does not halt
8 1 2 3 3 4 8 4 3 2 h
Does not halt
1 2 4 3 h 2 4 5 3
Does not halt
3 1 h 3 1 1
Does not halt
1 2 h 42
Does not halt
la source
1 2 h 42
(ne s’arrête pas)3 2 1 1 4 h
. Celui-ci s'arrête mais nécessite plus d'itérations que le double du nombre d'éléments.1 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 h -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36
:, qui s'arrête après 786430 étapes.Réponses:
C # (compilateur interactif Visual C #) , 71 octets
Essayez-le en ligne!
Je ne sais pas si ce qui suit est valide, car il nécessite un délégué personnalisé avec une signature de
unsafe delegate System.Action<int> D(int* a);
et doit être encapsulé dans ununsafe
bloc pour pouvoir être utilisé, mais le voici quand même:C # (.NET Core) , 64 octets
Essayez-le en ligne!
Cette fonction prend un int * et retourne une action; en d'autres termes, c'est une fonction au curry. La seule raison pour laquelle j'utilise des pointeurs est due à codegolf.meta.stackexchange.com/a/13262/84206, ce qui me permet d'économiser des octets en ayant déjà une variable déjà définie avec la longueur du tableau.
Sauvegardé 9 octets grâce à @quelqu'un
la source
1<<f
par2*f
pour sauvegarder un octet.Python 3 ,
6389 octetsEssayez-le en ligne!
Fonctionne également pour Python 2; un octet peut être sauvegardé dans Python 2 en remplaçant return par print et en ayant la fonction print sur stdout au lieu de return. R se tourne
True
pour s'arrêter etFalse
pour ne pas s'arrêter.Merci à @Neil et @Arnauld d'avoir noté que je devais vérifier plus longtemps avant de m'arrêter. Merci à @Jitse pour avoir signalé un problème avec
[2,0]
. Merci à @mypetlion pour avoir noté que les valeurs absolues des bandes pourraient dépasser la longueur de la bande.la source
x+x
c'est assez?[ 3, 2, 1, 1, 4, 0 ]
, qui s'arrête dans plus de 12 itérations.len(x)*x
[8,7,6,5,7,4,0,3,6]
2**len(x)
encore un peu court du maximum? Je calcule le nombre d'états commen*(2**n)
(avecn=len(x)-1
).Gelée ,
15 à11 octetsEssayez-le en ligne!
Un lien monadique qui prend l’entrée sous forme de liste d’entiers en utilisant 0 pour indiquer un arrêt. Renvoie 0 pour arrêter les entrées et 1 pour celles qui ne s’arrêtent pas.
Evite la nécessité de calculer le nombre d’itérations à cause de l’utilisation de
ÐL
celle-ci en boucle jusqu'à ce qu'aucun nouveau résultat ne soit vu.Merci à @JonathanAllan pour la sauvegarde d'un octet!
Explication
la source
N1¦ṙ⁸ḢƊÐLḢẸ
Python 3 , 91 octets
Essayez-le en ligne!
-40 octets grâce à JoKing et Jitse
la source
while
condition.Perl 6 ,
46 4336 octetsEssayez-le en ligne!
Représente stop by
0
et renvoie true si la machine s'arrête. Cela répète les2**(length n)
temps logiques , où si le pointeur se termine sur la cellule d’arrêt, il y reste, sinon il sera sur une cellule sans arrêt.Cela fonctionne car il n'y a queD'accord, il y a des États que cela, mais en raison des transitions possibles limitées entre les pointeurs (et donc les États), il y aura moins de 2 ** $ _ États ... Je pense2**n
des états possibles (en ignorant les cellules d'arrêt) pour la machine Foo, étant donné que chaque cellule non-stop n'a que deux états.Explication
la source
05AB1E ,
14 à13 octetsEssayez-le en ligne!
Prend l’entrée sous forme de liste d’entiers avec 0 comme instruction d’arrêt. Retourne 1 pour arrêter et 0 pour ne pas arrêter.
Merci à @KevinCruijssen pour la sauvegarde de 2 octets!
la source
ć
! J'attendais une explication dans l'espoir de jouer ma réponse au golf, mais vous m'y êtes battu, haha. ; p -1 octet en faisant le même golf que ma réponse cependant:g·F
to«v
( Essayez-le en ligne. )©®
place deDŠs
:«vć©(š®._}®_
( Essayez-le en ligne. )«v
àgoF
.Java 8,
787973 octetsPort direct de la réponse C # .NET de @EmbodimentOfIgnorance , assurez-vous donc de le réévaluer!
Merci à @Arnauld d' avoir trouvé deux bogues (ce qui s'applique également à d'autres réponses).
Il en résulte une
java.lang.ArithmeticException: / by zero
erreur lorsqu'il est capable de s'arrêter ou aucune erreur si ce n'est pas le cas.Essayez-le en ligne.
Explication:
la source
int*
(de codegolf.meta.stackexchange.com/a/13262/84206 )Haskell , 79 octets
Essayez-le en ligne!
Retours
True
pour arrêter les machines etFalse
autres. Saisie sous forme de liste, avec0
représentation d'un état d'arrêt.Suppose une version de GHC supérieure à 8,4 (publiée en février 2018).
la source
JavaScript (Node.js) ,
71 à67 octetsFondamentalement identique à la réponse C # .NET de @EmbodimentOfIgnorance
Sauvegarde de 4 octets grâce à @Arnaud
Essayez-le en ligne!
JavaScript (Node.js) , 61 octets
Cette version utilise
undefined
comme symbole d’arrêt et jette aTypeError: Cannot read property 'f' of undefined
lorsque la machine s’arrête et se termine silencieusement lorsque la machine ne s’arrête pas.Essayez-le en ligne!
la source
Scala , 156 octets
OMI encore golfable, mais ça me va pour le moment. Retours
0
pour non-arrêtFoo
et s1
pour arrêtFoo
. Prend l'entrée ena
tant queArray[Int]
, donch
est pris en tant que0
.Il est assez long à exécuter (environ 4 secondes pour tous les cas de test) en raison des multiples recherches sur un tableau complet que j'ai effectuées, ainsi
.deep
que de la création de copies ... Mais vous pouvez toujours l' essayer en ligne.la source
Perl 5
-ap
, 88 octetsEssayez-le en ligne!
la source
Attaché , 40 octets
Essayez-le en ligne!
Explication
Ceci effectue une seule itération de la machine Foo; il annule le premier membre, puis fait pivoter le tableau en fonction du premier élément (d'origine, non négatif) du tableau.
Periodic
appliquera cette fonction jusqu'à ce qu'un résultat en double soit accumulé. Une machine s'arrête ou entre dans une boucle infinie triviale. S'il s'arrête, le premier élément sera 0. Sinon, il sera différent de zéro.&N
est une manière amusante d’obtenir le premier élément d’un tableau numérique. Ensuite,Not
retournetrue
pour 0 (machines à l'arrêt) etfalse
pour toute autre chose (machines à l'arrêt).la source
Charbon de bois , 28 octets
Essayez-le en ligne! Le lien est vers la version verbeuse du code. Sorties utilisant la sortie booléenne par défaut de Charcoal, qui est
-
pour true et rien pour false. Explication:Initialise le pointeur d'instruction.
Boucle autant de fois qu'il y a d'états théoriquement possibles.
Annulez la valeur au pointeur d'instruction.
Soustrayez la nouvelle valeur du pointeur d'instruction. Les accès à la matrice de charbon de bois sont cycliques et émulent automatiquement le ruban circulaire de Foo.
À la fin de la boucle, indiquez si le programme s'est arrêté.
la source
Stax , 11 octets
Exécuter et déboguer
Il prend les entrées sous la forme d'un tableau entier, avec la
0
représentation de stop.Il sort
1
pour une0
machine à l' arrêt et pour une machine qui ne s'arrête pas.la source
Pyth , 12 octets
Suite de tests!
Utilise l'approche directe. Recurse jusqu'à ce que nous voyions la liste deux fois dans un état identique. Pour les programmes qui s’arrêtent, la liste finira par prendre la tête
0
car c’est là que s’arrête la récursivité. Pour les programmes qui ne s’arrêtent pas, la liste ne commence pas par le0
, mais se trouve dans un état dans lequel le processus serait périodique et, par conséquent, la machine Foo ne s’arrêterait pas.la source