Betrachten Sie diese ASCII-Version eines Mechanismus, der einer Bohnenmaschine oder einem Plinko / Pachinko- Spiel ähnelt :
O
^
\ ^
^ ^ \
\ ^ / ^
U U U U U
1 2 3 4 5
Das O
ist ein Ball, der runterfällt.
- Wenn es auf a trifft
^
, besteht eine 50: 50-Chance, dass es nach links oder rechts geht. - Wenn es ein trifft
/
, geht es immer nach links. - Wenn es auf ein trifft
\
, geht es immer richtig.
Der Ball fällt schließlich in einen der nummerierten U
Tröge am Boden. Die Frage ist, wie hoch die Wahrscheinlichkeit ist, dass es in jedem Trog landet.
Für diesen speziellen Fall sind die Wahrscheinlichkeiten sind 0.0
, 0.1875
, 0.5625
, 0.125
, und 0.125
, für Tröge 1 bis 5 sind.
Hier ist ein weiteres Beispiel mit 3 Mulden statt 5. Die Wahrscheinlichkeiten sind 0.5
, 0.5
und 0.0
:
O
/
^ ^
U U U
1 2 3
In dieser Herausforderung werden wir dieses Problem auf einen Mechanismus mit einer beliebigen Anzahl von Ebenen verallgemeinern, die auf eine beliebige Weise eingerichtet sind.
Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die die ASCII-Darstellung der Pyramidenstruktur des Mechanismus übernimmt. (Eingabe über stdin / command line / function arg.)
Sie können entweder davon ausgehen, dass es mit Leerzeichen kommt, die es in die richtige Form bringen, z
^
\ ^
^ ^ \
\ ^ / ^
Oder Sie können davon ausgehen, dass es überhaupt keine Leerzeichen enthält, z
^
\^
^^\
\^/^
(Falls gewünscht, können Sie davon ausgehen, dass eine nachgestellte Zeile und / oder ein konsistentes Muster von nachgestellten Leerzeichen vorhanden ist.)
Die Struktur der Eingabepyramide kann eine beliebige Anzahl von Ebenen (auch als Linien bezeichnet) aufweisen, einschließlich Null. Jede Ebene hat ein weiteres ^
, /
oder \
als die letzte, und es gibt levels + 1
Mulden am Boden (die nicht Teil des Eingangs sind).
Sie müssen die Liste der Wahrscheinlichkeiten drucken / zurückgeben, mit denen der Ball in jeder der Mulden landet (in der Reihenfolge von der linken zur rechten Mulde). Dies sollten Gleitkommawerte sein, die beim Drucken mindestens 3 Dezimalstellen haben (überflüssige Nullen oder Dezimalstellen sind nicht erforderlich; 1
ist in Ordnung für 1.000
, .5
ist in Ordnung für 0.500
usw.). Wenn Sie eine Funktion geschrieben haben, können Sie die Werte drucken oder eine Liste / ein Array der Floats zurückgeben.
Jedes vernünftige gedruckte Listenformat ist in Ordnung. zB 0.5 0.5 0.0
, [0.5 0.5 0.0]
, [0.5, 0.5, 0.0]
, {0.5, 0.5, 0.0}
, oder 0.5\n0.5\n0.0
alles wäre in Ordnung.
Beispiele
0 Levels: (auf ein Trivial reduziert U
)
Eingabe: [no input/empty string given]
Ausgabe:1.0
1 Stufe:
Eingabe: ^
Ausgabe:0.5 0.5
Eingabe: /
Ausgabe:1.0 0.0
Eingabe: \
Ausgabe:0.0 1.0
2 Ebenen: (zweites Beispiel oben)
Eingang:
/
^ ^
Ausgabe: 0.5 0.5 0.0
3 Ebenen:
Eingang:
^
^ ^
^ ^ ^
Ausgabe: 0.125 0.375 0.375 0.125
Eingang:
\
/ \
/ / \
Ausgabe: 0.0 0.0 0.0 1.0
4 Ebenen: (erstes Beispiel oben)
Eingang:
^
\ ^
^ ^ \
\ ^ / ^
Ausgabe: 0.0 0.1875 0.5625 0.125 0.125
7 Stufen:
Eingang:
^
/ ^
^ ^ /
/ \ / \
^ ^ / ^ \
^ \ ^ \ / ^
\ ^ ^ ^ \ ^ /
Ausgabe: 0.0 0.09375 0.28125 0.4375 0.1875 0.0 0.0 0.0
Wertung
Die kürzeste Antwort in Bytes gewinnt. Tiebreaker ist früherer Beitrag.
quelle
Antworten:
CJam,
50 48 45 44 4240 BytesDies setzt voraus, dass die Eingabe kein Leerzeichen enthält und eine nachgestellte Newline enthält. Zum Beispiel:
Algorithmus
Die Grundidee ist, dass Sie jedes Zeichen weiter analysieren (es gibt nur 4 verschiedene Zeichen) und verschiedene Operationen für die Wahrscheinlichkeitsverteilung ausführen (anfangs ein Array mit 1 Element mit Wert 1). Für jede Zeile von Eingabezeichen (beginnend mit dem ersten Zeichen in der ersten Zeile) wird ein Wahrscheinlichkeitsarray mit derselben Größe verwaltet. Jedes Zeichen wirkt auf die erste Wahrscheinlichkeit aus der Liste und verschiebt das resultierende Paar an das Ende der Liste. Nach jeder Zeile addieren wir Paare aus der Liste, um die genaue Anzahl der Elemente als Elemente in der nächsten Zeile zu erhalten.
Hier sind die vier Zeichen und die jeweils erforderlichen Aktionen:
^
: Wenn dieses Zeichen auftritt, teilen Sie die aktuelle Wahrscheinlichkeit in zwei Teile. Zum Beispiel, wenn wir dies in der ersten Zeile haben, müssen wir die konvertieren[1]
zu[0.5 0.5]
/
: Wenn dieses Zeichen auftritt, müssen wir<current probability> 0
die aktuelle Wahrscheinlichkeit im Array ersetzen.\
: Wenn dieses Zeichen auftritt, müssen wir0 <current probability>
die aktuelle Wahrscheinlichkeit im Array ersetzen.\n
: Wenn dieses Zeichen auftritt, haben wir eine neue Zeile. Daher gruppieren wir alle Paare aus den obigen 3 Zeichen und addieren sie, um die Wahrscheinlichkeit jedes Elements für die nächste Zeile zu erhalten. Zum Beispiel.[0 0.5 0.25 0.25]
wird konvertiert zu[0 0.75 0.25]
. Beachten Sie, dass das erste und das letzte Element vor und nach ihnen ein implizites Paar (Wert 0) haben.Jetzt müssen wir nur noch den richtigen Charakter identifizieren und die richtige Aktion ausführen. Verwenden wir dazu die üblichen Berechnungen. Der ASCII - Codes für
^
,\
,/
und\n
ist94
,92
,47
, und10
. Nach einigen Versuchen erhalten wir diese einfache Gleichung, um diese Zahlen in 0, 1, 2 und 3 umzuwandeln:gibt:
In einem Array der Länge 4
4f%
wäre das letzte implizit. Also machen wir einfach%13
den ASCII-Code des Zeichens und wählen die richtige Aktion aus einer Reihe von Aktionen aus.Code Erklärung :
Probieren Sie es hier online aus
quelle
Ruby 140
Funktion, die als Eingabe die Zeichenfolge verwendet (kann gut als Pyramide formatiert werden) und ein Array von Gleitkommazahlen zurückgibt.
Testen Sie es online: http://ideone.com/kmsZMe
Ziemlich unkomplizierte Implementierung. Hier ist es ungolfed:
quelle
Ruby, 140
158BytesStimmen Sie nicht weiter darüber ab, wenn es eine bessere Rubinversion gibt .Hier sind weitere Tricks für dich.Unbenannte Funktion mit einem Argument. Darf keine Leerzeichen enthalten. Kann eine nachgestellte Zeile enthalten oder nicht.
Verschwendet 9 Bytes, um zu behandelnAlle Testfälle klappen einwandfrei , siehe hier bei ideone .0 levels
(leere Zeichenfolge).quelle
split
zum Beispiel Ihre Mehrfachleitung .Pyth,
434241 BytesDies setzt voraus, dass die Eingabe keine Leerzeichen enthält. Probieren Sie es online aus: Pyth Compiler / Executor
Pyth, 40 Bytes (fraglich)
Vielen Dank an @isaacg für das Speichern eines Bytes. Beachten Sie, dass diese Version in der Version von Pyth nicht funktionierte, als die Frage gestellt wurde. Es gab einen winzigen Fehler im Compiler. Obwohl dieser Code keine neuen Funktionen von Pyth verwendet (nur Dinge, die lange in den Pyth-Dokumenten waren und hätten funktionieren sollen), ist dies möglicherweise keine gültige Antwort. Entscheide dich selbst.
Probieren Sie es online aus: Pyth Compiler / Executor
Erläuterung:
Wenn ich zum Beispiel momentan die Eingabewahrscheinlichkeiten
G = [0.5, 0.5, 0.0]
und die Zeile habe,H = "^/^"
passiert Folgendes:[(0.5,"^"), (0.5,"/"), (0.0,"^")]
[[0.25,0.25], [0.5,0.0], [0.0, 0.0]]
[0, 0.25, 0.25, 0.5, 0.0, 0.0, 0.0]
[0,0.25], [0.25,0.5], [0.0,0.0], [0.0]]
[0.25, 0.75, 0.0, 0.0]
quelle
hk
.,K@[ZJhkcJ2)x"\/"ek-JK
C #,
274247 BytesNichts Besonderes, komplettes Programm, das Zeilen (mit oder ohne Leerzeichen, es entfernt sie nur) aus STDIN einliest und durch Leerzeichen getrennte Ergebnisse an STDOUT ausgibt.
Ordentlicher Code mit Kommentaren:
quelle
Python 3, 113
Aktualisiert wiederholt den Wahrscheinlichkeitsvektor
P
als Antwort auf jede Zeile. Dieser neue WahrscheinlichkeitsvektorQ
wird jeweils ein Eintrag erstellt. Durchläuft die neuen Slots und berechnet den Beitrag von der rechten Seite aus alsr
, während gleichzeitig der verbleibende Beitrag zum kommenden Slot als berechnet wirdp-r
.Erwartet, dass jede Zeile in mindestens einem Leerzeichen endet, um ein Problem zu vermeiden, bei dem Zeilen mit einem Backslash enden.
quelle
input()
damit umgehen kann.Python 3, 138 Bytes
Funktioniert mit allen Leerzeichen, da alle herausgefiltert werden (von
if'!'<e
.Methode:
r
der Wahrscheinlichkeiten für das Erreichen von Hindernissen und der impliziten Talsohlen darunter. Wir beginnen mit der Liste[1]
.0
der Liste für den führenden Trog ein Extra hinzufügen . Wir entscheiden, ob es das erste Hindernis ist, indem wir den Index vergleichenp
mit der nächsten Dreieckszahl vergleichent*-~t/2
.^:0.5 0.5; /:1 0; \:0 1
). Wir verwenden die folgende Methode:v = ord(char) mod 7 + 1
nachgebend^:4 /:6 \:2
v div 3 / 2
ergibt den ersten Bruch (^:0.5 /:1 \:0
)v mod 3 / 2
ergibt den zweiten Bruch (^:0.5 /:0 \:1
)t + 1
Elemente der endgültigen Lister
.2 Bytes dank Chat-Rat von @ Sp3000.
quelle
Perl, 78
Übernimmt Eingaben ohne Leerzeichen.
Versuch es mit mir .
quelle
TI-BASIC,
7376Nimmt die Eingabe zeilenweise vor und endet, wenn ein Leerzeichen alleine eingegeben wird, da in TI-BASIC weder Zeilenumbrüche noch leere Zeichenfolgen zulässig sind.
Ich bin mir ziemlich sicher, dass ich die richtige Größe habe (TI-BASIC ist tokenisiert, daher benötigt jeder Befehl ein oder zwei Bytes - seq () benötigt eins, inString () benötigt zwei, dim () benötigt eins und so weiter. I zählte die Größe manuell.)
Obwohl der umgekehrte Schrägstrich in einer Zeichenfolge gültig ist, gibt es keine Möglichkeit, einen Schrägstrich aus dem Programm heraus einzugeben, es sei denn, Sie haben Ihren Taschenrechner geändert.
quelle
Javascript - 117
Versucht mit Rekursion, aber das war zu lang ...
Hat Tipp an XNOR für die Subtraktion Idee, die ein Dutzend oder mehr Zeichen rasiert.
Ungolfed:
quelle