Simuler un ordinateur de type boule de billard (basé sur la gravité)

12

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 1libè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 ale 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 Aa é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 Cet 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 Cavait 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
PhiNotPi
la source
Dans votre premier exemple, pourquoi la première balle tombe-t-elle sous le A? Y a-t-il une règle non écrite selon laquelle les balles s'arrêtent lorsqu'elles passent sur un personnage qui ne l'est pas \_/?
Peter Taylor
@PeterTaylor Oui, je dois ajouter que toute lettre se comporte comme un espace vide lorsqu'il s'agit d'affecter la balle, et la gravité tire la balle vers le bas.
PhiNotPi
1
Par hasard, voulez-vous dire «flipper», pas «billard»?
utilisateur inconnu
FAIRE DIS AN ESOLANG
Matthew Roh
1
@AlexL. Également pertinent: Marbelous
PhiNotPi

Réponses:

3

JavaScript ( 392 423)

Suppose que la machine est définie dans une variable appelée m, puis alerte la sortie finale.

l=m.split(q='\n');o='';for(r=Array(z=l[i=0].length);i<l.length;i++){L=l[i];n=Array(z);for(c=0;c<z;n[c]=N,r[c++]=R){C=L[c];N=~~n[c];R=~~r[c];if(C>'`'){N+=x=~~prompt(C);R+=x;o+=C+': '+x+q}else if(C=='\\'||C=='/'){for(d=c+(g=C=='/'?-1:1);L[d]=='_';r[d]+=R,d+=g);if(L[d]>'@'&L[d]<'[')r[d]+=r[c];n[d]=~~n[d]+R}else if(C<'2')N+=R+=~~C;else if(C!='_')o+=C+': '+R+q}for(c=0;c<z;c++)if(L[c]=='_')n[c]+=(r[c]%2)?0:r[c]>0;r=n}alert(o)

Exemple de source (exécute une machine additionneur, voir l'historique pour les sources moins golfées): http://jsfiddle.net/96yLj/12/

Spoilers:

- rsuit le nombre de balles dans la rangée actuelle, nsuit le nombre de balles dans la rangée suivante.
- Algorithme: traiter chaque ligne caractère par caractère, mais traiter _le dernier.
- Algorithme: \-> suivre _et augmenter rjusqu'à non _. Pareil pour /mais en sens inverse. À la fin, augmentez la ngravité pour tirer les balles vers le bas. gdétient la direction.
- if(L[d]>'@'&L[d]<'[')r[d]+=r[c];est pour le bug mentionné dans Edit 1 . La raison pour laquelle nous ne pouvons pas simplement le dire r[d]+=r[c];est parce que \_/le double comptage des balles lors du traitement /
- else if(C<'2')gère les deux cas '1'et ' ', ce qui ~~Cse transforme en 1 et 0, respectivement.


Edit 1: Correction d'un bug avec la balle qui déborde _non inclus dans l' Aexemple de code.

mellamokb
la source
Notez que j'ignore toujours les exigences STDIN et STDOUT car ce sont des restrictions sans intérêt. J'utilise promptpour l'entrée et alertpour la sortie, ce qui est assez standard pour JavaScript :-)
mellamokb