Ist es ein Zauberwürfel?

25

Eine verehrte Passzeit von Pedanten soll darauf hinweisen, dass Bilder von "Rubik's Cubes" (auf T-Shirts, Postern etc.) eigentlich nicht lösbar sind.

Das erste, was überprüft werden sollte, ist, dass der Würfel aus den richtigen Teilen besteht. Um lösbar zu sein, benötigt ein Würfel sechs Farben mit jeweils neun Quadraten. Der Würfel benötigt auch jede Kanten- und Eckeinheit (dies sind die kleineren Würfel, aus denen der Würfel besteht), um einzigartig zu sein. Sie müssen nicht nur einzigartig sein, sondern wenn zwei Mittelstücke einander gegenüberliegen, kann kein Rand- oder Eckstück beide Farben enthalten.

Sobald Sie einen Würfel haben, der aus allen richtigen Teilen besteht, müssen Sie noch überprüfen, ob er lösbar ist. Es gibt hier ein paar Regeln, also werde ich mich an einen Experten wenden, um sie zu erklären. Der Spoiler unten erklärt, wie wir das machen können. Wenn Sie daran interessiert sind, das Problem selbst zu lösen, müssen Sie die Website nicht besuchen, um diese Herausforderung zu verstehen oder daran teilzunehmen.

Verknüpfte Erklärung

Ihre Aufgabe ist es, ein Muster als Eingabe zu verwenden und festzustellen, ob es sich tatsächlich um einen lösbaren Rubik's Cube handelt. Um lösbar zu sein, muss es eine Möglichkeit geben, gültige Züge für einen Würfel auszuführen, sodass der Würfel auf jeder Seite nur eine Farbe hat (und die verschiedenen Seiten unterschiedliche Farben haben). Die meisten Rubik-Würfel haben eine Standardfarbe (Weiß steht für Gelb usw.). Möglicherweise wird nicht davon ausgegangen, dass der Lösungsstatus dieser bestimmten Farbe folgt.

Eine gültige Bewegung ist entweder die Drehung einer einzelnen Fläche des Würfels im oder gegen den Uhrzeigersinn. Mit der Drehung der Fläche des Würfels werden auch alle an die Fläche angrenzenden Quadrate gedreht und bleiben mit der Fläche verbunden, die sie zuvor berührt haben.

IO

Sie können den Würfel auf jede vernünftige Weise nehmen. Wenn Ihre Sprache einen eingebauten "Würfelgesichtstyp" hat, der für Sie gut ist, können Sie auch eine 2D-Matrix des Netzes, des Würfels, 1 3 mal 3 Listen für jedes Gesicht verwenden. Sei einfach vernünftig. Wenn Sie wissen möchten, ob ein bestimmtes Format akzeptabel ist, senden Sie einen Kommentar oder einen Ping-Befehl an mich im Chat.

Ihr Eingabeformat muss nur bis zu 9 mögliche Farben unterstützen.

Für die Ausgabe ist dies ein Entscheidungsproblem, daher sollten Sie einen konstanten Wert für "Ja, dies ist ein gültiger Rubiks-Würfel" und einen anderen konstanten Wert für "Nein, dies ist kein gültiger Rubiks-Würfel" ausgeben.


Dies ist daher werden die Antworten in Bytes bewertet, wobei weniger Bytes besser sind.

Testfälle

Hier sind Testfälle. Sie sind als Würfelnetz formatiert, wobei jedes Quadrat ein Buchstabe ist. Verschiedene Buchstaben stehen für verschiedene Farben. Weitere Testfälle können auf Anfrage hinzugefügt werden.

Lösbar

   RRR
   RRR
   RRR
GGGWWWBBBOOO
GGGWWWBBBOOO
GGGWWWBBBOOO
   YYY
   YYY
   YYY


   GRR
   GRR
   ORW
WWRBWYBOOGGY
GGRBWGYBBOOO
OOGRWGYWWRBB
   WYO
   YYB
   YYB

Unlösbar

   RRR
   RRR
   RRR
GGGWWWBBBOOO
GGGWWWBBBOOO
GGGWYWBBBOOO
   YWY
   YYY
   YYY


   RRR
   RRR
   RRR
GGGWWWBBBOOO
GGGWWWBBBOOO
GGGWWWBBBOOO
   YWY
   YYY
   YYY


   RRR
   RRR
   GGG
