Ich habe mich kürzlich über die Graphentheorie, insbesondere Hypercubes , informiert und über interessante Möglichkeiten nachgedacht, Pfade darauf zu konstruieren. Folgendes habe ich mir ausgedacht.
Wie Sie vielleicht wissen, können Sie einen n-dimensionalen Hyperwürfel konstruieren, indem Sie alle n-Tupel, die aus 1
und 0
als Eckpunkte bestehen, nehmen und verbinden, wenn sie sich in einer Ziffer unterscheiden. Wenn Sie diese Binärziffern als Ganzzahl interpretieren, erhalten Sie ein Diagramm mit gut nummerierten Eckpunkten. Zum Beispiel für n=3
:
Angenommen, Sie möchten einen Spaziergang auf diesem Hyperwürfel machen und am Scheitelpunkt beginnen 0
. Wie bestimmen Sie nun, welchen Scheitelpunkt Sie als Nächstes besuchen möchten? Die Regel, die ich mir ausgedacht habe, ist, die Nummer a
des Scheitelpunkts, auf dem Sie sich befinden, zu nehmen, sein mod(a,n)
s-Bit umzudrehen (nullbasierte Indizierung) und zum resultierenden Scheitelpunkt zu wechseln. Formal kann diese Regel rekursiv definiert werden als
a[m+1] = xor(a[m], 2^mod(a[m],n)).
Wenn Sie diese Regel befolgen, bleiben Sie immer auf dem Würfel und bewegen sich entlang der Kanten. Der resultierende Pfad sieht folgendermaßen aus
Wie Sie sehen können, werden Sie im Kreis gehen! Tatsächlich endet Ihr Pfad in allen Dimensionen und für alle Startpunkte in einer Schleife. Zum Beispiel für n=14
und a[0]=0
es sieht so aus
Für den begeisterten Ambler ist die Länge seiner geplanten Route eine wichtige Information. Ihre Aufgabe ist es also, eine Funktion oder ein Programm zu schreiben, das die Hypercube-Dimension und n
den Startscheitelpunkt a[0]
als Eingabe verwendet und die Anzahl der Scheitelpunkte in der resultierenden Schleife ausgibt.
Testfälle
n a[0] Output
-----------------
3 0 6
14 0 50
5 6 8
17 3 346
Regeln
- Standardlücken sind verboten
- Ausgabe / Eingabe kann in jedem geeigneten Format erfolgen
- Sie können davon ausgehen
a[0]
, dass es sich um einen gültigen Scheitelpunkt handelt
Wertung
Der kürzeste Code in Bytes gewinnt.
Wenn Sie weitere Informationen zu diesem Thema haben, würde ich mich freuen zu hören!
quelle
a[m+1] = xor(a[m], 2^mod(a[m],n))
ist es irrelevant, ob die Eckpunkte zu einem Hyperwürfel gehören, oder?a[m]
auf dem Hypercube war,a[m+1]
wird es auch sein. Und da Sie davon ausgehen können, dassa[0]
es sich um einen gültigen Scheitelpunkt handelt, müssen Sie sich so gut wie nicht um Hypercube-Inhalte kümmern und einfach die Regel befolgen.Antworten:
Gelee, 9 Bytes
Nimmt zwei Befehlszeilenargumente.
Probieren Sie es hier aus .
quelle
Haskell, 124
Dies findet den Kreis durch den Zwei-Zeiger-Algorithmus, der in unterschiedlichen Geschwindigkeiten herumläuft, und verwendet / missbraucht Haskells Ansatz für Listen stark (zum Beispiel sind die beiden Zeiger tatsächlich Listen).
g
ist die Funktion, die die Antwort berechnet. Geben Sie esn
und danna[0]
und es wird die Nummer an Sie zurückgeben (beachten Sie, dassn
definiert werden sollte, um vom TypInt
zu sein, um Typmehrdeutigkeiten zu vermeiden).quelle
JavaScript (ES6), 69 Byte
Gibt 18812 für (23, 10) zurück.
quelle
MATL ,
383728 BytesDies funktioniert in der aktuellen Version (15.0.0) der Sprache.
Probieren Sie es online aus !
Erläuterung
quelle
Pyth,
2217 BytesErläuterung:
Probieren Sie es hier aus .
quelle