Python, 250 octets.
Celui-ci est plus long que ilya n. s'Python solution, mais la langue est un peu plus facile à saisir. Chaque commande dans cette langue (je l'appelle Kaputt, le mot allemand pour "cassé") est un octet. 6 commandes sont définies:
-
0
: Pousser un zéro sur la pile
-
1
: Pousser un sur la pile
-
I
: (si) Pop une valeur hors de la pile (qui doit être égal à zéro ou un). Exécutez le bloc de code suivant (jusqu'à ce que "i
") si c'est un; passez le bloc si c'est un zéro.
-
i
: (endif) se Termine le bloc si et pousse un si le bloc était pas exécuter (parce que le "I
" sauté de zéro). Voir ci-dessous pour une explication de ce dernier.
-
D
: (def) Afche le nom de l'à-être-de la fonction définie en dehors de la pile (voir ci-dessous) et se lie le bloc suivant (jusqu'à ce que "d
") à ce nom.
-
d
: (enddef) se Termine la définition de la fonction.
- Toute autre octet: Vérifier s'il existe une fonction par la présente (un octet; mais voir l'édition ci-dessous) nom. Dans ce cas, exécutez cette fonction; dans le cas contraire, appuyez sur ce octets sur la pile pour une utilisation immédiate en
D
.
Imbriqués les fi sont légales; fonction imbriquée définitions ne sont pas. Le fait qu' i
(endif) pousse un si et seulement si le correspondant si le bloc n'a pas été exécutée permet pour la marche suivante ressemblant à un if/else/endif structure:
# [code that left a one or zero on the stack]
I # abbreviated "(" below
# [code to be run if it was a one]
0iI # abbreviated "/" below
# [code to be run if it was a zero]
1iIi # abbreviated ")" below
# [continuing...]
Notez que les commentaires, mais les sauts de ligne, les espaces etc. ne sont pas autorisés.
Voici quelques exemples de fonctions communes. Ces programmes utilisent des abréviations ( / )
mentionné ci-dessus.
<D(/)d
définit la fonction <
(pop) qui s'affiche une valeur en dehors de la pile sans les utiliser pour quoi que ce soit.
&D((1/0)/<0)d
définit la fonction &
(et) qui apparaît deux valeurs de la pile, et pousse un si les deux valeurs sont proches, pousse un zéro autrement.
~D((11/10)/(01/00))d
définit la fonction ~
(swap) qui échange les deux valeurs sur la pile.
RD(R/<)d
définit la fonction R
(supprimer) qui supprime récursivement tous ceux à partir du haut de la pile, puis supprime les deux autres valeurs (le haut de, qui devrait être égale à zéro).
La suite de l'interprète de la fonction s'attend à ce que le programme p, qui est une chaîne de caractères (ou de tout autre objet iterable octets), et l'entrée de la pile S, qui est une liste (éventuellement vide) d'octets. Après l'interprète a terme, cette liste contient la sortie de la pile.
def i(p,S,F=0):
A=S.append
F=F or{}
C=0
k=[]
for c in p:
h=0in k
if c=="d":C=0
elif C!=0:C+=[c]
elif c=="I":k+=[int(h or S.pop())]
elif c=="i":k.pop()or A("1")
elif 1-h:
if c=="D":C=F[S.pop()]=[]
else:i(F.get(c)or A(c)or"",S,F)
Évidemment, il n'y a pas de place pour la vérification des erreurs, de sorte i()
attend juridique Kaputt code. Des cas de Test:
script = "<D(/)d" # < = pop
script += "&D((1/0)/<0)d" # & = and
script += "~D((11/10)/(01/00))d" # ~ = swap
script += "RD(R/<)d" # R = remove
script += "|D(<1/(1/0))d" # | = or
script=script.replace("(","I")
script=script.replace("/","0iI")
script=script.replace(")","1iIi") # ( and / and ) are no real commands of the language.
S=[]
i(script+"1111010111111111R",S)
assert S == ["1","1","1","1","0"]
S=[]
i(script+"00&",S)
assert S == ["0"]
S=[]
i(script+"01~",S)
assert S == ["1","0"]
S=[]
i(script+"00|",S)
assert S == ["0"]
S=[]
i(script+"01|",S)
assert S == ["1"]
Amusez-vous bien :-)
Edit: Il n'y a rien d'inhérent à l'interprète que les forces de jetons d'être un octet seulement. Exigeant, ce n'était plus pour des raisons de cohérence avec les commandes intégrées (qui sont d'un octet, parce que l'interprète le plus court). Si vous passez une liste de chaînes de caractères au lieu d'une chaîne, vous pouvez écrire plus lisible Kaputt code comme ceci:
script = """
inc D
(
(
0 0
/
1 0
)
/
1
)
d
""".replace("(","I").replace("/","0 i I").replace(")","1 i I i").split()
Ceci définit une fonction inc
qui incrémente le à deux du nombre de bits sur le haut de la pile (LSB sur le dessus).
Test:
for n in xrange(4):
S=[]
i(script + [str((n & 2)/2), str(n & 1), "inc"], S)
assert S == [str(((n+1) & 2)/2), str((n+1) & 1)]
Appelons multi-octets de la fonction, le nom d'une extension du langage :-)