Drunkards Heimreise
In dieser Herausforderung musst du ein Programm schreiben, das einen Säufer simuliert, der von der Bar nach Hause stolpert.
Eingang:
Die Eingabe ist eine Adjazenzmatrix (die einen gerichteten Graphen darstellt), die Pfade darstellt, die der Betrunkene nehmen kann. An jedem Ort wählt der Betrunkene zufällig einen Weg (jede Option hat ungefähr die gleiche Chance und ist unabhängig von vorherigen Entscheidungen).
Angenommen, der Säufer beginnt immer an der Bar (erste Reihe in der Adjazenzmatrix).
Wenn der Betrunkene in eine Sackgasse gerät, kann davon ausgegangen werden, dass er entweder nach Hause gegangen ist oder wegen öffentlicher Vergiftung festgenommen wurde und das Programm seinen Weg zurückkehren sollte.
Es ist davon auszugehen, dass der Graph immer mindestens eine Sackgasse enthält.
Es kann auch davon ausgegangen werden, dass der Säufer den Balken immer verlassen kann (die erste Reihe besteht nicht aus Nullen) und dass, wenn der Säufer an einem Ort festsitzt, die Reihe durch Nullen dargestellt wird.
Ausgabe:
Das Ergebnis wird der Weg sein, den der Betrunkene bei seinem Versuch eingeschlagen hat, nach Hause zu kommen. Die Werte für die Speicherorte können entweder null oder eins sein.
Beispiele:
Input
[1,0,1,1]
[0,0,0,0]
[1,0,0,0]
[1,1,1,1]
Possible Outputs
[0,2,0,3,2,0,0,3,1]
[0,3,0,3,1]
Input
[0,1,1,1,0,1]
[1,0,1,0,1,1]
[0,0,0,0,0,0]
[0,0,0,0,0,1]
[1,0,0,0,0,0]
[0,0,0,0,0,0]
Possible outputs
[0,1,5]
[0,5]
[0,1,4,0,2]
[0,3,5]
[0,3,0,1,4,0,5]
Deterministic path:
Input
[0,0,1,0]
[0,0,0,1]
[0,1,0,0]
[0,0,0,0]
Output
[0,2,1,3]
quelle
[ '1011', '0000', '1000', '1111' ]
.i
mit allen Nullen außer in der Spalte gebeni
?0
1,2,3,5
0
4
Antworten:
Mathematica, 72 Bytes
Dies ist eine Funktion, die die Matrix als Argument verwendet, eine Liste zurückgibt und die 1-Indexierung verwendet.
Die Grundidee ist, mit zu beginnen
Dabei wird die folgende Regel wiederholt auf die Liste angewendet, bis die
{1}
Änderung beendet ist. Die Regel entspricht dem MusterDies bedeutet "eine Liste mit null oder mehr aufgerufenen Elementen,
r
gefolgt von einem aufgerufenen Elementx
." Dies gibtx
als letztes Element in der aktuellen Liste an, und wir ersetzen die Liste durchDas ist die ursprüngliche Liste mit
<stuff>
angehängten. Das fragliche Zeug istDieser nimmt
#[[x]]
(dasx
dritte Element der Eingabematrix) als eine Liste von Gewichten und ordnet sie zun++&/@#
, was fürRange@Length@#
(dh{1,2,3,...}
mit der entsprechenden Länge) kurz ist. Dies wird einen Fehler auslösen, wenn die Gewichte alle Null sind, weshalb es in a eingeschlossen ist##&[]
Diese Meldung wird zurückgegeben, wenn eine Fehlermeldung generiert wird. Dies ist nur eine ausgefallene SchreibweiseSequence[]
, die als "nichts" -Element fungiert (als "{1,2,Sequence[],3}
wertend"{1,2,3}
) und daher die Liste unverändert lässt, wodurch das//.
Ersetzen beendet wird.quelle
R ,
726966 BytesProbieren Sie es online!
Nimmt Eingaben als
logical
Matrix und druckt die 1-basierten Indizes auf die Konsole.quelle
Perl 5
-a0
,5351 BytesGeben Sie die Eingabematrix als separate enge Zeichenfolgen in STDIN ein
Probieren Sie es online!
Beschädigungen
@F
während des Schleifenkörpers werden jedoch durch repariertredo
quelle
MATL , 15 Bytes
Die Ausgabe ist 1-basiert.
Probieren Sie es online! Erste Eingabe . Zweiter Eingang . Dritte Eingabe .
Erläuterung
quelle
Perl 6 , 38 Bytes
Probieren Sie es online!
quelle
Python, 136 Bytes
Unter der Annahme, dass randrange importiert wurde, wird die Null-Indexierung verwendet. Nimmt eine Eingabe m als Adjazenzmatrix
113 keine Importe
s=lambda m,c=0,p=[0],x=0:1 in m[c]and(m[c][x]and s(m,x,p+[x],randrange(len(m)))or s(m,c,p,randrange(len(m))))or p
136 mit Importen
import random as r;s=lambda m,c=0,p=[0],x=0:1 in m[c]and(m[c][x]and s(m,x,p+[x],r.randrange(len(m)))or s(m,c,p,r.randrange(len(m))))or p
quelle
Ruby ,
70 6765 BytesDanke an benj2240 für das Speichern von 2 Bytes!
Probieren Sie es online!
quelle
m[i].sum<1?:[]
.sum
es in 2.4 eingeführt wurde. Früher habe ich.reduce(0, :+)
...JavaScript (ES6), 87 Byte
Probieren Sie es online!
Alternative Version, 81 Bytes
Übernimmt die Eingabe als Array von Binärzeichenfolgen. Die maximal unterstützte Größe beträgt 16x16.
Probieren Sie es online!
quelle
Java 10, 135 Bytes
0-indiziert
Erläuterung:
Probieren Sie es online aus.
quelle
Haskell ,
123118 BytesProbieren Sie es online!
quelle
APL (Dyalog Unicode) , 32
34BytesProbieren Sie es online!
Nimmt ein verschachteltes binäres Array als Eingabe. Gibt jede Iteration in separaten Zeilen aus.
quelle
Python ,
9794 BytesProbieren Sie es online!
In dieser Antwort finden Sie weitere Erklärungen zum Zufallszahlengenerator:
quelle