Simulieren Sie einen (schwerkraftbasierten) Billardkugel-Computer

12

Die Maschine

Ein Billardkugelautomat besteht nur aus den Symbolen \ _ /sowie Groß- und Kleinbuchstaben, Leerzeichen und der Zahl 1.

\und /sind Rampen. Ein von oben kommender Ball wird entweder nach rechts oder nach links abgelenkt. Wenn eine Kugel von beiden Seiten kommt, wird sie für beide Rampen nach unten abgelenkt.

_ist ein logisches Element. Die von ihm ausgeführte Logik ist der unbillardartigste Teil des Computers. Zunächst setzt sich eine Kugel, die von links oder rechts kommt, in die gleiche Richtung fort. Ein von oben kommender Ball wird gestoppt. Wenn dann nach dem Ende der Ausführung (siehe Ausführen der Maschine unten) die Anzahl der Kugeln, die sich kreuzen / auf ihr landen, gerade ist, wird eine einzelne Kugel vom Boden des Elements abgegeben.

Ein Leerzeichen macht nichts. Alle Kugeln, die aus einer beliebigen Richtung kommen, fallen aufgrund der Schwerkraft direkt nach unten.

Kleinbuchstaben sind Eingaben. Alle Eingänge sind entweder eine einzelne 1 oder 0.

Großbuchstaben sind Ausgaben. Die ausgegebene Zahl ist die Anzahl der Billardkugeln, die auf die Position treffen.

Die Nummer 1gibt an dieser Stelle eine zusätzliche Billardkugel frei. Es repräsentiert eine logische 1.

Alle Charaktere \_/verursachen außerdem, dass jeder Ball, der aus einer beliebigen Richtung kommt, aufgrund der Schwerkraft direkt nach unten fällt.

Bälle verbinden, spalten oder kollidieren niemals. Sie werden nur erstellt, wenn sie von einem Eingang, a _oder a freigegeben werden 1. Sie werden erst zerstört, wenn sie direkt auf einen fallen _.

Beispiel maschinen-

1 a
\_/ b
  \_/
 \/
 /\ /
_  _
A  B

Ein Computer wird niemals Leerzeilen enthalten, aber die _können den Anschein erwecken, dass eine Leerzeile vorhanden ist.

Maschine laufen lassen

Eine Maschine wird in Schichten oder Reihen betrieben. Alle Billardkugelbewegungen auf der obersten Schicht werden ausgeführt, bevor auf der zweiten Schicht etwas passiert.

Die Maschine

ab
\_A
 C

wird wie folgt ausgeführt:

Zunächst werden Sie zur Eingabe ain das Formular aufgefordert a:. Der Benutzer gibt dann eine 1 oder 0 ein (gefolgt von der Eingabe). Dies wird für die Eingabe wiederholt b. Dies ist das Ende der ersten Ebene. Ich gehe davon aus, dass der Benutzer für beide Eingaben eine 1 eingegeben hat.

Es zeichnet dann den Weg der ersten Kugel (von a) nach, die entlang der \, über die _, in die A, und fällt auf die Stelle unter der A. Es zeichnet dann den Weg für die zweite Kugel (von b) nach, die direkt nach unten geht _und endet. Dies ist das Ende der zweiten Ebene.

Nun, vor der dritten Schicht, da _zwei Bälle darüber gekreuzt wurden, gibt es einen Ball frei. Der Ausgang Awurde von einer Kugel überkreuzt, sodass er ausgegeben wird A:1.

Für die dritte Schicht wird der Pfad der ersten Kugel (von der _) nachgezeichnet, die durch die Cund geradeaus nach unten fällt. Die zweite Kugel (die durch die fiel A) fällt ebenfalls gerade nach unten.

Nun, vor der vierten Schicht, da der Ausgang Ceine Kugelbewegung über sich hatte, gibt er aus C:1.

Da die vierte Schicht leer ist, wird das Programm beendet.

Das Gesamtergebnis sollte so aussehen

a:1     (the user entered the one)
b:1     (same here)
A:1
C:1

Das Ziel

Ihr Ziel ist es, eine Maschine von STDIN zu nehmen und zu simulieren, indem Sie die Eingaben und Druckausgaben nach Bedarf an STDOUT senden. Der erste Teil der Eingabe in Ihr Programm besteht aus der auszuführenden Maschine, gefolgt von einer Leerzeile. Bei Eingabe von Buchstaben sollte Ihr Programm zur Eingabe in Form eines Eingabenamens gefolgt von einem Doppelpunkt auffordern. Jede Ausgabe sollte in Form des Ausgabenamens angezeigt werden, gefolgt von einem Doppelpunkt, gefolgt von der Anzahl der Kugeln, die über diese Stelle laufen.

Das ist Golf.

Beispiele

Eine Drahtkreuzung

ab
\/
AB

Ein XOR-Gatter

ab1
\_/
 C

Ein Volladdierer

1 a
\_/ b
  \_/
 \/
 /\
_ __/
 \_/ 
  \/c
 \\_/ 
  _S1
\  \/
 __/
  /
 _
\__
 C
PhiNotPi
quelle
Warum fällt in Ihrem ersten Beispiel der erste Ball unter das A? Gibt es eine ungeschriebene Regel, nach der Bälle aufhören, wenn sie auf einen Charakter übergehen, der es nicht ist \_/?
Peter Taylor
@PeterTaylor Ja, ich sollte hinzufügen, dass sich alle Buchstaben wie ein leerer Raum verhalten, wenn es darum geht, den Ball zu beeinflussen, und die Schwerkraft den Ball nach unten zieht.
PhiNotPi
1
Meinen Sie zufällig "Flipper", nicht "Billard"?
Benutzer unbekannt
MAKE DIS AN ESOLANG
Matthew Roh
1
@AlexL. Ebenfalls relevant: Marbelous
PhiNotPi 10.02.17

Antworten:

3

JavaScript ( 392 423)

Nimmt an, dass die Maschine in einer Variablen namens gesetzt ist m, und benachrichtigt dann die endgültige Ausgabe.

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)

Beispielquelle (führt einen Addierer aus, siehe Verlauf für Quellen mit weniger Golf): http://jsfiddle.net/96yLj/12/

Spoiler:

- rVerfolgt die Anzahl der Bälle in der aktuellen Reihe und die nAnzahl der Bälle in der nächsten Reihe.
- Algorithmus: Verarbeitet jede Zeile zeichenweise, aber _zuletzt.
- Algorithmus: \-> folgen _und erhöhen rbis nicht mehr _. Gleich, /aber in umgekehrter Richtung. Zum Schluss die nSchwerkraft erhöhen, um die Kugeln nach unten zu ziehen. ghält die Richtung.
- if(L[d]>'@'&L[d]<'[')r[d]+=r[c];ist für den in Edit 1 erwähnten Fehler . Der Grund, den wir nicht einfach sagen können, r[d]+=r[c];ist, dass \_/beim Verarbeiten die Kugeln doppelt gezählt werden /
- else if(C<'2')behandelt beide Fälle '1'und ' ', was ~~Czu 1 bzw. 0 wird.


Edit 1: Bug mit überlaufendem Ball behoben _, der im ABeispielcode nicht enthalten ist .

mellamokb
quelle
Beachten Sie, dass ich STDIN- und STDOUT-Anforderungen immer ignoriere, da sie uninteressante Einschränkungen darstellen. Ich benutze promptfür die Eingabe und alertfür die Ausgabe, die für JavaScript ziemlich Standard ist :-)
Mellamokb