Schreiben Sie eine Funktion (mit möglichst wenigen Bytes), die ein zweidimensionales Array mit einer beliebigen Anzahl von Spalten und Zeilen enthält, in denen:
0
stellt leeren block dar,1
stellt Schlangenblock dar.
Die Funktion muss die Anzahl der möglichen Pfade zurückgeben, die die Schlange zurückgelegt hat.
Beispiel 1:
Eingang:
[
[1,1,1,1,1],
[0,0,0,0,1],
[0,0,0,0,1],
]
Ausgabe: 2
Im obigen Beispiel wird die Funktion zurückgegeben, 2
da die Antwort eine der folgenden ist:
Beispiel 2:
Eingang:
[
[1,1,1,1],
[0,0,1,1],
[0,0,1,1],
]
Ausgabe: 6
In diesem Beispiel wird die Funktion zurückgegeben, 6
da die Antwort eine der folgenden ist:
Hinweis:
Bei der Bewertung der Eingabe können Sie davon ausgehen, dass:
- Die Arrays, die Spalten darstellen, haben immer die gleiche Größe (die Arrays sind also rechteckig).
- Es gibt mindestens einen gültigen Pfad.
- Die Schlange kann nicht durch die Ränder gehen (wie es in einigen Versionen der Schlange vorkommen kann);
- Die Schlange wird immer mindestens 2 Blöcke haben;
- Die Schlange kann sich nicht diagonal bewegen.
- Die Wege sind gerichtet. (Zwei Pfade, die an unterschiedlichen Positionen enden, aber ansonsten genau gleich aussehen, sind nicht derselbe Pfad. Dies ergibt die Gesamtsumme.)
code-golf
grid
binary-matrix
Adelin
quelle
quelle
[[0,0,1,1],[0,0,1,1],[0,0,1,1]]
. Die meisten Antworten geben 16, aber eine gibt 15.Antworten:
Wolfram Language (Mathematica) , 16 + 83 = 99 Bytes
Bibliotheksimportanweisung (16 Byte):
Tatsächlicher Funktionskörper (83 Bytes):
Probieren Sie es online!
Beachten Sie, dass in der Frage nur die Anzahl der Hamilton-Pfade in der Grafik abgefragt wird.
Aus irgendeinem Grund
HamiltonianPath
funktioniert die Funktion jedoch nicht wirklich mit gerichteten Graphen ( Beispiel ). Daher habe ich die in dieser Mathematica.SE- Frage beschriebene Problemumgehung verwendet :True
) hinzu, der mit allen anderen Scheitelpunkten verbunden ist.Der Graph wird
MakeGraph
mithilfe der Booleschen Funktion erstellt (ärgerlicherweise gibt es keine direkt äquivalente integrierte Funktion)##||Norm[#-#2]==1&
, dieTrue
genau dann zurückgibt, wenn eines der ArgumenteTrue
oder der Abstand zwischen den beiden Scheitelpunkten vorliegt1
.Tr[1^x]
kann nicht anstelle von verwendetLength@x
werden und<2
kann nicht anstelle von verwendet werden==1
.HamiltonianPath
kann verwendet werden, wenn der Graph ungerichtet ist, wobei der Funktionskörper 84 Bytes benötigt (genau 1 Byte mehr als die aktuelle Einreichung):Probieren Sie es online!
quelle
JavaScript (ES6),
154134 ByteProbieren Sie es online!
Wie?
Methode
Ausgehend von jeder möglichen Zelle füllen wir die Matrix mit Fluten und löschen alle Zellen auf unserem Weg. Immer dann , wenn die Matrix nicht mehr enthält 1 ‚s, erhöhen wir die Anzahl n der möglichen Pfade.
Jeder gültige Pfad wird aufgrund der in der letzten Zelle gewählten Richtung viermal gezählt, was eigentlich keine Rolle spielt. Daher ist das Endergebnis n / 4 .
Rekursive Funktion
Anstatt die rekursive Funktion g () aus dem Rückruf der zweiten Map () wie folgt aufzurufen ...
... definieren wir die rekursive Funktion g () direkt als Rückruf von map () :
Trotz der ziemlich langen Formel,
y=1/y?y:Y
die benötigt wird, um den Anfangswert von y festzulegen, werden insgesamt 2 Bytes gespart.Kommentierter Code
quelle
Jelly ,
1211 BytesProbieren Sie es online!
Erläuterung.
quelle
§ỊML
anstatt§ỊP€S
ein Byte zu speichern - ich denke, es sollte funktionieren?§ÐṂL
was ist ein bisschen schneller.Python 2 ,
257246241234233227214210 BytesProbieren Sie es online!
Gerettet
quelle
w
undh
Python 2, 158 Bytes
Probieren Sie es online!
quelle
Haskell ,
187.155BytesProbieren Sie es online!
quelle