Ein standardmäßiger, gelöster 3 × 3 × 3 -Zauberwürfel hat 6 verschiedenfarbige Flächen, wobei jede Fläche ein 3 × 3-Raster aus Quadraten einer Farbe ist. Das weiße Gesicht befindet sich gegenüber dem gelben, das rote gegenüber dem orangefarbenen und das blaue gegenüber dem grünen, und wenn Weiß nach oben zeigt, befindet sich Rot links von Blau:
Stellen Sie sich vor, eine Ameise sitzt auf dem mittleren Quadrat des weißen Gesichts und schaut auf das rote Gesicht. Sie können ihm 3 Befehle geben:
- Vorwärts (
^
) - Machen Sie einen Schritt in die Richtung, in die er zum nächsten Gitterfeld weist, und treten Sie gegebenenfalls über eine Kante des Würfels. - Rechts (
>
) - um 90 ° nach rechts (im Uhrzeigersinn) drehen und dabei im gleichen Rasterfeld bleiben. - Links (
<
) - um 90 ° nach links (gegen den Uhrzeigersinn) drehen und dabei im gleichen Rasterfeld bleiben.
Suchen Sie anhand einer beliebigen Befehlsliste die Farben der Felder, die die Ameise besucht (ohne das weiße Startquadrat).
Zum Beispiel hat die Befehlssequenz
^^>^^<^^^
einen Pfad, der so aussieht:Die Farben der in der Reihenfolge besuchten Gitterquadrate, ohne das Startquadrat, sind
white red red green green green yellow
oder nurwrrgggy
.
Schreiben Sie ein Programm oder eine Funktion, die eine Zeichenfolge der Befehlszeichen aufnimmt und eine Zeichenfolge (weiß, gelb, rot, orange, blau, grün) <^>
ausgibt oder zurückgibt wyrobg
, die dem Pfad der Ameise über den Würfel entspricht.
Der kürzeste Code in Bytes gewinnt. Tiebreaker ist frühere Antwort.
Anmerkungen
- Der Würfel ist in der Luft und die Ameise hat effektive Pulvilli, so dass er den gesamten Würfel durchqueren kann.
- Der Würfel bleibt immer in seinem gelösten Zustand.
- Die Farbe eines Quadrats wird nur bei Bewegung in das Quadrat und nicht bei Drehung aufgezeichnet. Das weiße Startquadrat sollte nicht aufgezeichnet werden.
- Eine einzelne optionale nachgestellte Newline kann in der Eingabe und / oder Ausgabe vorhanden sein.
Testfälle
input : output
[empty string] : [empty string]
^ : w
< : [empty string]
> : [empty string]
><><<<>> : [empty string]
>^ : w
<<^> : w
^<^<^<^< : wwww
^^ : wr
<^^ : wb
>><<<<^^ : wo
<^^^<^^^^<>^>^^>^ : wbbboooggyo
^^^^^^^^^^^^^^ : wrrryyyooowwwr
<<<^<^>^<^<^<^>^^^^<^>>>>>^^<^>^^<^>^>^>^>< : wwgrwgggoooobbbbyrby
^^>^^<^^^ : wrrgggy
quelle
Antworten:
Perl,
156143134128127125120119117113109 BytesBeinhaltet +1 für
-p
Führen Sie mit der Steuerzeichenfolge auf STDIN aus, z
rubic.pl
:Erläuterung
Ältere Version:
Die Herausforderung dieser Frage besteht darin, ein Koordinatensystem zu finden, mit dem sich Position und Richtung der Ameise leicht verfolgen lassen und die Gesichtsidentität dennoch leicht ermitteln lässt.
Das System, für das ich mich entschieden habe, bestand darin, Standardkoordinaten
(x,y)
auf das Gesicht der Ameise zu setzen, sodass die Ameise immer in die negativey
Richtung zeigt, wobei der Mittelpunkt des Gesichts liegt(0,0)
. Damit:Wenn
y
schon-1
, verlässt die Ameise das aktuelle Gesicht und betritt das nächste. Im neuen Koordinatensystemx
behält es seinen Wert, wird abery'
zu 1.Dies ergibt ein einfaches Koordinatensystem innerhalb eines Gesichts. Ich brauche auch etwas für die Gesichter. Dort verwende ich ein Array bestehend aus
Das ursprüngliche Array ist also
(g,b,o,y,r,w)
. Das Bewegen zur nächsten Fläche entspricht dem Drehen der letzten 4 Elemente. Wenn Sie also von Weiß nach Rot wechseln, wird dies bewirkt(g,b,w,o,y,r)
. Nach rechts drehen ist eine Permutation der ersten 5 Elemente, die geben(o,r,b,y,g,w)
. Das Drehen nach links ist eine ähnliche Permutation, kann aber auch durch dreimaliges Drehen nach rechts erfolgen. Wenden Sie diese Permutation also dreimal an. Und überhaupt nicht drehen kann auch durch 8-maliges Anwenden der Permutation erfolgen. Tatsächlich kann das Drehen nach rechts auch durch fünfmaliges Anwenden der Permutation erfolgen.Dies zu wissen, ist das Programm ziemlich einfach:
Bei der letzten Anweisung führen Rotationen zu einer leeren Zeichenfolge und Schritte nach vorne führen zur aktuellen Fläche. Daher
$_
wird bei jedem Schritt durch die besuchten Gesichter ersetzt.quelle
@1
ist das ein erstaunlicher Missbrauch einer entsetzlichen Sprachfunktion.use strict
. Danke übrigens für das Modulo 3.Brachylog , 287 Bytes
Erwartet eine Zeichenfolge, die die Bewegungen als Eingabe enthält, und keine Ausgabe, z. B.
brachylog_main("^^>^^<^^^",_).
wirdwrrgggy
in STDOUT geschrieben.Erläuterung
Äquivalenter SWI-Prolog-Code
Wenn Sie sich nicht um den Brachylog-Compiler kümmern möchten, können Sie diese Lösung in SWI-Prolog mit dem folgenden Code ausführen (dieser wird vom Brachylog-Compiler generiert):
quelle
PowerShell, 882 Byte
Verwendungszweck
Speichern Sie den Code in einem Skript und rufen Sie ihn so über die Befehlszeile auf. Angenommen, das Arbeitsverzeichnis ist das aktuelle Verzeichnis.
Code
Weniger Golf Code mit Erklärung
Unter Verwendung einer Vielzahl von Einzelbuchstabenvariablen wird der aktuelle Status der Ameise (Farbe, Position und Ausrichtung) aufgezeichnet. Die Ameise zeigt immer nach oben. Wenn ein Befehl zum Drehen gelesen wird, wird der Würfel in diese Richtung transponiert. Hartcodierte Transpositionsmatrizen zur Bestimmung der neuen Position basierend auf der aktuellen Position.
Code erfüllt alle fraglichen Beispiele.
quelle
Tcl / Tk, 422 Bytes
Leider kann ich es nicht kleiner bekommen. Nicht verschleierte Version:
Hierfür wird eine Liste horizontaler und vertikaler Zellenfarben verwaltet. ^ <und> sind alle Befehle, die die Listen ordnungsgemäß permutieren. Die aktuelle Zelle ist die erste in jeder Liste.
quelle
Rubin, 132
Dieses Positionssystem ist leider sehr ähnlich zu anderen Antworten da draußen.
x
undz
verfolgen Sie Ihre Position auf dem aktuellen Gesicht mit+x
der Fahrtrichtung. Vorwärts ist immerx+=1
, und die Grenzen jedes Gesichts sind durch 3 teilbar (die Zahl ist uns egal, nur der Modul mit 3).m
ist das aktuelle Gesicht (das spart einige Bytes)g
angeordnet ist ,[left, right, behind, opposite, front]
so dass wir nicht ändern müssen sichg[0..1]
auf^
<
wird einfach>
dreimal ausgeführt.quelle
Java,
619605 BytesNun, hier geht nichts ...
Zumindest hat es Powershell geschlagen!
-14 Bytes dank @KevinCruijssen
Erläuterung:
Im Gegensatz zu einigen anderen Antworten, bei denen ein 2-D-Koordinatensystem verwendet wurde, verwendete ich ein 3-D-System, um zu verfolgen, wo sich die Ameise befand.
Die Richtung wurde auch dreidimensional gehalten, um das Wechseln der Seiten und die Bewegung zu erleichtern.
Für jedes Gesicht wurde eine der Koordinaten x, y oder z auf 2 gesetzt (oder -2 für das gegenüberliegende Gesicht), um zu kennzeichnen, welches Gesicht es war.
Das Wechseln der Gesichter wurde durchgeführt, indem überprüft wurde, ob die Ameise im Begriff war zu fliegen (Position und Steuerkurs haben den gleichen Wert, aber nicht 0). Stellen Sie sicher, dass sie diagonal auf den nächsten fallen würde, und ändern Sie den Steuerkurs auf "nicht" -diagonal. Das war überraschend einfach.
Das Wenden war schwieriger. Um sicherzustellen, dass es immer in die gleiche Richtung geht, ist eine zusätzliche if-else-Anweisung in der Prüfung für jedes Zeichen erforderlich, die mich viele Bytes kostet. Außerdem mussten die Achsen "oben" und "rechts" für jede Seite fest codiert werden.
Ungolfed Code
(Unverändert von der vorherigen Bearbeitung zur Klarheit der Methode)
quelle
d[]={"w","g","r","b","o","y"}
->"w,g,r,b,o,y".split(",")
(-1 Byte); 2x'^'
->94
(-2 Bytes); 3x==0
-><1
(-3 Bytes); 2x==1
-><2
(-2 Bytes); etc für==2
,==3
,==4
,==5
.