GGYWYWRBBOBO
GGYWWWROBOOO
GGYWWWRBBOOO
   BBB
   YWY
   YYY


   RRW
   RRW
   GGG
GGYWWYEOBROO
GGYWWYEBBROO
GGOWWYWBBROO
   BBB
   YYW
   YYO
Weizen-Assistent
quelle
14
Ich fühle mich verpflichtet darauf hinzuweisen, dass der Zauberwürfel in Ihrem Avatar nicht lösbar ist. Es hat nur 4 Quadrate auf der Seite, die uns zugewandt ist, während ein normaler Zauberwürfel 9 haben sollte. Ganz zu schweigen von den seltsamen Symbolen oben auf den Quadraten.
DJMcMayhem
2
@DJMcMayhem Meine Kinder haben Zauberwürfel mit nur vier "Unterwürfeln".
Adám
2
@ H.PWiz Nein, das kannst du nicht. Das war in meinen Definitionen implizit, aber ich werde es in der Frage explizit machen.
Weizen-Assistent
2
Ihre Spezifikation enthält keine vollständige Beschreibung der drei Paritätsgesetze des Cubes. 1. Es ist nicht möglich, nur eine Kante um 180 Grad zu drehen (nicht erwähnt). 2. Es ist nicht möglich, nur eine Ecke um 120 Grad zu drehen (nicht erwähnt). ). Ich gebe eine enge Abstimmung ab, bis dies geklärt ist. Eine Erklärung finden Sie unter ryanheise.com/cube/cube_laws.html .
Level River St
4
@LevelRiverSt Beachten Sie, dass der Zauberwürfel in sich geschlossen ist. Jeder kann die mathematischen Formulierungs- und Paritätsgesetze unabhängig voneinander ableiten.
user202729

Antworten:

14

Kubisch , Jahre 1664 Jahre 1631 1089 Bytes

⇒FD2F'R'D2RUR'D2RFD2F'U'
⇒Ff1F'
⇒LFf1F'L'
⇒F'f1F
⇒F2f1F2
⇒L'F2f1F2L
⇒D'F'f1FD
⇒LR'FLR'DLR'B2L'RDL'RFL'RU2
⇒LFf8F'L'
⇒R'F'f8FR
⇒Ff8F'
⇒F'f8F
⇒ULU'f8UL'U'
⇒U'R'Uf8U'RU
⇒F2f8F2
⇒Df15D'
⇒D'f15D
⇒D2f15D2
⇒UF2UF2D'L2B2U'B2DL2F2D2B2D2F2
⇒U'DL2UD'B2
⇒UF2UF2D'L2B2D'R2UR2F2D2B2U2B2
⇒BL'BU2D2F'RF'U2D2
⇒LD'F2U'B2U'RU2R'F2R2F2D'R2DF2D
⇒B2URB2D2B2RB2U'D'L2D'B2
⇒B2LF'U'B2UFL'R2B2U'D2L2D'B2U
⇒B2RB2D2B2RB2U'L2UD'F2U'F2B2
⇒D2R'FUB2U'F'RU2B2D'F2R2UF2UF2
⇒B2R2U'L'D2B2U2R'U2R2F2L2R2UR2
⇒D2L'B2U2F2RUL2U'F2R2U'R2U2F2DL2D'
⇒UB2U'L2DL2B2DB2D'B2
⇒BR'BL2B'RBL2B2
⇒UF2B2U'F2B2U'F2L2R2B2R2
⇒R2U'F2DR2UF2D'R2DF2R2D'F2
⇒U'F2DF2UL2F2DL2DF2L2D2F2
⇒U2D'L2U'F2L2U'B2L2R2U'L2B2
⇒F2D'R2U2L2B2UF2L2U2F2L2UF2R2
⇒[f1]3
⇒[f2f37]3
⇒[f3f38]3
⇒[f4f39]3
⇒[f5f40]3
⇒[f6f41]3
⇒[f7f42]3
⇒[f8f43]2
⇒[f9f44]2
⇒[f10f45]2
⇒[f11f46]2
⇒[f12f47]2
⇒[f13f48]2
⇒[f14f49]2
⇒[f15f50]2
⇒[f16f51]2
⇒[f17f52]2
⇒[f18f53]2
⇒[f19f54]2
⇒[f20f55]3
⇒[f21f56]4
⇒[f22f57]5
⇒[f23f58]6
⇒[f24f59]7
⇒[f25f60]8
⇒[f26f61]9
⇒[f27f62]9[f27f62]2
⇒[f28f63]9[f28f63]3
⇒[f29f64]9[f29f64]4
⇒[f30f65]2
⇒[f31f66]3
⇒[f32f67]4
⇒[f33f68]5
⇒[f34f69]6
⇒[f35f70]7
rs[f36f71]8

