Un système d'étiquettes cycliques est un minuscule modèle de calcul complet de Turing composé d'un alphabet à deux symboles (je vais utiliser {0,1}
), d'une liste cyclique finie et non vide de productions qui se composent de ces deux symboles, et d'un mot illimité qui se compose également de ces deux symboles.
À chaque étape:
- le premier élément du mot est supprimé
- si c'était
0
la production actuelle est sautée - si c'était le cas,
1
la production actuelle est ajoutée à la fin du mot . - la prochaine production devient active. S'il s'agissait de la dernière production, revenez à la première.
Le système s'arrête lorsque le mot devient vide.
Un exemple (de Wikipedia):
Productions: (010, 000, 1111)
Initial word: 11001
Generation Production Word (before) Word (after)
0 010 11001 → 1001010
1 000 1001010 → 001010000
2 1111 001010000 → 01010000
3 010 01010000 → 1010000
4 000 1010000 → 010000000
5 1111 010000000 → 10000000
6 010 10000000 → 0000000010
7 000 0000000010 → 000000010
8 1111 000000010 → 00000010
9 010 00000010 → 0000010
Votre tâche, si vous choisissez de l'accepter, est d'écrire un programme ou une fonction qui prend:
- une liste de productions,
- le mot initial, et
- une génération,
et imprime ou renvoie le mot à cette génération.
Par exemple,
cyclic_tag(
prod=[[0,1,0],[0,0,0],[1,1,1,1]],
word=[1,1,0,0,1],
gen=4) => [1,0,1,0,0,0,0]
Détails d'implémentation:
L'alphabet n'a pas d'importance. Vous pouvez utiliser
0
et1
,True
etFalse
,T
etNIL
,A
etB
, ou même1
et0
, ou tout ce que vous pouvez proposer, tant que vous êtes cohérent. Toutes les entrées et sorties doivent utiliser le même alphabet et vous devez indiquer ce que vous utilisez0
et pour quoi1
.La longueur du mot doit être théoriquement illimitée. Autrement dit, vous ne pouvez pas coder en dur une longueur de mot maximale. Si j'exécute votre programme sur un ordinateur idéal avec une quantité infinie de mémoire, votre programme doit théoriquement pouvoir l'utiliser. (Vous pouvez ignorer les limites de votre interprète / compilateur.)
Si le système donné s'arrête avant que la génération donnée ne soit atteinte, vous devez retourner ou imprimer le mot vide.
La production vide existe et vous devez pouvoir la gérer. Si vous écrivez un programme complet, vos E / S doivent également pouvoir le gérer.
Edit : j'avais initialement prévu que la génération 0
soit le mot d'entrée lui-même, et la génération 1
soit le résultat de la première étape. C'est-à-dire que j'avais prévu que vous retourniez la colonne précédente . Cependant , comme je n'ai pas été suffisamment clair pour le dire, j'accepterai les deux options ; pour chaque génération, vous pouvez renvoyer la valeur dans la colonne avant ou après . Vous devez indiquer que vous suivez la colonne après , si vous le faites. Vous devez également être cohérent dans la colonne que vous choisissez.
J'attribuerai le plus petit code d'ici une semaine (27/10/2014).
la source
Réponses:
GolfScript (17 à 19 octets selon le format d'entrée et le format de sortie accepté)
18 octets:
Prend l'entrée dans le formulaire
[1 1 0 0 1] [[0 1 0] [0 0 0] [1 1 1 1]] 4
et donne la sortie dans le formulaire[1 0 1 0 0 0 0]
. (Peut être 17 octets sans le dernier`
si la sortie est1010000
est acceptable).Démo en ligne
19 octets:
Prend la saisie dans le formulaire
"11001" ["010" "000" "1111"] 4
.Démo en ligne
Dissection
Crédit Martin Büttner de solution CJAM pour l'idée de générer la liste des productions par la répétition et la troncature.
la source
Haskell,
555351cela utilise au
True
fur1
et àFalse
mesure0
. exemple d'exécution:la source
CJam,
313028272418 octetsCela définit un bloc (la chose la plus proche d'une fonction), qui s'attend à ce que l'entrée réside sur la pile comme ceci
Il laissera également un tableau de
0
s et1
s sur la pile.Testez-le ici. Collez l'entrée sur la première ligne, le code sur la troisième ligne et ajoutez un
~
pour évaluer réellement le bloc. Par exempleSi la sortie n'a pas besoin d'avoir la même forme que l'entrée
Explication:
L'état final du mot est laissé sur la pile.
Merci à Peter Taylor de m'avoir fait revisiter cela.
la source
l~{_,g{('1=@(:Pa+@@P*+}*}*\;
28 et encore des possibilités d'amélioration (en particulier la(:P
partie), mais l'heure du déjeuner:P
ça m'ennuie aussi: Dl~{_,g{(si@(:Pa+@@P*+}*}*\;
: 27 et après y avoir réfléchi,:P
est en fait efficace: P_,g
peut également être remplacé par les_!!
mêmes octets._{...}{}?
.Mathematica,
84 8077 caractèresExemple:
la source
Pyth 22
Requiert les 3 arguments comme entrées séparées.
Prend des arguments comme:
Explication:
Python 2 - 61
67 91 105 124Jolie réponse Joe-Basic. Suppose que la production vide est
[[]]
.Merci à @xnor d'avoir souligné que jouer au golf à 2h du matin est une mauvaise décision.
Remerciements supplémentaires à @xnor, à qui je semble devoir 50% de mon score.
Échantillon:
la source
g and w
pourx
? En outre, je pense que celag*w
devrait fonctionner pour donner une valeur vraie lorsque les deuxg
sont non nuls etw
non vides.if x else w
. Ce ne sera pasx
toujours vrai parce que ce code est uniquement exécutéif x
, ou manque-t-il quelque chose?and
/or
trick et la rotationp
au lieu de l'incrémentationn
:c=lambda p,w,g:g*w and c(p[1:]+p[:1],w[1:]+w[0]*p[0],g-1)or w
Javascript ES6 - 88 octets
Ressemble étrangement à la réponse de Fry qui vient d'apparaître dans mon navigateur. (Pas de copie, je le jure solennellement.)
Il semblerait cependant qu'il ait suivi la route du tableau tandis que je suis allé la route chaîne / expression régulière.
Étendu:
Exemple de sortie
Maintenant, regardez les langues du golf entrer et massacrez-nous tous les deux. :RÉ
la source
n
. Grands esprits, hein? : D