Herausforderung
Diese Herausforderung haben Sie ein Programm schreiben, das in zwei ganzen Zahlen nimmt n
und m
die Anzahl nicht-schneidenden Schleifen auf dem und gibt n
durch m
Torus hergestellt durch ab (0,0)
und nur Schritte unternommen und nach rechts. Sie können sich Torus als Gitter vorstellen, das oben, unten und an den Seiten umlaufend angeordnet ist .
Dies ist Code-Golf, so dass die wenigsten Bytes gewinnen.
Beispiel
Wenn zum Beispiel die Eingabe ist n=m=5
, ist ein gültiger Spaziergang
(0,0) -> (0,1) -> (0,2) -> (1,2) -> (2,2) -> (2,3) -> (2,4) ->
(2,0) -> (3,0) -> (4,0) -> (4,1) -> (4,2) -> (4,3) ->
(0,3) -> (1,3) -> (1,4) ->
(1,0) -> (1,1) -> (2,1) -> (3,1) -> (3,2) -> (3,3) -> (3,4) -> (4,4) ->
(0,4) -> (0,0)
wie in der Grafik gezeigt.
Einige Beispiele für Ein- / Ausgänge
f(1,1) = 2 (up or right)
f(1,2) = 2 (up or right-right)
f(2,2) = 4 (up-up, up-right-up-right, right-right, right-up-right-up)
f(2,3) = 7
f(3,3) = 22
f(2,4) = 13
f(3,4) = 66
f(4,4) = 258
code-golf
combinatorics
grid
topology
Peter Kagey
quelle
quelle
Antworten:
Gelee , 28 Bytes
Ein monadischer Link, der eine Liste akzeptiert
[m,n]
, die die Anzahl angibt.TIO-jt1qe1v9 ... obwohl es wenig Sinn macht, ist es viel zu ineffizient.
(Ich kann nicht einmal
[2,3]
lokal mit 16 GB RAMlaufen)!Wie?
Brute Force - Erstellt Koordinaten einer gekachelten Version, die groß genug sind, und filtert dann die Potenz dieser Punkte zu den Pfaden, bei denen die Nachbarn nur um eins in einer Richtung zunehmen. Filtert dann zu den Pfaden, die bei einer minimalen Koordinate (dh dem Ursprung) beginnen. Entfernt gleichzeitig diese Startkoordinate von jeder. Verwenden Sie dann die Modulo-Arithmetik, um in einen Torus zurückzukehren, und filtern Sie alle doppelten Koordinaten heraus (dh diejenigen, die Schnittpunkte enthalten) und filtern Sie schließlich nach solchen mit minimalen Endkoordinaten (dh mit dem Ursprung zurück), um die Länge des Ergebnisses zu erhalten.
quelle
Python 2 , 87 Bytes
Probieren Sie es online!
Das Interessante dabei ist die Verwendung einer komplexen Zahl
z
zum Speichern der Koordinate der aktuellen Position. Wir können durch Hinzufügen nach oben und durch Hinzufügen1
nach rechts gehen1j
. Zu meiner Überraschung arbeitet modulo mit komplexen Zahlen so, dass wir den Zeilenumbruch für jede Dimension separat behandeln können:%m
Handeln auf den Realteil und%(n*1j)
Handeln auf den Imaginärteil.quelle
k:=x+y*m
. Ich frage mich, ob es kürzer wäre, esk
direkt zu verwenden(x,y)
,x+y*m
anstatt es zu verwendenx+y*1j
. Schade, dass Python 3 keine komplexen Module zulässt.JavaScript (ES6), 67 Byte
Übernimmt die Eingabe als
(m)(n)
.Probieren Sie es online!
Damit es für jede Eingabe funktioniert, könnten wir BigInts für 73 Bytes verwenden :
Probieren Sie es online!
JavaScript (ES6),
76 7372 ByteÜbernimmt die Eingabe als
(m)(n)
.Probieren Sie es online!
Kommentiert
quelle
Haskell,
8880 BytesProbieren Sie es online!
Einfache Brute-Force-
a
Methode: Probieren Sie alle Aufwärts- / Rechtskombinationen aus, lassen Sie die Kreuzungspositionen fallen (wir behalten alle Positionen, die wir besucht haben, in der Liste ), und zählen Sie die Positionen, die irgendwann wieder die Position erreichen(0,0)
.Der Grundfall der Rekursion ist, wenn wir eine Position ein zweites Mal besuchen (
elem(x,y)a
). Das Ergebnis ist0^0
=1
wenn die Position ist(0,0)
und zur Anzahl der Schleifen zählt oder0
(0^x
mitx
Nicht-Null) sonst und die Anzahl der Schleifen nicht erhöht.Edit: -8 Bytes dank @xnor.
quelle
|elem(x,y)a=0^(x+y)
, und(0!0)[]
sein kann0!0$[]
.Jelly , 44 Bytes
Probieren Sie es online!
quelle
Java 8, 120 Bytes
Probieren Sie es online aus.
quelle
CJam (50 Zeichen)
Online-Demo . Dies ist ein Programm, das zwei Eingaben von stdin übernimmt.
Endlich haben wir eine Antwort auf die Frage
Präparation
quelle
Jelly ,
5439 BytesProbieren Sie es online!
Ich habe dies als separate Antwort auf meine andere Gelee-Frage gepostet, weil es eine völlig andere Methode ist. Dies entspricht im Prinzip eher der Antwort von @ Arnauld. Es verwendet eine rekursive Funktion, die alle möglichen Pfade durchläuft, bis sie einen Punkt erreicht, an dem sie bereits angekommen ist, und dann das Ergebnis einer Überprüfung zurückgibt, ob sie wieder am Start ist. Ich vermute, dass noch ein paar Bytes abgeschabt werden könnten. Jetzt geändert, um den Slice-Operator zu verwenden. Es funktioniert gut für bis zu 5x5. Die Rekursionstiefe sollte höchstens mx n betragen.
quelle