Ausgabe wenn lösbar: Solved!
Ausgabe wenn nicht lösbar: (leer, keine Ausgabe)

Die Eingabe sollte als Cubically Cube-Dump formatiert werden (siehe DebugAbschnitt). Dies wurde vom OP ausdrücklich erlaubt.

Erläuterung

Dieses Programm verwendet den Ansatz eines Teufelsalgorithmus , um jeden möglichen Zustand des Würfels in derselben Gruppe wie der gelöste Würfel zu durchlaufen. Wenn der Würfel lösbar ist, wird er irgendwann gelöst, bevor der Algorithmus abgeschlossen ist (vorausgesetzt, der von mir verwendete Algorithmus funktioniert ordnungsgemäß).

Jede Zeile, die mit (0x84 in Cubicallys Codepage) beginnt, ist eine Funktionsdefinition. Diese Funktionen bauen aufeinander auf und bilden den eigentlichen Teufelsalgorithmus. Die erste auszuführende Zeile ist die letzte:

rs[f36f71]8

rLiest einen Würfel aus stdin und setzt den Speicherwürfel darauf. sVersetzt den Interpreter in den "Solvemode", was bedeutet, dass er beendet und gedruckt wird, Solved!wenn der Würfel zu irgendeinem Zeitpunkt aufgelöst wird (nachdem er nicht aufgelöst wurde). Die restlichen Befehle (die einfach f36f718 Mal wiederholt werden ) entsprechen dem endgültigen Algorithmus am unteren Rand der verknüpften Seite:

(D) = (CP) = (CPT8) = [(CPC8)(CPT7)]8 (3,847,762,288,469,010,006,992 moves)

(D) is the Devil's Algorithm. If you apply it to the cube, it will be solved at some point before you have done the algorithm once. As you can see, it is terribly long, nearly a thousand times more moves than there are possible positions.

Wie kann ich es ausführen?

Sie können es online ausprobieren , aber dieser Link funktioniert nicht. TIO wird fast definitiv eine Zeitüberschreitung aufweisen, bevor dieser Algorithmus abgeschlossen ist (die maximale Laufzeit für einen Interpreter beträgt 60 Sekunden). Wenn der Würfel nicht lösbar ist, dauert es bis zu 11 Millionen Jahre, bis Cubically fertig ist (bei ~ 15,2 Millionen Zügen pro Sekunde, was meine Cloud9-IDE erhält).

Zusätzlich benötigen Sie viel Speicher, um 3 Sextillionen Züge auszuführen. Kubisch kann ungefähr 4 Millionen Bewegungen pro Sekunde ausführen, aber der Vorgang wird höchstwahrscheinlich aufgrund von übermäßigem Speicher abgebrochen . Es stirbt nach 15 Sekunden auf meiner VM mit 512 MB Speicher. Warum sollte die Ausführung von Bewegungen auf einem bereits zugewiesenen Flat-Array-Kostenspeicher erfolgen? Fand ein Speicherleck (oder zwanzig) und reparierte es .

Hier ist eine viel besser lesbare Version, die sich genauso verhält.

Aber ich möchte wirklich sehen, dass es funktioniert!

Der erste tatsächliche Zug, der in diesem Teufelsalgorithmus ausgeführt wird F2, ist folgender F2:

   000
   000
   555
113222133444
113222133444
113222133444
   000
   555
   555

Dies wird in der Tat in 0,007 Sekunden auf TIO ausgeführt .

Wie kann das verbessert werden?

Es gibt sicherlich mehr Teufelsalgorithmen; Ich habe einen gefunden, der weniger als ein Dreißigstel der Bewegungen verwendet, die dieser macht. Dies würde jedoch einige tausend Bytes (etwa 100 MB mehr) und einige Dutzend Stunden der Konvertierung einer komplexen Hamilton-Schaltung in kubischen Code kosten.

Es ist auch möglich, einige der Funktionen zu entfernen und sie direkt in die Schleife unten einzufügen. Ich werde jedoch einige Bytes für die Lesbarkeit opfern.

