La machine
Une machine de type boule de billard est composée uniquement des symboles \
_
/
ainsi que des lettres majuscules et minuscules, des espaces et du nombre 1
.
\
et /
sont des rampes. Une balle venant d'en haut sera déviée vers le côté droit ou gauche, respectivement. Pour les deux rampes, si une balle vient d'un côté ou de l'autre, elle sera déviée vers le bas.
_
est un élément logique. La logique exécutée par celui-ci est la partie de l'ordinateur qui ne ressemble pas au billard. Tout d'abord, une balle venant de la gauche ou de la droite continue dans la même direction. Une balle venant d'en haut sera stoppée. Ensuite, après la fin de son exécution (voir Exécution de la machine ci-dessous), si le nombre de billes traversant / atterrissant dessus est un nombre pair positif, alors une seule balle est libérée du bas de l'élément.
Un espace ne fait rien. Toutes les balles provenant de n'importe quelle direction tombent directement en raison de la gravité.
Les lettres minuscules sont des entrées. Toutes les entrées seront soit un seul 1 ou 0.
Les lettres majuscules sont des sorties. Le nombre sorti sera le nombre de boules de billard qui ont frappé son emplacement.
Le numéro 1
libère une boule de billard supplémentaire à cet endroit. Il représente un 1 logique.
De plus, tous les personnages \_/
font tomber toute balle venant de n'importe quelle direction en raison de la gravité.
Les balles ne se combinent, ne se fendent ou ne se heurtent jamais. Ils ne sont créés que lorsqu'ils sont libérés d'une entrée, d'un _
ou d'un 1
. Ils ne sont détruits que lorsqu'ils tombent directement sur a _
.
Exemple de machine-
1 a
\_/ b
\_/
\/
/\ /
_ _
A B
Il n'y aura jamais de lignes vierges dans une machine, mais les _
s peuvent faire apparaître qu'il y a une ligne vierge.
Faire fonctionner la machine
Une machine est exécutée en couches ou en lignes. Tout mouvement de boule de billard sur la couche supérieure est effectué avant que quoi que ce soit ne se produise sur la deuxième couche.
La machine
ab
\_A
C
est exécuté comme suit:
Tout d'abord, il vous invite à saisir a
le formulaire a:
. L'utilisateur entrera alors un 1 ou 0 (suivi de la saisie). Il répète cela pour l'entrée b
. Ceci est la fin de la première couche. Je vais supposer que l'utilisateur a entré un 1 pour les deux entrées.
Il trace ensuite le chemin de la première balle (de a
), qui longe le \
, à travers le _
, dans le A
, et tombe à l'endroit sous le A
. Il trace ensuite le chemin de la deuxième balle (à partir de b
), qui descend directement sur la _
et se termine. C'est la fin de la deuxième couche.
Maintenant, avant la troisième couche, puisque le _
a eu deux balles croisées dessus, il libère une balle. La sortie A
a été traversée par une balle, donc elle sort A:1
.
Pour la troisième couche, il trace le chemin de la première balle (à partir du _
), qui passe par le C
et tombe droit vers le bas. La deuxième balle (qui est tombée à travers le A
) tombe également directement vers le bas.
Maintenant, avant la quatrième couche, étant donné que la sortie C
avait une balle sur elle, elle sort C:1
.
Étant donné que la quatrième couche est vide, le programme se termine.
Le résultat total devrait ressembler à
a:1 (the user entered the one)
b:1 (same here)
A:1
C:1
Le but
Votre objectif est de prendre une machine de STDIN et de la simuler en prenant les entrées et en imprimant les sorties selon les besoins sur STDOUT. La première partie de l'entrée de votre programme sera constituée de la machine à exécuter, suivie d'une ligne vierge. Toutes les lettres d'entrée rencontrées devraient amener votre programme à demander une entrée sous la forme du nom d'entrée suivi de deux points. Toute sortie doit être affichée sous la forme du nom de la sortie, suivie de deux points, suivie du nombre de boules passant à cet endroit.
C'est le golf.
Exemples
Un croisement de fil
ab
\/
AB
Une porte XOR
ab1
\_/
C
Un additionneur complet
1 a
\_/ b
\_/
\/
/\
_ __/
\_/
\/c
\\_/
_S1
\ \/
__/
/
_
\__
C
\_/
?