Ein klassisches Beispiel für die Einführung in das Konzept einer diskreten Wahrscheinlichkeitsverteilung ist die Bohnenmaschine . Diese Maschine hat eine große Anzahl von Murmeln, die aus einem engen Durchgang oben herausfallen. Danach treffen sie auf Reihen von verflochtenen Stiften, wobei die Murmel an jedem Stift links oder rechts vom Stift hinabfallen können. Schließlich werden die Stifte in vertikalen Behältern am Boden der Maschine gesammelt. Ein einfaches Diagramm dieser Maschine sieht folgendermaßen aus:
| O |
| ^ |
| ^ ^ |
| ^ ^ ^ |
| ^ ^ ^ ^ |
| ^ ^ ^ ^ ^ |
|_|_|_|_|_|_|
In diesem Diagramm O
bezeichnet das den Ort, von dem die Murmeln fallen. Jedes ^
ist eine Stecknadel, bei der der Marmor eine 50% ige Chance hat, sich auf das Quadrat links oder rechts von der Stecknadel zu bewegen. Die Murmeln sammeln sich dann an den Behältern am Boden des Geräts, und bei einer ausreichenden Anzahl von Murmeln ähnelt die Höhe der Murmelstapel in den Behältern einer diskreten Binomialverteilung.
Herausforderung
Für diese Herausforderung berechnen Sie die resultierende Wahrscheinlichkeitsverteilung von Bean-Maschinen auf der Grundlage von Diagrammen wie dem obigen. Die Diagramme werden als zweidimensionales "Programm" interpretiert, durch das die Murmeln entweder zu Feldern an der Seite oder zu Feldern unterhalb des aktuellen Feldes laufen. Wenn die Murmeln den Boden der Maschine erreichen, werden sie für die Wahrscheinlichkeitsverteilung gezählt. Um es interessant zu halten, enthalten diese Diagramme ein paar Felder mehr als nur die einfache Quelle und die Pins. Ein Beispieldiagramm ist:
| O |
| ^ |
| ^ / |
| ^ | ^ |
| <^- = v |
| ^ ^ ^ ^ ^ |
Weiterhin haben die Murmeln nun jeweils eine Drehrichtung. Diese Richtung wird von einigen Feldern vorgegeben und bestimmt, zu welchem nächsten Feld sich der Marmor in mehreren anderen Feldern bewegt.
Folgende Felder sind definiert:
O
: Quelle. Spawns Murmeln direkt darunter. Die Richtung dieser Murmeln ist zu 50% links, zu 50% rechts. Jede Quelle produziert die gleiche Menge Murmeln.U
: Waschbecken. Jegliche Murmeln, die dieses Feld betreten, werden von der Bohnenmaschine entfernt.: Freiraum. Wenn ein Marmor auf diesem Feld ankommt, bewegt er sich auf das Feld darunter.
-
: Fußboden. Wenn ein Marmor auf diesem Feld ankommt, bewegt er sich je nach aktueller Richtung entweder zum linken oder zum rechten Feld.^
: Splitter. Wenn ein Marmor auf diesem Feld ankommt, bewegt er sich zu 50% auf das Feld rechts oder das Feld links vom Splitter. Dies bestimmt auch die Richtung des Marmors.v
: Beitreten. Wenn ein Marmor auf diesem Feld ankommt, bewegt er sich auf das Feld darunter./
: Schrägkissen. Wenn ein Marmor auf diesem Feld ankommt, bewegt er sich auf das Feld links vom Pad und legt die Richtung des Marmors fest.\
: Wie vorher, aber rechts.|
: Reflektor. Wenn ein Marmor auf diesem Feld ankommt, kehrt er die Richtung des Marmors um und verschiebt den Marmor auf der Grundlage dieser umgekehrten Richtung nach rechts oder links auf das Feld.=
: Kanone. Wenn ein Marmor in diesem Bereich kommt, wird es nach rechts oder in der Stromrichtung nach links zu verschieben, bis der Marmor ein Feld trifft , das nicht der Fall ist,
-
oderO
.<
: Entspricht dem vorherigen, gibt jedoch immer die Richtung vor und bewegt sich nach links.>
: Wie vorher, aber rechts.
Die folgenden Garantien beziehen sich auf das Diagramm.
- Jede Eingabezeile hat in Feldern genau die gleiche Länge.
- Das Feld ganz links und ganz rechts jeder Zeile ist immer a
|
. - Das Diagramm enthält keine möglichen Pfade, auf denen Murmeln für eine unbestimmte Anzahl von Iterationen wie
\/
oder in der Maschine hängen bleiben können^^
. - Das Diagramm enthält nur die oben genannten Felder.
- Es gibt eine oder mehrere Quellen
Ergebnis
Ihre Aufgabe wird es sein, ein 16-zeiliges ASCII-Balkendiagramm der Wahrscheinlichkeitsverteilung zu erstellen, in dem die Murmeln die untere Seite des Diagramms verlassen und so skaliert werden, dass die größte Wahrscheinlichkeit alle 16 Zeichen abdeckt. Also für folgendes Problem:
| O |
| ^ |
| ^ ^ |
| ^ ^ ^ |
| ^ ^ ^ ^ |
| ^ ^ ^ ^ ^ |
Ihr Programm sollte die folgende Lösung erzeugen (beachten Sie, dass es die gleiche Breite wie das Eingabeprogramm haben sollte, einschließlich der seitlichen Pipes:
# #
# #
# #
# #
# #
# #
# #
# #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # # # #
# # # # # #
Beispiele
Das folgende Beispiel soll die Funktionalität aller verschiedenen Feldtypen testen:
| O O |
| O ^ / <^\\\ |
| ^ > ^ |
| ^ ^ ^ =|
| ^ ^ | ^ <^ O |
| ^ > ^ | ^ O ^> v |
|| ^U ^ | = ^\ |
| ^ ^ ^ ^U ^\ ---^ |
| = ^ ^ = v |
Es sollte die folgende Ausgabe ergeben:
#
#
#
#
# #
# #
# #
# # # #
# # # #
# # # #
# # # #
## # # #
## # # # #
# ### # # # #
# # ### # # # #
# # ### # # # #
Regeln
Sowohl Funktionen als auch vollständige Programme sind gültige Antworten auf diese Herausforderung. Sie erhalten das Diagramm als durch Zeilenumbrüche getrennte Zeichenfolge und sollten das Ausgabediagramm im angegebenen Format zurückgeben. Es gelten die Standard-Ein- / Ausgaberegeln . Während in der Ausgabe abschließende und führende Zeilenumbrüche zulässig sind, sollte jede Zeile genau die gleiche Breite wie die Eingabe haben.
Um kreativere Lösungen zu ermöglichen, muss Ihr Programm in mehr als 90% der Fälle das richtige Ergebnis für dasselbe Diagramm ausgeben. Es ist schließlich eine Wahrscheinlichkeitssimulation.
Wertung
Das ist Code-Golf , also gewinnt die niedrigste Punktzahl in Bytes.
v
= [space]
?
v
und [space]
unterscheiden sich darin, wie Kanonen um sie herum interagieren.