Außerdem erwäge ich eine Änderung des Loop-Verhaltens von Cubically, damit ich die Algorithmen einfacher sieben- oder achtmal wiederholen kann (anstatt sie nur mit den Funktionsaufrufen fest zu codieren, die sieben- oder achtmal in der Quelle wiederholt werden). Oder ich arbeite etwas Magie mit dem Notizblock aus und spiele dies mit mehr Loops.

Beachten Sie, dass ich im Interpreter weiterhin alles Mögliche optimieren werde, damit dies in Zukunft möglicherweise auf einem durchschnittlichen PC funktioniert!


Kubisch 2 Bytes

r▦

Die obige Antwort gefällt mir besser, daher füge ich sie als alternative Lösung hinzu. Dies dauert weniger als eine Sekunde als einige Millionen Jahre.

r    read cube from standard in
 ▦   and solve it

Ausgabe, wenn der Würfel lösbar ist: (nichts)
Ausgabe, wenn der Würfel nicht lösbar ist: Error: The cube has reached an unsolvable state.

MD XF
quelle
Funktioniert das, wenn wir die Seiten tauschen? Beispiel: 2 ist gegenüber 4 im Cube-Dump. Funktioniert dies, wenn 2 gegenüber 5 und 4 gegenüber 0 ist?
Weizen-Zauberer
1
@WheatWizard Ja, im Solvemode wird geprüft, ob jede Fläche eine eindeutige Ganzzahl hat und ob diese Ganzzahl die einzige auf der Fläche ist.
MD XF
Ok, wie es sollte. Ich kannte Cubical nicht genug, um zu wissen, ob dies der Fall war oder nicht.
Weizen-Zauberer
@WheatWizard Nur um sicherzugehen, dass ich Sie richtig verstehe - das ist genau das, worauf Sie sich bezogen haben, oder?
MD XF
Ja. Und es sollte lösbar sein.
Weizen-Zauberer
4

APL (Dyalog Classic) , 190 bis 174 Bytes

{∧/~∊(×1 2 3|+.-⌿↑⊃∘⍋¨¨¨a)({2|≢∪{⍵⌊⍵[⍵]}⍣≡⍵,0}¨⍳⌿↑⌽b)((∪≢∩)¨/b←(⊃∘⍋⌽⊢)¨¨¨a),6≢≢∪⊃⊃a←{c4⍴⊂⍬⋄c[+/1≠i],←(≠/×i←↑⍳33){⊂⌽⍣⍺⊢⍵~' '}¨,⌿(3|∘.+⍨⍳3)⍉⍤¯11 0 1\⍵1c}¨⍵(3 3∘⍴¨1 1∘⌷¨⍵)}

Probieren Sie es online!

Das Argument ist eine 3x2-Matrix (Reihe0: vorne hinten, Reihe1: links rechts, Reihe2: oben unten) aus 3x3-Zeichenmatrizen. Gibt 1 für einen lösbaren Zauberwürfel zurück, andernfalls 0.

In der TIO-Verknüpfung tliest die Funktion , die nicht in der Zeichenanzahl enthalten ist, 9 Eingabezeilen, konvertiert sie vom Standardeingabeformat (ein Netz) in die erforderliche 3x2 x 3x3-Matrix, ruft die Lösung auf und druckt OK, wenn das Ergebnis angezeigt wird ist wie erwartet.

Der Algorithmus teilt den gegebenen Würfel in 26 Würfel - Zeichenfolgen der Länge 3 (Ecken), 2 (Kanten) und 1 (Zentren). Es werden auch die 26 Würfel eines gelösten Würfels mit den gleichen 6 zentralen Würfeln erzeugt. Alle folgenden Kriterien müssen erfüllt sein:

  • Es gibt keine Duplikate unter den 6 Zentren

  • Die Mengen der gegebenen / gelösten Würfel stimmen bis zur Drehung überein - z. B. betrachten Sie 'WBR'und 'BRW'der gleiche Würfel, aber nicht'BWR'

  • Die Paritäten sowohl der Eckpermutation als auch der Kantenpermutation sind gleichmäßig

  • die Modulo-3 - Summe der Eckendrehindizes (zB den „kleinsten“ Brief nimmt Bals Bezugspunkt haben wir: 'BRW'→0, 'WBR'→1, 'RWB'→2) Übereinstimmung zwischen den angegebenen und gelösten Würfeln; Gleiches gilt für die Ecken Modulo 2

ngn
quelle