Einführung:
Ein 3x3x3 Rubik's Cube hat mögliche Permutationen, was ungefähr 43 Trillionen entspricht . Sie haben vielleicht schon einmal von dieser Zahl gehört, aber wie wird sie tatsächlich berechnet?
Ein 3x3x3 Rubik's Cube hat sechs Seiten mit jeweils neun Aufklebern. Betrachtet man jedoch die (äußeren) Teile anstelle von Aufklebern, so hat man sechs Mittelteile; acht Eckstücke; und zwölf Randstücke. Da die Zentren nicht verschoben werden können, können wir diese in den Berechnungen ignorieren. Wie für die Ecken und Kanten:
- Es gibt( ) Möglichkeiten zum Anordnen der acht Ecken. Jede Ecke hat drei mögliche Ausrichtungen, obwohl nur sieben (von den acht) unabhängig voneinander ausgerichtet werden können. Die Ausrichtung der achten / letzten Ecke hängt von den vorhergehenden sieben ab, wenn ( ) Möglichkeiten gegeben sind.
- Es gibt ( ) Möglichkeiten, die zwölf Kanten anzuordnen. Die Hälfte vonDas liegt daran, dass Kanten immer in einer gleichmäßigen Permutation sein müssen, genau dann, wenn die Ecken sind. Elf Kanten können unabhängig voneinander gespiegelt werden, wobei das Spiegeln der zwölften / letzten Kante von den vorhergehenden elf abhängt, wenn ( ) Möglichkeiten gegeben sind.
Zusammen haben wir die folgende Formel:
Quelle: Wikipedia - Rubiks Würfel-Permutationen
Obwohl dies bereits recht komplex aussieht, ist es für einen 3x3x3-Würfel immer noch recht unkompliziert. Für gerade Würfel ist die Formel etwas anders; Dies ist die Formel für einen 4x4x4-Würfel, zum Beispiel:
Welches ist etwa 7,40 Quattuordecillion auf der kurzen Skala .
Und für größere NxNxN-Würfel (dh den aktuellen Weltrekord 33x33x33) wird die Formel erheblich erweitert. Um diese Einführung nicht zu lang zu machen, habe ich stattdessen diese Links hier eingefügt, wo die Permutationen des 4x4x4-Würfels und einiger NxNxN-Würfel anderer Größe mit der folgenden Formel erklärt werden:
Sie wundern sich jetzt vielleicht: Gibt es eine allgemeine Formel, die auf für einen beliebigen x x Würfel basiert ? Das gibt es sicherlich. Hier sind drei völlig unterschiedliche Algorithmen, die alle auf der Basis von exakt dieselben Ergebnisse liefern :
1: Chris Hardwicks Formel:
Probieren Sie es auf WolframAlpha.
2: Christopher Mowlas Trigger Formel:
Probieren Sie es auf WolframAlpha.
3: Christopher Mowlas Primzahlen Formel:
wo ist .
Probieren Sie es auf WolframAlpha.
Herausforderung:
Wählen und implementieren Sie eine dieser drei Formeln (oder Ihre eigene Ableitung), die bei einer Eingabe-Ganzzahl im Bereich das richtige Ergebnis liefert.
Herausforderungsregeln:
- Es steht Ihnen frei, eine andere Formel als diese drei zu verwenden. Beachten Sie jedoch, dass diese drei nachweislich korrekt sind. Wenn Sie eine andere Formel verwenden, fügen Sie bitte einen Link hinzu, über den Sie die Formel erhalten haben (oder wenn Sie selbst darauf gekommen sind, fügen Sie eine ausführliche Erläuterung hinzu). Und ich werde nach allen ganzen Zahlen im Bereich suchen, ob die Ausgabe korrekt ist. Vielleicht könnte Inspiration in der Oeis für diese Sequenz gefunden werden: A075152 .
- Wenn Ihre Sprache automatisch eine wissenschaftliche Ausgabe ausgibt (dh anstelle der Zahl nach der 4x4x4-Formel), ist dies zulässig. Fügen Sie Ihrer Antwort jedoch zusätzlichen Code hinzu, um diese wissenschaftliche Rundung in eine exakte Ausgabe umzuwandeln, damit die Ergebnisse überprüft werden können, da Rundungsfehler aufgrund der Gleitkommapräzision während der Ausführung der Formel in Ihrem Code nicht zulässig sind - das tatsächliche Ergebnis sollte es sein genau.
- Ihr Programm / Ihre Funktion sollte für mindestens die Eingaben im Bereich korrekt sein (obwohl, da bereits eine Riesen-Arsch-Zahl ergibt, wird jedes größere wahrscheinlich auch funktionieren, wenn Sie dies ausgeben können eine richtig).
- Sie dürfen nicht alle möglichen Permutationen mit einem Zähler durchlaufen, da dies in einem angemessenen Zeitraum zu keiner Ausgabe führen würde. Nur die Implementierung einer Formel (entweder eine der drei bereitgestellten, eine Ableitung einer dieser Formeln oder eine völlig neue Formel) oder eine andere Methode, die in angemessener Zeit die richtigen Ergebnisse liefert (natürlich ohne harte Kodierung) ) ist erlaubt. Ich habe darüber nachgedacht, eine eingeschränkte Zeit hinzuzufügen , um dies durchzusetzen, aber ich persönlich bin gegen eine zeitliche Beschränkung in Kombination mit Code-Golf , also werde ich das nicht tun. Vergewissern Sie sich dennoch, dass Ihr Programm die Antworten gibt. Wenn es aus irgendeinem Grund für TIO zu langsam ist, fügen Sie zur Überprüfung einige Screenshots mit der Ausgabe von Ihrem lokalen Computer hinzu.
Allgemeine Regeln:
- Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden. - Für Ihre Antwort gelten Standardregeln mit Standard-E / A-Regeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methoden mit den richtigen Parametern und vollständige Programme vom Rückgabetyp, verwenden. Ihr Anruf.
- Standardlücken sind verboten.
- Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu (z. B. TIO ).
- Außerdem wird dringend empfohlen, eine Erklärung für Ihre Antwort hinzuzufügen.
Testfälle:
Hier die Testfälle für im Bereich (für größere Testfälle können Sie die obigen WolframAlpha-Links verwenden):
n=2
3674160
n=3
43252003274489856000
n=4
7401196841564901869874093974498574336000000000
n=5
282870942277741856536180333107150328293127731985672134721536000000000000000
n=6
157152858401024063281013959519483771508510790313968742344694684829502629887168573442107637760000000000000000000000000
n=7
19500551183731307835329126754019748794904992692043434567152132912323232706135469180065278712755853360682328551719137311299993600000000000000000000000000000000000
n=8
35173780923109452777509592367006557398539936328978098352427605879843998663990903628634874024098344287402504043608416113016679717941937308041012307368528117622006727311360000000000000000000000000000000000000000000000000
n=9
14170392390542612915246393916889970752732946384514830589276833655387444667609821068034079045039617216635075219765012566330942990302517903971787699783519265329288048603083134861573075573092224082416866010882486829056000000000000000000000000000000000000000000000000000000000000000
n=10
82983598512782362708769381780036344745129162094677382883567691311764021348095163778336143207042993152056079271030423741110902768732457008486832096777758106509177169197894747758859723340177608764906985646389382047319811227549112086753524742719830990076805422479380054016000000000000000000000000000000000000000000000000000000000000000000000000000000000
ANMERKUNG: Da dies eine Code-Golf- Herausforderung ist, läuft es im Wesentlichen darauf hinaus, eine dieser drei Formeln (oder eine Ableitung / Ihre eigene Methode, die immer noch die richtigen Ergebnisse liefert) so kurz wie möglich zu implementieren.
floor