Ein Zauberwürfel hat 6 Farben: Rot, Orange, Gelb, Weiß, Blau und Grün. Rote und orangefarbene, gelbe und weiße sowie blaue und grüne Gesichter befinden sich auf gegenüberliegenden Seiten.
Das Netz eines gelösten Zauberwürfels sieht folgendermaßen aus:
Y
BRGO
W
Und die Kacheln sehen so aus:
Y Y Y
Y Y Y
Y Y Y
B B B R R R G G G O O O
B B B R R R G G G O O O
B B B R R R G G G O O O
W W W
W W W
W W W
Herausforderung
Bei Rotationen, umgekehrten Rotationen oder doppelten Rotationen wird ausgegeben, wohin ein gelöster Würfel als ASCII-Grafik oder als Bild transformiert wird (Leerzeichen sind nicht erforderlich, können vorhanden sein oder nicht, nachfolgende Leerzeichen sind zulässig.).
Die Eingabe erfolgt in Form einer Drehung (und eines optionalen Modifikators). Die Rotationsnotation lautet wie folgt : U
(p), L
(eft), F
(ront), R
(ight), B
(ack), D
(own); 2
(double) '
oder i
(inverse).
Alle normalen Drehungen erfolgen im Uhrzeigersinn um 90 °, die umgekehrten gegen den Uhrzeigersinn.
Erklärung zum Uhrzeigersinn : Stellen Sie sich den Würfel vor, während Sie das rote Gesicht betrachten und das gelbe Gesicht oben ist. Drehen Sie dann den Würfel so, dass das Gesicht, das das Programm dreht, Ihnen zugewandt ist. Auf diese Weise wird die Uhrzeigersinn funktionieren. (Mit Ausnahme der Rückseite drehen Sie den Würfel in diesem Fall horizontal.)
Eingang
Eingabe wird eine Liste von Zügen sein.
Ausgabe
Eine ASCII-Grafik, die den Würfel oder ein Bild des Würfelnetzes darstellt.
Beispiele
Eingabe : (leer)
Ausgabe :
Y Y Y
Y Y Y
Y Y Y
B B B R R R G G G O O O
B B B R R R G G G O O O
B B B R R R G G G O O O
W W W
W W W
W W W
Eingabe : U
(hoch)
Ausgabe :
Y Y Y
Y Y Y
Y Y Y
R R R G G G O O O B B B
B B B R R R G G G O O O
B B B R R R G G G O O O
W W W
W W W
W W W
Eingabe : U'
oder Ui
(invers nach oben)
Ausgabe :
Y Y Y
Y Y Y
Y Y Y
O O O B B B R R R G G G
B B B R R R G G G O O O
B B B R R R G G G O O O
W W W
W W W
W W W
Eingabe : U2
(verdoppeln)
Ausgabe :
Y Y Y
Y Y Y
Y Y Y
G G G O O O B B B R R R
B B B R R R G G G O O O
B B B R R R G G G O O O
W W W
W W W
W W W
Eingabe : L'
(links umgekehrt)
Ausgabe :
R Y Y
R Y Y
R Y Y
B B B W R R G G G O O Y
B B B W R R G G G O O Y
B B B W R R G G G O O Y
O W W
O W W
O W W
Eingabe : R
(rechts)
Ausgabe :
Y Y R
Y Y R
Y Y R
B B B R R W G G G Y O O
B B B R R W G G G Y O O
B B B R R W G G G Y O O
W W O
W W O
W W O
Eingabe : U2 L' D
(Double Up, Inverse Left, Down)
Ausgabe :
O Y Y
R Y Y
R Y Y
G B B W O O B B B R R Y
G B B W R R G G G O O Y
O O Y G B B W R R G G G
R O O
W W W
W W W
Regeln
- Keine Lücken erlaubt.
- Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes, der das Problem löst.
S
,E
,M
,x
,y
,z
,u
/Uw
,d
/Dw
,r
/Rw
,l
/Lw
,f
/Fw
,b
/Bw
bewegt sich , wie gut? Oder nur die Standard - :U
,D
,R
,L
,F
,B
und ihre Gegenuhrzeigersinn Variante mit Apostroph ('
)? Off-Topic: Ich frage mich immer mit Rubik's Cube verwandten Fragen, sind Sie auch ein Twisty Puzzles-Sammler?Antworten:
Ruby,
370 339305 BytesLetzte Änderung: Einige Bytes, die durch Neuanordnung der Plotformeln und Entfernen unnötiger Klammern eingespart wurden. Eine enorme Ersparnis durch das Umschreiben der Cube-Generation - ich hätte nie gedacht, dass Ruby ein eingebautes System für kartesische Produkte hat!
Anonyme Funktion.
Akzeptiert ein Array von Zeichenfolgen, die jeweils eine Seitenumdrehung darstellen (eine einzelne Zeichenfolge mit Leerzeichen zwischen jeder Seitenumdrehung enthält zusätzliche 6 Byte.)
Gibt eine rechteckige 9x12-Zeichenfolge zurück.
Kurze Erklärung
Dies basiert eng auf einem Konzept aus meiner Antwort auf diese Frage , das wiederum auf einem ähnlichen Konzept von Jan Dvorak basierte.
Die erste Zeile generiert ein Array mit 27 Elementen, das die 27 Cubies darstellt. Jeder Würfel wird durch einen dreidimensionalen Vektor dargestellt, in dem das Vorzeichen seine aktuelle Position darstellt und die Größe jeder Koordinate den ASCII-Code für die Farbe des Aufklebers darstellt.
Beispielbewegung: Prüfen Sie für R für jeden Würfel, ob die x-Koordinate> 0 ist, und drehen Sie sie in diesem Fall um 90 Grad, indem Sie die y- und z-Koordinaten vertauschen und das Vorzeichen von einer davon vertauschen.
Nehmen Sie eine 9x12-Anordnung von Räumen und zeichnen Sie den Würfel hinein. Für jeden Würfel und jede Achse prüfen wir, ob der Aufkleber vorhanden ist (Koordinate in dieser Achse ungleich Null), und ermitteln, wohin er gehen soll. Dann nehmen wir die Koordinate und führen aus
.abs.chr
, um die Zahl in das gewünschte Zeichen zu ändern und es zu zeichnen.Ungolfed im Testprogramm (per 339 Byte edit)
Ausgabe
quelle
Javascript (ES5), 1615 Byte
Ungolfed:
Dies war eine sehr schwierige Herausforderung.
Erläuterung
Nehmen Sie den Beispielanruf
s("R U' F")
.Das Programm kann nur x-, y- und R-Bewegungen ausführen.
U'
ist gleichU U U
, also ersetze das.F
ist gleichy y y R y
, also ersetze das.R U' F'
ist also gleichR U U U y y y R y
, was das programm ausführen kann.cstate wird mit einem gelösten Würfel definiert. Ein Würfel wird durch ein Array dargestellt, das 6 Arrays mit den 9 Aufklebern enthält. Das erste Array ist für R, das zweite für U, das dritte für F, D, B, das letzte Array ist für L. Wenn ein y ausgeführt werden muss, tauscht das Programm die vier Arrays von vorne, links, hinten und rechts aus. Für ein x tauscht es vorne, unten, hinten und oben. Jede Drehung dreht auch die anderen Gesichter, die nicht vertauscht wurden. AR move dreht das rechte Gesicht und tauscht den rechten Teil des vorderen, oberen, hinteren und unteren Gesichts aus.
Dies könnte modifiziert werden, um Probleme mit allen Arten von Zügen zu lösen, indem sie mit x, y und R definiert werden.
quelle
R U' F2
konvertiert wirdR U' F F
zuerst, dannR U U U F F
, dann ,R x y R y y y x x x x y R y y y x x x x y R y y y x x x y y y R y y y y R y
das es führt dann? Seltsam ... aber sehr originell. +1 :) Wie bist du auf diese Idee gekommen?U'
inU U U
, aberx
es undy
s sind wirklich gut. Ich möchte das auch stehlen: p'
und2
und ersetzt dann alle Züge.C,
17151709168613361328 Bytes25 Bytes gespart dank @KevinCruijssen!
Bisher keine Antworten, daher habe ich beschlossen, meine eigene Lösung zu finden.
Probieren Sie es online!
Ungolfed alte Version:
quelle
for(b=1;b<8;b++)for(a=1;a<11;a++)r[b][a]=c[b];
nachfor(b=1;b<8;)for(a=1;a<11;)r[b][a++]=c[b++];
undfor(i=1;i<=9;i++)
nachfor(i=0;++i<=9;)
und einige der anderen For-Loops auch. Sieelse if
können die Einstellung auch auf nur ändern,if
wenn Sie sie aktivierenif(d==66)B(r);if(d==76)L(r);...
. Soferni
dies nicht negativ sein kann, können Sie die Einstellungif(i%3==0)
aufif(i%3<1)
zweimal ändern . Und ich bin mir sicher, dass man noch mehr Golf spielen kann. Schön, eine Antwort auf Ihre eigene Herausforderung zu sehen. :)if
s undi
obwohl, ich werde sie bearbeiten, sobald ich nach Hause gehe. Vielen Dank!else
s Bork das Programm, Golf-Loops Bork das Programm, die Sache miti
funktioniert. Danke trotzdem.else if
Wechselif
? : S In jedem derelse if
s, die Sie vergleichend==##
, bin ich verwirrt, warum dies nicht der Fall ist. Wiederum programmiere ich C nicht, also fehle ich vielleicht etwas, das C nicht kann, aber dennoch. Ah, ich bin froh, dass ich mit dem Modulo helfen konnte,<1
anstatt==0
Python 3,
610 563 533526 Bytes-7 bytes danke an meinen kollegen rhsmits (echt nett
d,*c
form & entfernung überflüssiger )Dies ist ein volles Programm.
Superflip und alle Tests gibt es bei ideone oder Try it online!
Das Programm:
YBRGOW
von Aufklebern.r
die nur die Aufkleber auf einer Fläche um eine Vierteldrehung im Uhrzeigersinn drehtU
die dasU
Gesicht um eine Vierteldrehung im Uhrzeigersinn dreht, indemr
die Aufkleber auf dem oberen Streifen umLFRB
eine Vierteldrehung im Uhrzeigersinn aufgebracht und gedreht werdeny
dier
auf denU
undD
Flächen und Scheiben ausgeführt wirdLFRB
- dies führt eine Drehung des gesamten Würfels in der
y
Achse durch (die durchU
und verläuftD
)- die Drehung erfolgt im Uhrzeigersinn, wenn von oben gesehen wird
z
, die eine Drehung des gesamten Würfels imz
Uhrzeigersinn um eine Vierteldrehung durchführtR
(die Achse läuft durchR
undL
) - diesmal weil die Flächen in unserem Netz so ausgerichtet sind (wie im OP angegeben) müssen dasB
und dieU
Gesichter umdrehen (sie wechseln von den horizontalen zu den vertikalen Teilen des Netzes und umgekehrt)input()
(die auszuführenden Züge), die einem Zeichen vonBUDLRF
(tatsächlichB-U
) möglicherweise gefolgt von einem Zeichen entspricht'i2
'i2
zur Anzahl der Umdrehungen im Uhrzeigersinn durch (die Ordnungszahlen dieser Mod6
erledigen den Job, mit einem Dummya
zum Nachgeben,1
wenn keiner vorhanden ist)y
undz
, einer Vierteldrehung fürU
(die jetzt als Gesicht angewiesen wird) und anschließend den Aufrufen zum Umkehren der Reihenfolge der durchgeführten Setups zuzuordnen. Nehmen Sie dann die Ordnungszahl des Gesichtszeichens modulo11
durch7
KartenB:0 U:1 D:2 L:3 F:4 R:5
, eine einfache Indizierung in einen String der geteilten Sequenzen Funktionsnamen durch Leerzeichen erlaubt.d
, um den Druck zu verkürzenU
undD
Hier ist der Superflip :
quelle
Python
760750649 Bytesschamlos gestohlen die Idee, nur 3 Umdrehungen von @Paul Schmitz zu verwenden: D
neue Version:
Ich habe meistens nur eine Menge Numpy-Listen geschnitten und die eingebauten Dreh- und Rollfunktionen verwendet. Die Eingabe erfolgt durch direkten Aufruf der Funktionen mit
eval()
ungolfed ..
Testeingang:
Kommentare oder Vorschläge werden sehr geschätzt :)
quelle
of using only 3 rotations
falsch. Das Programm wandelt eine beliebige Sequenz in eine Sequenz mit mehr Zügen um. Bei der EingabeF F F F
werden mehr als 3 Umdrehungen verwendet, wenn in konvertiert wirdy y y R y y y y R y y y y R y y y y R y
. Es werden drei Arten von Rotationen verwendet.C 839 Bytes
Da dies kein vollständiges Programm ist (Funktion mit Eingabe eines String-Arguments und Ausgabe an die Konsole), müssen Sie es folgendermaßen aufrufen:
Verwenden Sie jeweils nur einen Aufruf, da die Funktion globale Variablen verwendet und ändert.
Ungolfed:
Wie Sie sehen, besteht die Hauptidee darin, einen vollständig datengesteuerten Ansatz zu verwenden: Die verschiedenen Rotationen werden als Listen von Indizes ausgedrückt, die permutiert werden müssen. Der Permutationscode kann daher sehr kurz und allgemein sein.
quelle
f(h,g)int*g;{
l(g,m){
n(char*o){
printf("%s",a)
puts(a)
Kubisch 2 Bytes
Probieren Sie es online!
Erläuterung:
Wenn eine externe Ausgabe zulässig ist, ist dies eine Alternative. 1 Byte:
Probieren Sie es online!
Cubically speichert seinen Speicherwürfel automatisch ab,
STDERR
wenn das Programm endet. Es wird jedoch auch vorher der Notizblock gedruckt.quelle
+1
JavaScript (ES6), 820
Eine Portierung der Buggy-Antwort von @Paul Schmitz. Es ist immer noch nicht vollständig golfen, aber es hat den Mehrwert, dass es funktioniert.
Das Hauptproblem in der ursprünglichen Antwort ist, dass eine einzelne Funktion Q nicht für alle Bewegungen ausreicht, die an einer Rotation beteiligt sind. Ich musste 2 weitere Funktionen O und N hinzufügen. Alle von ihnen werden nur in der Rechtsdrehungsfunktion R aufgerufen.
Vielleicht besser lesbar
quelle
update()
nicht in meiner Konsole definiert, während das Snippet ausgeführt wird