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!
a[m]
auf dem Hypercube war, a[m+1]
wird es auch sein. Und da Sie davon ausgehen können, dass a[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.
a[m+1] = xor(a[m], 2^mod(a[m],n))
ist es irrelevant, ob die Eckpunkte zu einem Hyperwürfel gehören, oder?