Un défi qui, selon moi, serait très intéressant est de faire appel à un interprète pour une langue complète de Turing de votre choix.
Les règles sont simples:
- Vous pouvez utiliser n’importe quel langage pour créer cet interprète, même s’il est plus récent que ce défi.
- Vous pouvez utiliser n'importe quel langage complet de Turing tant qu'il n'est pas identique à celui avec lequel vous l'écrivez.
- Vous ne pouvez pas simplement évaluer du code, par exemple, utiliser des fonctions eval.
- Une explication de la façon dont vous avez abordé cette question sera utile mais pas obligatoire.
- Cela sera noté en octets.
- Chaque soumission doit fonctionner pleinement, ce qui signifie que chaque caractéristique de la langue choisie doit être présente.
Pour être dit simplement:
Votre tâche consiste à créer un interprète de travail pour n’importe quelle langue complète de Turing avec la langue de votre choix.
Bonne chance!
code-golf
interpreter
Arodebaugh
la source
la source
eval
solutions triviales .eval
commandes / fonctions, car certaines langues ont des fonctions intégrées pour évaluer le code dans une autre langue.Réponses:
Brachylog (2) → Problème de correspondance , 9 octets
Essayez-le en ligne!
L'entrée est une liste de listes de chaînes. (Dans le problème de correspondance Post tel que défini sur Wikipedia, les listes internes ont deux éléments chacun, bien que ce programme puisse en réalité gérer une généralisation à un nombre quelconque d'éléments.) une solution est trouvée. On sait que le problème de correspondance avec la poste est capable de simuler une machine de Turing, et que les solutions qui en découlent sont donc complètes. Si elle est exécutée comme une fonction plutôt que comme un programme, elle produit également un résultat significatif.
Le programme dans le lien TIO ci-dessus est
[["a","baa"],["ab","aa"],["bba","bb"]]
, que j'ai copié de Wikipedia. La solution (que le programme trouve assez rapidement) est["bbaabbbaa","bbaabbbaa"]
.Explication
C’est quasiment une traduction directe du problème de correspondance de Post avec Brachylog.
Fondamentalement, nous créons une liste composée de copies répétées de l'entrée (aussi peu que possible, ce qui signifie que nous ne manquons aucune possibilité lorsque nous le forçons), prenons un élément de chaque copie, puis concaténons les éléments correspondants (comme dans la correspondance Post problème).
la source
~dp
(ce qui ne signifie pas tout à fait la même chose mais est assez proche pour être encore Turing-complete), sauf que l'interprète Brachylog ne sait pas encore comment inverserd
.Jelly → "Ajouter minimum à transposer",
5 à4 octetsEssayez-le en ligne! (exécute une seule itération, pour éviter les délais d'attente)
Une construction très simple de Turing-complete: nous prenons une matrice carrée comme programme et bouclons pour toujours, en identifiant la rangée lexicographiquement la plus petite, puis en augmentant chaque élément de la première ligne par le premier élément du lexicographiquement le plus petit, chaque élément de la deuxième ligne par le deuxième élément du plus petit lexicographe, et ainsi de suite. (Le programme Jelly est "
+"
ajoute les éléments correspondants {de l'entrée et}Ṃ
le minimum {de l'original},ẞ
boucle"; il s'agit d'un octet plus court que mon programme précédentZ+ṂZß
, qui faisait exactement la même chose. J'aurais clairement dû me concentrer sur le golf La gelée, pas seulement le golf dans la langue implémentée.)La langue résultante est Turing-complete pour la même raison que Kangaroo.. Le premier élément de chaque ligne agit comme un nombre de sauts (bien que, au lieu du nombre de sauts de chaque commande, il augmente le nombre de sauts de chaque commande lorsqu'il est exécuté et recherche la commande avec le plus petit nombre de sauts. que les commandes avec zéro sauts compte, cela revient à la même chose). Nous nous assurons que ce premier élément est supérieur aux autres éléments (qui représentent le nombre de fois que chaque commande apparaît dans le multiset de chaque commande), en nous assurant ainsi que la première ligne n'est jamais le minimum; le reste de la première ligne peut être un déchet. Le seul problème qui reste est de modéliser la façon dont les commandes avec un nombre de sauts égal s'exécutent de manière cyclique, mais nous pouvons le faire en multipliant tous les comptes de saut par une grande constante, puis en ajoutant un petit "initial". sauter compte jusqu'à la première colonne pour servir d'égalité. Cela nous donne un tie-break de "première commande non compressée exécutée", et non pas "des commandes non programmées exécutées cycliquement en séquence", mais la construction de complétude de Turing pour Kangourou ne se soucie pas de cette différence.
la source
Mathematica interprétant le jeu de la vie de Conway, 64 octets
Le jeu de la vie de Conway est connu pour être complet de Turing; et les automates cellulaires sont la véritable obsession de Stephen Wolfram.
CellularAutomaton@{224,{2,{t={2,2,2},{2,1,2},t}},{1,1}}
est une règle qui transforme un tableau bidimensionnel de 0 et de 1 en une étape du jeu de la vie de Conway. (Je pense que le comportement par défaut est enveloppé par cette matrice autour de ses bords, donc est vraiment un tore discret.)~Nest~##&
Transforme cette règle dans une fonction qui, lorsqu'elle est administrée un état de bord initial (de dimensions quelconques) et un nombre entiern
d'arguments, délivre en sortie le résultat desn
itérations de la règle du jeu de la vie.Pour votre propre plaisir, vous pouvez utiliser la version enveloppée
et faites défiler votre chemin à travers 100 générations sur un tableau 50x50.
la source
Tortue interprétant CT , 49 octets
Je pourrais peut-être jouer au golf cette
En outre, cela ne produit rien d’utile. il ne fait que s'arrêter si et seulement si le programme CT donné est arrêté.
c’est celui que j’ai fait il ya quelque temps en fait (puis en golfant maintenant)
Comment ça marche:
Turtlèd utilise des cellules de grille. Quand je dis "écris quelque chose sur la grille", je veux dire qu'un groupe de caractères contigu est placé sur la grille. Exemple
sur le programme
les données sont entrées en premier:
c'est essentiellement un programme pour chats. il écrit l'entrée sur la grille.
alors les commandes sont entrées:
ce qu'il fait avec ces commandes:
ces commandes sont des "productions". si le bit de données le plus à gauche est 1, la production est copiée à la fin de la chaîne de données. sinon rien ne se passe. ensuite, le bit de données le plus à gauche est supprimé et il utilise la production suivante avec le prochain bit de données le plus à gauche. le programme s'arrête lorsqu'il n'y a pas de bits dans la chaîne de données. Une façon de faire ces productions est de traiter les bits et la fin des productions séparément. C'est ce que fait notre programme. il copie séparément les bits de la chaîne de commande jusqu'à la fin de la chaîne de données et supprime séparément les bits de la datastring
sur comment ce programme le fait. après avoir entré les commandes, le pointeur tortue / grille revient au bit le plus à gauche du datastring. il passe ensuite dans une boucle
ce qu’il fait dans cette boucle, c’est qu’il monte du datastring le plus à gauche et écrit le caractère de commande en cours (u.). si c'est le cas, la fin d'une production, il descend et supprime le bit de données le plus à gauche situé en dessous et remonte (
(;d' u)
). alors, dans tous les cas, il descend d'un (d
). si le bit n’a pas été supprimé, cela signifie qu’il doit vérifier s’il convient de copier un bit à partir des commandes à la fin. ainsi, si ce caractère qui est ou était le bit de donnée le plus à gauche est un 1, il se déplacera à la fin de l'extrémité droite de la chaîne de données, copiera le bit de la chaîne de commande et reviendra dans l'espace à gauche des données les plus à gauche. bit ((1[ r].[ l])
). maintenant, c'est soit sur le bit de donnée le plus à gauche, qui était un zéro, soit à gauche du bit de donnée le plus à gauche. alors, on bouge bien si sur un espace (( r)
). ensuite, le pointeur de commande est incrémenté, nous allons donc écrire la prochaine commande lors de la prochaine itération de la boucle. S'il n'y a plus de datastring, cela signifie que nous serons sur un espace et la boucle se terminera. sinon, nous réexécutons la boucle.la source
Perl → Variante Trois étoiles , 26 + 1 = 27 octets
Essayez-le en ligne! (Ce lien contient un en-tête qui quitte le programme après un nombre défini d'itérations (pour que TIO ne s'éteigne pas) et pour afficher l'état interne à chaque itération (afin qu'il fasse une chose observable).)
Courez avec
-a
(pénalité de 1 octet, comme vous pouvez l’intégrer avant-M5.010
de produire-aM5.010
).Plus précisément, cela implémente Three Star Programmer dans lequel les commandes sont séparées par des espaces et aucun commentaire n'est autorisé dans le fichier, sans extensions d'E / S. (Ces modifications ne font évidemment aucune différence pour la complétude en langue de Turing, bien sûr.) Il n’ya pas de preuve de complétude en ligne pour Three Star Programmer en ligne, mais elle est complète (j'ai partagé un croquis de preuve de Turing). avec les autres esoprogrammeurs, mais a arrêté de travailler sur la langue lorsque j’ai découvert qu’il était en fait assez facile de programmer une fois que l’on avait surmonté le choc initial).
Le programme n'a pas vraiment besoin de beaucoup d'explications; Three Star Programmer a une spécification très simple, qui en est une traduction directe. Les seuls points subtils:
@F
est l’entrée du programme sous forme de tableau (c’est une conséquence de-a
); etredo
répétera le programme dans son intégralité, comme dans une boucle implicite (également une conséquence de-a
).la source
Assemblage x86 (syntaxe Intel / MASM) - Brainfuck 2127 octets.
Golf encore capable
la source
Pip interprétant les systèmes de balises cycliques , 16 octets
Prend les productions du système de balises en tant qu'arguments de ligne de commande et la chaîne de données initiale de stdin.
Le code ci-dessus est un peu difficile à vérifier car il ne produit aucune sortie (le seul comportement observable est donc "se termine" ou "ne se termine pas"). Par conséquent, voici une version non golfée qui sort la chaîne de données après chaque étape et se termine après 20 étapes pour que TIO n'ait pas à traiter des tonnes de sorties de boucles infinies: essayez-le en ligne!
Systèmes de balises cycliques
Les systèmes de balises cycliques constituent un modèle informatique extrêmement simple mais complet de Turing . Ils consistent en une liste de productions qui définissent des opérations sur une chaîne de données . Les productions et la chaîne de données sont composées de 1 et de 0.
A chaque étape, le caractère le plus à gauche de la chaîne de données est supprimé.
Dans les deux cas, la production actuelle passe à la production suivante de la liste, de manière cyclique: si nous en étions à la dernière production, nous passons à la première. L'exécution continue jusqu'à ce que la chaîne de données soit vide.
Explication
la source
1
source: esolangs liens vers cette arxiv.org/abs/1312.6700 . Je vais bientôt modifier ma réponse, et si cela aide votre réponse, vous devriez (votre contribution semble assez amusante en fait)Fonctions de Collatz généralisées itérées -> Python 2, 46 octets
Appelez cette fonction avec une liste de m-1 a et b, la valeur de départ x et le diviseur m, qui constituent collectivement un "programme" pour l'IGCF. Plutôt que de prendre un troisième tableau pour indiquer sur quels modules s'arrêter, ceci s'arrête simplement chaque fois que le module est m-1. Cette simplification signifie que la conversion d’un programme Fractran donné en cette variante peut demander un effort supplémentaire, mais elle enregistre quelques octets dans l’interpréteur.
Essayez-le en ligne! Ce TIO montre comment ajouter 5 + 5 à cette langue. Le programme a = [3], b = [0], m = 2 est additionné et, à partir de 7776 = 2 ^ 5 * 3 ^ 5, donne finalement 59049 = 3 ^ 10.
la source
Variante ResPlicate -> Python 2, 47 octets
Cette fonction interprète une variante de ResPlicate
La dernière modification signifie que certains programmes ResPlicate (qui remplissent la première condition) ne se comporteront pas de la même manière dans cette variante, mais heureusement, les interpréteurs BCT n’ont pas besoin de la fonctionnalité supprimée et la langue reste donc TC.
Essayez-le en ligne! Ce TIO contient une impression pour montrer que cela fonctionne, un en-tête qui tue le programme au bout d’une seconde et un exemple qui parvient à générer plus de sorties que ce que TIO peut gérer en une seconde.
la source
l=input()
? Serait un octet plus court.Perl
-a
→ machine I / D , 24 octetsEssayez-le en ligne! (contient un en-tête qui imprime l'état interne et s'arrête après 10 itérations, afin que le comportement soit observable)
À propos de la langue
Ces derniers jours, j'ai travaillé sur la machine I / D , une de mes dernières idées pour des langages de programmation très simples. Cela fonctionne comme suit: le stockage de données consiste en une RAM non limitée, initialement tous des zéros. Chaque élément peut stocker un entier non lié (bien qu'en pratique, la plupart des programmes d'ordinateur I / D ne stockent que de petits entiers dans la plupart d'entre eux, et utilisent les entiers non bornés uniquement comme moyen d'adresser des cellules avec de grandes adresses). Il y a aussi un pointeur de données, qui pointe vers une cellule (c'est-à-dire que l'adresse est stockée sous forme de cellule); c'est initialement aussi zéro.
Il n'y a que deux commandes:
I
: Incrémente la cellule sur laquelle pointe le pointeur de données. (Le pointeur de données lui-même reste inchangé.)D
: Déréférencer le pointeur de données, c'est-à-dire lire la valeur de la cellule vers laquelle pointe le pointeur de données. Puis stockez la valeur résultante que vous avez lue dans le pointeur de données.L'exécution exécute simplement le programme dans une boucle à plusieurs reprises, pour toujours.
Il est assez surprenant qu'un langage aussi simple soit Turing-complete. Je m'efforce donc de le prouver. Voici la preuve . C'est assez similaire à (mais plus simple que) la preuve de Three Star Programmer, un langage très similaire (et en fait, cette soumission utilise le même "shell" OISC de base autour du programme, ne différant que par les instructions réellement mises en œuvre).
A propos du programme
Usage
L'entrée doit être donnée sur l'entrée standard. Il s'agit d'un programme d'ordinateur I / D sans commentaires, utilisant la syntaxe RLE / OISC. (La machine I / D a deux syntaxes équivalentes différentes, mais pour golfiness ce programme ne prend en charge que l'une d'entre elles.) Dans cette syntaxe, un programme est une séquence de nombres en décimal, représentant la longueur des exécutions de
I
commandes entreD
commandes. (Vous pouvez spécifier deuxD
commandes consécutives ou plus en plaçant une "série deI
commandes 0 " entre elles, la syntaxe est donc très générale.)Explication
Comme on peut le voir dans le programme, cela n’implémente pas les commandes
I
etD
individuellement. En fait, il s’agit d’un interprète (très légèrement) optimisant (uniquement parce que c’est plus court pour écrire de cette façon). La clé est de voir qu'une série de n commandes d'incrémentation incrémente la cible du pointeur de données n fois, c'est-à-dire lui ajoute n ; et une série de 0 commandes d’incrémentation peuvent également être implémentées de cette façon, car l’ajout de 0 à la mémoire n’a aucun effet. Ainsi , l'opération que nous mettons en œuvre est en fait d'alterner entre la mise en œuvre d' une exécution Of-I
s et unD
. Ou en d'autres termes, "add nà la valeur indiquée par le pointeur de données (en la mémorisant dans la valeur indiquée par le pointeur de données), puis lisez la valeur indiquée par le pointeur de données et stockez-la dans le pointeur de données ". C'est clairement plus détaillé que nécessaire. pour être, et nous pouvons simplifier davantage ceci en "ajoutant n à la valeur pointée par le pointeur de données, puis stockons cette valeur à la fois dans la cible du pointeur de données et dans le pointeur de données lui-même".Cela constitue donc le cœur de notre programme. Nous utilisons un tableau
$a
pour stocker la RAM, et en$p
tant que pointeur de données (indexation dans le tableau):Perl interprète commodément les éléments non-initialisés du tableau comme étant 0 quand ils sont traités comme des nombres, de sorte que le tableau sera initialisé par zéro à zéro pour nous sans qu'aucun code explicite ne soit nécessaire à cet effet. (Un problème potentiel est l'exactitude numérique lorsque les nombres deviennent grands. Cependant, cela ne se produira que si la quantité de la matrice utilisée dépasse l'espace d'adressage de la machine (les entiers Perl sont suffisamment grands pour contenir des pointeurs), ce qui ne peut pas arriver sur une machine idéalisée.)
Enfin, tout ce que nous avons à faire est de placer ce programme en boucle. La
for@F
boucle, combinée à l'-a
option de ligne de commande, parcourt les champs d'entrée standard (la définition par défaut de "champ" se scinde ici sur des espaces). Laredo
boucle place le programme entier dans une boucle implicite (autre que, commodément, la lecture d'une entrée standard), ce qui entraîne l'exécution répétée du programme dans une boucle, comme requis par la sémantique de la machine I / D.la source
-a
'. codegolf.meta.stackexchange.com/a/14339/9365Système Jelly → 2-Tag , 8 octets
Essayez-le en ligne!
J'ai une prime en faveur des langues pratiques, mais je pense que je pourrais tout aussi bien essayer de gagner la tâche initiale alors que j'y étais (car je ne peux pas gagner ma propre prime).
Implémente une variante des systèmes de balises sans état d'arrêt, car elle n'est pas nécessaire pour la complétude de Turing. Les états sont numérotés à partir de 1, consécutivement, et la chaîne initiale précède le programme.
Par exemple, Wikipedia donne un exemple d'un système de balise {
a
,b
,c
}, {a
→bc
,b
→a
,c
→aaa
} avec chaîne initialeaaa
; dans ce format d'entrée, qui est[1,1,1]
,[[2,3],[1],[1,1,1]]
. (Les systèmes de balises n'ont pas de syntaxe fixe, et cela semble être un moyen raisonnable de le faire.)Le lien TIO a un ajout
Ṅ
("write internal state et un newline to stdout") afin de montrer que le programme fonctionne réellement.Explication
la source
BF / P "implémenté dans une machine de Turing, 842 octets
Table de transition (liée en raison de la longueur)
Table de transition, version moins golfée
Simulateur de machine de turing j'ai utilisé
Cela ne va certainement pas gagner de prix pour la longueur, mais c'est quelque chose que j'ai toujours voulu faire, car BF est si similaire à une machine de Turing. Chaque cellule stocke une valeur de
0x0
-0xF
. La largeur est cependant loin que le site Web de Turing Machine puisse aller sans bloquer votre navigateur. Les fonctions,
et.
(entrée et sortie) ne sont pas définies, donc c'est un peu plus comme P "que vrai BF.Pour l’exécuter, collez le tableau de transition dans le simulateur de Turing Machine, définissez l’entrée sur du code BF, puis appuyez sur Exécuter.
La bande de la MT stocke à la fois le code BF et les données BF, avec un seul espace au milieu. Il garde une trace de sa position dans le code en modifiant le caractère en cours d’exécution (
[
->(
, etc.) et sa position dans les données avec un^
en face de la cellule. Une fois qu’il a lu un caractère de commande, il se déplace jusqu’à atteindre le curseur, déplace d’une cellule à la droite et exécute la fonction appropriée. Ensuite, il retourne en cherchant l'un des caractères de commande "modifiés" dans le code BF et passe au suivant en répétant tout le processus. Une fois qu'il est à court de code, il s'arrête.Le meilleur moyen de comprendre son fonctionnement consiste à exécuter la version sans golf, à la mettre en mode pas à pas et à regarder quelles lignes mènent à quelles autres et ce que fait chaque état / bloc de lignes.
Les versions golfée et non-golfée sont exactement identiques en ce qui concerne leur fonctionnement, mais la version non-golfée a des noms plus conviviaux et est divisée en sections.
la source
C implémentation de la (2,3) machine de Turing ,
236205 octets (46 demoins si vous ne vous souciez pas des entrées fastidieuses)Merci à Appleshell pour -11 octets, à VisualMelon pour -12 octets et à Johan du Toit pour -7 octets.
CeilingCat a créé une version qui utilise seulement 144 octets, voir ici .
(J'ai ajouté quelques sauts de ligne ici pour que vous n'ayez pas à faire défiler, mais normalement, la plupart d'entre eux seraient supprimés)
Essayez-le en ligne!
Pour l’utiliser: Entrez une chaîne de 256, zéro et deux au maximum pour initialiser la bande. Toute valeur non initialisée sera zéro. (Des valeurs autres que 0, 1 et 2 peuvent entraîner un comportement indéfini.) Le programme effectuera une itération sur 256 étapes. Le nombre d'étapes sur lesquelles il est itéré peut être augmenté en modifiant le code, mais cela nécessite évidemment plus de caractères.
C'est une assez longue entrée, mais c'est la première fois que je fais l'une de ces choses et je n'ai pas utilisé de langage de golf dédié. Je me suis beaucoup amusé, même si cela a été plus long que prévu.
Un grand nombre d'octets concernent les entrées et les sorties et j'ai perdu 42 octets en le faisant accepter 0, 1 et 2 au lieu de NUL, SOH, STX. (Pour changer cela, supprimez-le
k;
de l'avant etfor(;k<256&&d[k];)d[k++]-=48;
de la deuxième ligne.)La table de transition, en particulier la ligne
*p=-t*t+(2-s)*t+1+s;
(qui définit les valeurs sur la bande) pourrait probablement être davantage compressée.la source
k,j;c s,d[256];
(int
est implicite en C, vous pouvez également passeri
à la déclaration globale pour économiser 3 octets de plus)k++
et en supprimant les{}
sauvegardes, vous épargnez quelques octets de plus:for(;k<256&d[k];)d[k++]-=-48;
Parce qu’ilj
s’agit d’un chronomètre (valeur jamais utilisée), vous pouvez le remplacer (eti
)k
en comptant à rebours: vous savezk==256
après la première boucle, compte à rebours jusqu'à zéro dans la secondefor(;k>0;)
, qui laissek==-1
, alors la dernière boucle peut devenirfor(;++k<256;)
. (Avertissement: je joue habituellement au golfC#
, mais cela a semblé compiler).k<256&&d[k]
, pas&
, card[k]
était évalué àk==256
. De plus, commek
il n'était plus garanti d'être256
après cette boucle, je devais le réinitialiser par la suite afin de garantir 256 étapes. (Si vous (c'est-à-dire VisualMelon) avez d'autres suggestions, nous devrions probablement les mettre en discussion afin d'éviter les commentairesRöda implémentant Fractran ,
114112106 octets1 octet enregistré grâce à @fergusq en réorganisant les paramètres
Essayez-le en ligne!
Appelez la fonction comme ceci:
f reference_to_input program
. La sortie sera stockée à l'emplacement du fichierinput
.la source
e[1]
est redondant. Vous pouvez également enregistrer un octet en changeant l' ordre des paramètres:f&n,a
.f&n,a
tour, et j'étais sur le point de supprimer ce point-virgule lorsque vous avez commenté :)Clojure,
8281 octets (machine de Turing)Mise à jour: suppression d'un espace de
t{} s
.Implémente la machine de Turing en tant que boucle et renvoie la bande lorsque l'état d'arrêt est atteint. Dans les règles de transition d'état, cela est indiqué par la désactivation de l'état de transition. Cette settins
N
ànil
et la suivanteif-let
annulerait que la transition d'état correspondant n'a pas été trouvé à partir de l'entrée de hachage carte%
. En réalité, toute valeur pour cet état fera l'affaire, telle que:abort
0 ou -1.Ungolfed avec un exemple de castor occupé à 3 états et à 2 symboles de Wikipedia .
Essayez-le en ligne .
Sur un noyau unique de 6700K, le castor occupé à 5 symboles et à 2 symboles (47,1 millions d'étapes) est exécuté en environ 29 secondes, soit 1,6 million d'étapes / seconde.
la source
M → Astuce , 4 octets
Essayez-le en ligne!
Le lien TIO ajoute un pied de page pour appeler la fonction avec l'exemple de programme Tip présenté sur la page Esolang (le "wrapper automatique" de M. pour appeler des fonctions comme s'il s'agissait de programmes qui ne peuvent pas gérer des nombres rationnels ou à virgule fixe, Vous ne savez pas comment le dire, je dois donc transformer la fonction en un programme complet à la main pour pouvoir l’exécuter.)
Cela affiche en fait une sortie de débogage utile. le programme ne peut pas être écrit sur 3 octets en M car un programme composé de trois dyades au moins déclenche un cas particulier dans l'analyseur. Il a donc fallu ajouter une commande supplémentaire pour éviter ce cas particulier. Le faire
Ṅ
(imprimer avec une nouvelle ligne) lui donne au moins un but utile.ı
N'implémente pas d'E / S (autre que stop / no-stop). I / O est une extension de Tip (ne faisant pas partie du langage lui-même) et n'est pas nécessaire pour la complétude de Turing.
Explication / fond
[1,2,3]
[1,2,3,1,2,3,1,2,3,…]
ḅ
Alors j'ai regardé en arrière et réévalué un peu. Existe-t-il des opérations que nous pourrions utiliser à la place de l'évaluation polynomiale? Idéalement, ceux qui sont commutatifs, afin que nous n'ayons pas à nous soucier de l'ordre des arguments? Peu de temps après, j'ai compris que les fonctions de Collatz étaient plus complexes que nécessaire.
Et bien sûr, contrairement à la conversion de base (
ḅ
), multiplication (×
) est commutative, donc l'ordre dans lequel les arguments sont placés n'a pas d'importance. Il suffit donc d'écrire×ị
, puis de placer le programme dans une récursion infinie avecß
, et nous avons un langage complet de Turing. Droite?¹×ịß
¹
¹
Ṅ
est un bon choix car il produit une sortie de débogage utile.Trois octets sont-ils possibles? À moins que je ne manque quelque chose, pas avec ce choix spécifique de langage implémenté et implémenté, mais à ce stade-ci, cela semble sûrement possible, car il y a tant de façons de le faire en quatre et autant de Turing-complete langues que vous pouvez implémenter.
la source
ḋ
etṙ
plutôt que×
etị
; Le langage qui en résulte n'est pas tout à fait le même langage que Tip, mais il est assez similaire et presque certainement Turing-complete pour la même raison. Malheureusement, ceḋ
n'est pas implémenté dans M et je ne trouve aucun moyen de faire en sorte que Jelly fasse des calculs de précision arbitraire lorsque l'une des entrées est un nombre réel non entier. Si quelqu'un connaît d'autres langues de golf où cette construction pourrait fonctionner, n'hésitez pas à tenter le coup.C interprétant Brainfuck, 187 octets
Essayez-le en ligne
la source
Lua interprétant Brainf ***, 467 octets
Je sais qu'il est encore possible de maigrir plus tard, mais voici où ma première passe s'est terminée. Prend le code brainf de l'entrée standard.
la source
brains
, c'est toujours amusant quand les golfeurs assignent une liste de variables.CJam → variante ResPlicate,
151413 octets-1 octet grâce à @ ais523
La variante est la même que celle de cette réponse , à la différence que le nombre d'éléments retirés de la file d'attente est inférieur de un au nombre le plus élevé dans la file d'attente.
La
l~{ ... }h
pièce prend simplement un tableau en entrée et se répète jusqu'à ce que ce tableau soit vide.Explication de la boucle principale:
la source
Puce , 20 + 3 = 23 octets (règle 110)
+3 pour le drapeau
-z
Essayez-le en ligne!
Cette soumission n’est pas parfaite, car Puce n’a pas (encore) de capacité en boucle. Le résultat doit donc être transmis comme entrée pour simuler plusieurs générations, avec quelque chose comme cela (bien sûr, vous pouvez exécuter cette boucle indéfiniment, et Chip peut gérer des entrées arbitrairement longues, cette combinaison est donc Turing Complete).
Cette implémentation prend en entrée et donne en sortie sous forme ASCII
0
s et1
s. La logique est la suivante:Le reste des éléments est destiné à la gestion interne:
e*f
provoque la sortie des chiffres ASCII etE~Zt
termine l'exécution deux octets après que l'entrée est épuisée (car la largeur augmente de 2 à chaque génération).la source
Clojure, 75 octets (système de balises cycliques)
Mise à jour 1: remplacé
some?
parnil?
.Mise à jour 2: Correction d'un élément manquant
S
dans la branche else deif s
.Implémente le système de balises cycliques , retourne
nil
si le programme s'arrête, boucle pour toujours sinon. Clojure brille vraiment ici avec une infinité de séquences paresseuses (telles que cycle ) et de déstructuration . Les uns et les zéros sont indiqués comme des valeurs vraies et fausses. Lorsque la chaîne de données est épuisées
devientnil
.Ungolfed:
Exemple de résultats:
la source
Interprétation JavaScript de la règle 110 , 131 octets (99 octets?, 28 octets?)
Comme vous pouvez le constater, le code définit 3 fonctions
a
,b
etc
. Peut-être est-il possible de sauvegarder des octets en les combinant dans 1 fonction (je ne vois pas comment), mais il est bon qu’ils se séparent car chacun d’entre eux remplit déjà ce défi dans un sens.Function
a
prend 3 nombres en entrée et en calcule un polynôme étrange. Lorsque ces 3 numéros sont0
ou1
peuvent être vus comme des cellules de règle 110. La parité de la sortie dea
peut alors être considérée comme la valeur de la cellule du milieu dans la génération suivante. Donc, dans un certain sens, cette fonction simple est déjà un "interprète" de règle 110 (28 octets):Nous pouvons ensuite créer une nouvelle fonction
b
qui évaluea
chaque caractère d'une chaîne de uns et de zéros. Ilb
s’agit alors, dans un meilleur sens que celui d’a
un interprète de la règle 110. Prendre le mod 2 après l’évaluation des sauvegardes entre crochets (99 octets):Pour calculer réellement une fonction avec la règle 110, l'utilisateur doit spécifier l'état de départ et le nombre de générations après lequel la sortie apparaîtra. Nous pouvons créer une troisième fonction
c
qui prend une chaîne de uns et de zéros, et un entier positifn
, qui évalue ensuiteb
la chaîne, lesn
temps. Ainsi, nous pouvons vraiment considérer la règle 110 comme un langage de programmation, où un programme est un état initial et un nombren
, et la sortie est un état après desn
générations. La fonctionc
est maintenant un interpréteur réel pour ce langage de programmation, de sorte que le code final de ce défi est celui que j'ai présenté ci-dessus.la source
JS -> Newline 854 octets
Super golfé grâce à google.
la source
var
déclarations:var b=0,n=!0,c=[],h=[],e=0,l=[],m=0,f=2,a=0,g=!1;
var
tyClojure, 87 octets (règle 110)
Le code de parité est attribué à Jens Renders! J'avais beaucoup de mal à exprimer cela et j'allais passer à la conversion
[p q r]
de binaire en entier et utiliser une table de correspondance.Ici
partition
et la déstructuration de Clojure simplifie l'application logique. Cette fonction renvoie une séquence infinie d'états. L'appelant est donc responsable de toustake
les processus dont il a besoin ou justenth
pour passer à un état spécifique. Si les marges avec zéro étaient deux éléments au lieu d'un, la bande se développerait constamment, évitant ainsi les problèmes de limites. Maintenant, il reste la largeur d'origine.Exemple:
la source
cycle
pourrait construire le modèle de remplissage infini, mais l'exécution de la première étape prendrait un temps infini: /APL (Dyalog) → variante Fractran , 15 octets
Essayez-le en ligne!
La fonction prend les rationnels sous forme de liste de nombres plutôt que deux listes contenant le numérateur et le dénominateur, et génère le résultat si le programme se termine. Ceci implémente une variante de Fractran qui a le rationnel 1/1 (= 1) à la fin du programme. Le 1 n'a pas d'incidence sur la complétude de Turing (pour autant que je sache), car l'entrée du programme n'atteint le 1 que si aucun des autres raisonnements ne fonctionne et que, dans ce cas, l'entrée n'est pas modifiée. Ceci est uniquement utilisé pour que la fonction sache quand se terminer.
La liaison TIO exécute la fonction pendant 2 itérations (afin que vous puissiez voir la sortie tant que le programme ne se termine pas) sur la première entrée, puis exécute la deuxième entrée jusqu'à la fin, après quoi elle renvoie la sortie.
(⊃0~⍨××0=1|×)⍣≡
prend la liste des rationnels en tant qu'argument de gauche, appelé input, et l'entrée en tant qu'argument de droite,(⊃0~⍨××0=1|×)
train de fonction1|×
obtenir la partie après le point décimal (modulo 1) du produit×
de et0=
est-ce égal à 0?××
multipliez ce résultat par ⊣ × ⊢, partout où le rationnel × n'est pas un entier, il est remplacé par 00~⍨
supprimer tous les 0⊃
obtenir le premier élément⍣
boucle tant que l’≡
entrée n’a pas changé, notez que le résultat de(⊃0~⍨××0=1|×)
est réutilisé en tant qu’entrée; ainsi, si elle cesse de changer (à cause du 1 à la fin), le programme s’arrêtela source
JavaScript: Calcul lambda (
123 à114)Représenté à l'aide de Debruijn Indicies in Duples.
Le combinateur S est
[0, [0, [0, [[3, 1], [2, 1]]]]]
K est
[0, [0, 2]]
Je est
[0, 1]
Edit: Rasé 9 octets en remplaçant
"number"==typeof c
par!isNaN(c)
la source
APL (Dyalog Unicode) , SBCS de 15 octets
Programme complet qui implémente un exécuteur automatisé cellulaire unidimensionnel généralisé. Cela inclut la règle 110 qui est complète à Turing. Invite stdin pour indiquer l'état initial, le nombre d'itérations (ou
≡
le maintien jusqu'à la stabilité ou{⍵≡⎕←⍺}
d'afficher toutes les valeurs intermédiaires jusqu'à la stabilité) et l'ensemble de règles.Essayez-le en ligne! (4 itérations de la règle 110)
⎕
invite pour l'état initial et⊢
céder cela (sépare l'état du nombre d'itérations)⍣⎕
demandez le nombre d'itérations et appliquez la fonction suivante plusieurs fois:(
…)
Applique la fonction tacite suivante:⌺3
récupère tous les quartiers de longueur 3 (avec des informations indiquant s'ils sont au bord) et applique la fonction tacite suivante à chaque paire:⊂
clôturer le quartier∘
et⊢
céder cela∘
puis∊⍨
vérifier s'ils sont membres de⎕
invite pour la liste des quartiers menant à la prochaine itérationla source