Stackylogic est un langage de programmation basé sur la logique que j'ai composé et qui prend en charge 0
les 1
entrées et les sorties et en sort un seul 0
ou 1
à la fin.
Un programme Stackylogic est composé de lignes qui ne peuvent contenir que les trois caractères 01?
, ainsi qu’un seul <
à la fin de l’une des lignes. Les lignes ne peuvent pas être vide et la ligne avec le <
doivent avoir au moins un 0
, 1
ou ?
devant elle.
Voici un exemple de programme qui (comme je l'expliquerai) calcule la NAND de deux bits:
1
?<
11
?
0
Chaque ligne d'un programme Stackylogic est considérée comme une pile , avec le bas à gauche et le haut à droite. Implicitement, il y a une pile vide (ligne vide) avant la première ligne du programme et après la dernière ligne.
Le <
, que nous appellerons le curseur , marque la pile à démarrer lorsqu'un programme Stackylogic est exécuté. L’exécution d’un programme Stackylogic se déroule comme suit:
Retirez le caractère du haut de la pile sur laquelle le curseur pointe actuellement.
- Si le caractère est
?
, demandez à l'utilisateur un0
ou un1
et agissez comme s'il s'agissait du caractère. - Si le caractère est
0
défini, déplacez le curseur d'une pile vers le haut (sur la ligne située au-dessus de la ligne actuelle). - Si le caractère est
1
défini, déplacez le curseur d'une pile vers le bas (sur la ligne située sous la ligne actuelle).
- Si le caractère est
Si la pile sur laquelle le curseur se déplace est vide, affiche la dernière valeur extraite d'une pile (toujours un
0
ou1
) et termine le programme.Sinon, si la pile sur laquelle le curseur se déplace n'est pas vide, retournez à l'étape 1 et répétez le processus.
Notez que les programmes Stackylogic se terminent toujours car ils doivent éventuellement épuiser leurs piles.
Exemple NAND
Dans le programme NAND, le curseur commence sur un ?
:
1
?<
11
?
0
Nous supposerons que l’utilisateur saisit une 1
fois l’opération ?
, ce qui signifie que le curseur se déplacera vers le bas, donnant au programme l’apparence suivante:
1
11<
?
0
Une plaine se 1
trouve maintenant en haut de la pile de curseurs. Il est dûment sauté et le curseur se déplace à nouveau:
1
1
?<
0
Supposons maintenant que les entrées utilisateur 0
pour le ?
, ce qui signifie que le curseur se déplace vers le haut:
1
1<
0
Encore une fois, a 1
est sur la pile du curseur pour que le curseur apparaisse et descende:
1
<
0
Enfin, la pile de curseurs est vide et la dernière valeur apparue, le 1
, est sortie et le programme se termine.
Ceci est exact pour une porte NON - car 1 NAND 0
est 1
. Ceci fonctionne bien sûr pour les trois autres entrées à deux bits si vous voulez vérifier.
OU Exemple
Ce programme Stackylogic simule une porte OU :
?
?<
Il est facile de voir qu'une entrée initiale de 1
déplacera le curseur sur la pile vide implicite située au-dessous de la dernière ligne, mettant ainsi fin au programme et produisant le résultat 1
qui venait d'être entré.
Par 00
contre, pour une entrée , le curseur se dirigera vers la pile vide implicite située en haut, mettant fin au programme et en sortie la dernière 0
entrée.
Défi
Ecrire un programme ou une fonction qui prend dans un programme Stackylogic comme une chaîne et l' exécute, l' impression ou le retour résultant 0
ou 1
.
Upon ?
, vous pouvez demander à l'utilisateur une entrée 0
ou 1
, ou lire la valeur d'une chaîne prédéfinie de 0
'et de 1
' que vous prenez également comme entrée. (Cela peut être une autre chaîne d'entrée dans votre programme / fonction ou vous pouvez simplement supposer que la première ou la dernière ligne de la chaîne de programme sera le flux d'entrée).
Vous pouvez supposer que le programme et les entrées sont toujours bien formés. Vous pouvez éventuellement supposer que les programmes d'entrée sont fournis avec une nouvelle ligne de fin (bien qu'il y ait toujours une pile implicite vide à la fin).
Le code le plus court en octets gagne.
Plus de programmes exemples
ZERO
0<
ONE
1<
BUFFER
?<
NOT
1
?<
0
AND
?<
?
NAND
1
?<
11
?
0
OR
?
?<
NOR
1
?
00
?<
0
XOR(v1)
?
0
1?<
?
0
XOR(v2)
?
?<
11
?
0
XNOR(v1)
1
?
0?<
1
?
XNOR(v2)
1
?
00
?<
?
MEDIAN(v1)
1
???<
0
MEDIAN(v2)
?
1?<
??
Merci Martin pour les programmes médians .
1\???<\0
.
111\???????<\000
.
?\1?<\??
. Sinon, voici une implémentation symétrique à 5 lignes:?\?0\?<\?1\?