Wir können einen Zauberwürfel wie folgt als Netz darstellen (wenn gelöst):
WWW
WWW
WWW
GGGRRRBBBOOO
GGGRRRBBBOOO
GGGRRRBBBOOO
YYY
YYY
YYY
Jeder Buchstabe stellt die entsprechende Farbe dar ( W
ist weiß, G
grün usw.)
Es hat sich gezeigt, dass es genau (~ Billionen) verschiedene Permutationen gibt, in denen sich ein Zauberwürfel befinden kann.
Ihre Aufgabe ist es, eine ganze Zahl zwischen und und die entsprechende Permutation wie oben gezeigt auszugeben. Sie können wählen, wie die Permutationen sortiert werden sollen, aber der von Ihnen verwendete Algorithmus muss angezeigt werden, um eine eindeutige und korrekte Permutation für jede mögliche Eingabe zu generieren.
Ungültige Permutationsregeln
Entnommen von dieser Seite
Zunächst muss die Mitte jeder 3x3-Fläche gleich bleiben, da das mittlere Quadrat auf einem Zauberwürfel nicht gedreht werden kann. Der gesamte Würfel kann gedreht werden, wobei sich die Position einer Fläche ändert. Dies wirkt sich jedoch nicht auf das Würfelnetz aus.
Wenn wir sagen, dass jede Permutation eine Parität hat, basierend auf der Parität der Anzahl von Swaps, um diese Permutation zu erreichen, können wir sagen
Jedes Eckstück hat drei mögliche Ausrichtungen. Es kann richtig ausgerichtet sein (0), im Uhrzeigersinn (1) oder gegen den Uhrzeigersinn (2). Die Summe der Eckorientierungen bleibt immer durch 3 teilbar
Bei jeder legalen Drehung auf dem Rubik's Cube wird immer eine gerade Anzahl von Kanten umgedreht, sodass nicht nur ein Teil falsch ausgerichtet sein kann.
Unter Berücksichtigung der Permutation aller Ecken und Kanten muss die Gesamtparität gerade sein, was bedeutet, dass jeder legale Zug immer eine gerade Anzahl von Swaps ausführt (ohne Berücksichtigung der Ausrichtung).
Die folgenden drei Netze sind beispielsweise ungültige Ausgaben:
WWW
WWW
WWW
GGGWWWBBBOOO
GGGRRRBBBOOO
GGGRRRBBBOOO
YYY
YYY
YYY
(Too many whites/not enough reds)
WRW
WRW
WRW
GGGRWRBBBOOO
GGGWRRBBBOOO
YYGRWROOOBBB
YYY
GGY
YYY
(There are two red/green center squares and no white/yellow center squares.
In all valid permutations, the center squares are all different colours)
WWW
WWW
WWW
GGGRRRBBBOOO
GGGRRRBBBOOO
GGGRRRBBOYOO
YYY
YYY
YYB
(The yellow/orange/blue corner is rotated into an impossible permutation)
Regeln
- Sie müssen nachweisen, wie Sie möchten, dass der Algorithmus gültig ist. Sie müssen nicht jede einzelne Permutation aufzählen, solange Sie die Gültigkeit Ihres Algorithmus nachweisen.
- Sie müssen Ihrer Antwort eine Art Gültigkeitsnachweis beifügen. Dieser Beweis kann die Gültigkeit in jeder akzeptierten Beweismethode beweisen, mit Ausnahme der Aufzählung aller Möglichkeiten.
- Sie können auf Wunsch auch eine andere Eingabemethode verwenden, sofern:
- Die Eingabe ist begrenzt
- Jeder Eingang entspricht einem eindeutigen Ausgang
- Sie erläutern deutlich das Eingabeformat und wie es den einzelnen Ausgaben entspricht
- Sie können die Zeichen verwenden 6 verschiedene ASCII - Zeichen verwendet , ändern, zwischen 33 (
!
) und 126 (~
), stattWGRBOY
- Sie können beliebig ausgeben, sofern es sich um eine übersichtliche Darstellung eines Würfels handelt, in der alle 6 Flächen angezeigt werden können, einschließlich eines gültigen Würfelnetzes, einer einzelnen Zeichenfolge oder eines 3D-Renderings. Wenn Sie sich über ein bestimmtes Format nicht sicher sind, zögern Sie nicht, in den Kommentaren nachzufragen.
Dies ist ein Code-Golf, so dass der kürzeste Code in Bytes in jeder Sprache gewinnt.
Beispiel für gültige Ausgaben
YYY
YYY
YYY
GGGRRRBBBOOO
GGGRRRBBBOOO
GGGRRRBBBOOO
WWW
WWW
WWW
(The `W` and `Y` faces have been swapped)
ZZZ
+++
+}}
+[[}77ZZ7bbb
bb[}[[7}}+Z7
bb[}++[}}+Z7
7bb
[7Z
[7Z
(To start with, the colours have been mapped W -> +, G -> b, R -> [, B -> }, O -> Z and Y -> 7.
Then, the moves L, R, U and F' have been applied, in that order.
Notice that each centre square is different, and corresponds to the same colour as in the mapping)
quelle
Antworten:
Holzkohle ,
334297 BytesProbieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Geben Sie die Ganzzahl in die Variable ein
q
.Teilen Sie
q
durch 3⁷, und geben Sie den Rest eine
. Betrachtete
man dann eine Zahl in der Basis 3, so setzt man eine Ziffere
so, dass sich ihre Ziffern (in der Basis 3) zu einem Vielfachen von 3 addieren. Auf diese Weise könnene
die Rotationen der Ecken definiert werden.Teilen Sie
q
durch 8!, Und geben Sie den Rest einz
. (8! Wird vorübergehend gespeichertd
, um ein Byte zu speichern.) Auf diese Weise könnenz
die Positionen der Ecken definiert werden.Teilen Sie
q
durch 2¹ und geben Sie den Rest einh
. Betrachteth
man dann eine Zahl in der Basis 2, so setzt man eine Zifferh
so, dass sich ihre Ziffern (in der Basis 2) zu einem Vielfachen von 2 addieren. Auf diese Weise könnenh
die Umkehrungen der Kanten definiert werden.Schleife über eine Zeichenfolgendarstellung der Zentren.
Springe zu der Position jedes Zentrums und drucke es aus.
Verfolgen Sie die Parität der Eckpositionen in Variable
w
.Erstellen Sie eine Reihe von Eckpositionen.
Erstellen Sie eine Reihe von Eckfarben.
Schleife zweimal, einmal für Ecken, einmal für Kanten, im Folgenden als "Würfel" bezeichnet.
Durchlaufen Sie die Anordnung der Würfelfarben.
Extrahieren Sie die nächste Cube-Position aus
z
und aktualisieren Sie die Parität inw
. Verwenden Sie diese Parität für die vorletzte Kante. Dies stellt sicher, dass die Summe der Paritäten der Kanten und Ecken gleichmäßig ist.Drucken Sie den Würfel an dieser Position aus und passen Sie ihn für die nächste Drehung an oder drehen Sie ihn entsprechend.
Entfernen Sie die Drehung oder Klappe von
e
.Erstellen Sie ein Array von Kantenpositionen. Dies wird das zweite Mal in der Schleife verwendet.
Erstellen Sie eine Reihe von Kantenfarben.
Überschreiben der Ecke Variablen
z
unde
mit den entsprechenden Kantenvariablenq
undh
so , dass die Kanten permutieren und während des zweiten Durchlaufs der Schleife umgedreht.quelle
Ruby ,
570408 BytesProbieren Sie es online!
Originalversion mit Arrays von magischen Zahlen anstelle von magischen Strings
Probieren Sie es online!
Eine anonyme Funktion, die in ihrer aktuellen Form eine Eingabe von zwei Ganzzahlen akzeptiert, was zulässig zu sein scheint: "Sie können eine alternative Eingabemethode auswählen." Das erste ist die Permutation im Bereich von 0 bis
12!*8!/2 - 1
und das zweite ist die Ausrichtung der Teile im Bereich von 0 bis2**11 * 3*7 - 1
. Die Ausgabe im gelösten Zustand ist die folgende Zeichenfolge:Weiteres Golfen
Es müssen ungefähr 10 weitere Zeichen gespeichert werden, indem das Ausgabeformat auf die folgende Form eingestellt wird. Dies würde jedoch die Lesbarkeit beeinträchtigen, so dass ich dies derzeit nicht tun werde
Erläuterung
Permutation
Intern wird der gelöste Zustand durch die Reihe der Oktalzahlen im Array dargestellt
a
. Die Eingabeg
wird durch die Zahlen geteilt,12..1
wobei der Modul verwendet wird, um eine Kante auszuwählen und zu entfernena
und in diese zu platzierenz
. Sobald dies erledigt ist, bleiben nur die Ecken ina
, wird alsog
durch die Zahlen geteilt,8..1
wobei der Modul verwendet wird, um eine Ecke zu entfernena
und darin zu platzierenz
.Da es nicht genügend Informationen gibt, um die Reihenfolge der letzten beiden Ecken zu bestimmen, wurde der Wert
g
von zum Zeitpunkt ihres Eintreffens auf Null heruntergeteilt, sodass sie immerz
in der ursprünglichen Reihenfolge hinzugefügt werden. Anschließend wird geprüft, ob die Gesamtpermutation gerade oder ungerade ist. Falls erforderlich, werden die letzten beiden Ecken vertauscht, um die Permutation gerade zu machen.Orientierung
Es gibt verschiedene Möglichkeiten zu entscheiden, ob eine Ecke oder Kante in der richtigen Ausrichtung ist, wenn sie sich nicht an der gelösten Stelle befindet. Für die Zwecke dieser Antwort wird eine Ecke in der richtigen Orientierung in Betracht gezogen , wenn es zeigt ,
0
oder1
auf der Ober- oder Unterseite. Daher ändert das Drehen der Ober- oder Unterseite nicht die Ausrichtung der Ecken. Durch Drehen der anderen Flächen wird zwar die Ausrichtung geändert, die Gesamtparitätssumme bleibt jedoch unverändert. Die Kanten werden in der richtigen Ausrichtung berücksichtigt, wenn sie ein2
oder4
nach vorne / hinten oder ein3
oder5
nach links / rechts zeigen. Dies bedeutet, dass die Drehung von oben oder unten um eine Vierteldrehung die vier Kanten kippt, die Drehung der anderen Flächen jedoch den Kippstatus unverändert lässt.Die Eingabe enthält explizite Informationen für alle außer der ersten Kante und der letzten Ecke. Die 11 niedrigstwertigen Bits
h%2048
werden summiert und der Modul wird verwendet, um die Ausrichtung der ersten Kante zu bestimmen.h
wird mit 2 multipliziert, indem es zu sich selbst addiert wird, und der Wert für die Ausrichtung der ersten Kante wird als niedrigstwertiges Bit addiert. Die Ausrichtung der letzten Ecke wird durch fortschreitendes Subtrahieren der Ausrichtung der anderen Ecken von ermitteltj
. Für die allerletzte Ecke (wobeii/19
=1
) wird der Wert vonj%3
zuh
(der auf Null reduziert wurde) addiert und dies bestimmt die Ausrichtung der letzten Ecke.Die Zeichenfolge
b
wird mit dem Text für die Gesichtsmitten vorinitialisiert.h
wird durch das2
Zwölffache und dann durch das3
Achtfache geteilt, wobei die Modulos verwendet werden, um die Ausrichtung der Stücke zu bestimmen. In jedem Fall wird die Zahl inz
in eine Zeichenfolge mit der entsprechenden Anzahl von Ziffern (2 oder 3) umgewandelt und die Zeichenfolge dann dupliziert. Dadurch kann die korrekte Drehung der vom Modulo gefundenen Ziffern durch Indizieren und Anhängen aus der Zeichenfolge extrahiert werdenb
Anzeige
Schließlich werden die Roh-Aufkleber unter Verwendung der magischen Zahlen in der Indextabelle von
b
in ein besser lesbares Format kopierts
.quelle