Standardowa, rozwiązana kostka Rubika 3 × 3 × 3 ma 6 różnokolorowych ścian, z których każda jest siatką kwadratów 3 × 3 w jednym kolorze. Biała twarz jest naprzeciwko żółtego, czerwona przeciwnie do pomarańczowego, niebieska przeciwnie do zielonego, a kiedy biały jest skierowany w górę, czerwony jest po lewej stronie niebieskiego:
Wyobraź sobie, że mrówka siedzi na środkowym kwadracie białej twarzy, twarzą do czerwonej twarzy. Możesz mu dać 3 polecenia:
- Forward (
^
) - zrób krok w kierunku do następnego kwadratu siatki, przekraczając w razie potrzeby krawędź sześcianu. - W prawo (
>
) - obróć w prawo (zgodnie z ruchem wskazówek zegara) o 90 °, pozostając w tym samym kwadracie siatki. - Lewo (
<
) - obróć w lewo (przeciwnie do ruchu wskazówek zegara) o 90 °, pozostając w tym samym kwadracie siatki.
Biorąc pod uwagę dowolną listę poleceń, znajdź kolory kwadratów odwiedzanych przez mrówkę (nie licząc białego kwadratu początkowego).
Na przykład sekwencja poleceń
^^>^^<^^^
ma ścieżkę, która wygląda następująco:Kolory kwadratów siatki odwiedzanych w kolejności, nie licząc kwadratu początkowego, są
white red red green green green yellow
lub są po prostuwrrgggy
.
Napisz program lub funkcję, która pobiera ciąg znaków polecenia <^>
i wypisuje lub zwraca ciąg znaków wyrobg
(biały, żółty, czerwony pomarańczowy, niebieski, zielony), który odpowiada ścieżce mrówki nad kostką.
Najkrótszy kod w bajtach wygrywa. Tiebreaker to wcześniejsza odpowiedź.
Notatki
- Sześcian jest w powietrzu, a mrówka ma skuteczne pulvilli, dzięki czemu może przemierzać całą kostkę.
- Kostka zawsze pozostaje w stanie rozwiązanym.
- Kolor kwadratu jest rejestrowany tylko po przesunięciu w kwadrat, a nie po obrocie. Początkowy biały kwadrat nie powinien być zapisywany.
- Pojedynczy opcjonalny znak nowej linii może być obecny na wejściu i / lub wyjściu.
Przypadki testowe
input : output
[empty string] : [empty string]
^ : w
< : [empty string]
> : [empty string]
><><<<>> : [empty string]
>^ : w
<<^> : w
^<^<^<^< : wwww
^^ : wr
<^^ : wb
>><<<<^^ : wo
<^^^<^^^^<>^>^^>^ : wbbboooggyo
^^^^^^^^^^^^^^ : wrrryyyooowwwr
<<<^<^>^<^<^<^>^^^^<^>>>>>^^<^>^^<^>^>^>^>< : wwgrwgggoooobbbbyrby
^^>^^<^^^ : wrrgggy
źródło
Odpowiedzi:
Perl,
156143134128 128127125120119117113109 bajtówObejmuje +1 dla
-p
Uruchom z ciągiem kontrolnym na STDIN, np
rubic.pl
:Wyjaśnienie
Starsza wersja:
Wyzwaniem dla tego pytania jest znalezienie układu współrzędnych, który ułatwia śledzenie położenia i kierunku mrówki, a także łatwe identyfikowanie twarzy.
System, który wybrałem, polegał na umieszczeniu standardowych
(x,y)
współrzędnych na twarzy mrówki, tak aby mrówka zawsze była skierowana wy
kierunku ujemnym, a środek jej twarzy był(0,0)
. Więc:Jeśli
y
była już-1
mrówka, opuści obecną twarz i wejdzie na następną. W nowym układzie współrzędnychx
zachowuje swoją wartość, aley'
staje się 1.Daje to łatwy układ współrzędnych w obrębie twarzy. Potrzebuję też czegoś dla samych twarzy. Tam używam tablicy składającej się z
Tak więc początkowa tablica to
(g,b,o,y,r,w)
. Przejście do następnej ściany odpowiada obróceniu ostatnich 4 elementów, więc przejście z białej na czerwoną czyni to(g,b,w,o,y,r)
. Skręcenie w prawo to permutacja pierwszych 5 elementów(o,r,b,y,g,w)
. Skręcanie w lewo jest symulacją permutacji, ale można to również zrobić, obracając w prawo 3 razy, więc zastosuj tę permutację 3 razy. W ogóle nie można odwrócić, stosując permutację 8 razy. W rzeczywistości skręcenie w prawo można również wykonać, stosując permutację 5 razy.Wiedząc o tym, program jest raczej prosty:
Tak więc dla tego ostatniego polecenia obroty prowadzą do pustego łańcucha, a kroki do przodu prowadzą do bieżącej ściany. Dlatego
$_
zostaje zastąpiony przez twarze odwiedzane na każdym kroku.źródło
@1
fragment jest niesamowitym nadużyciem czegoś, co wygląda jak przerażająca funkcja językowa.use strict
. Nawiasem mówiąc, dzięki za moduł 3.Brachylog , 287 bajtów
Oczekuje łańcuch zawierający ruchy jako wejście, a nie wyjście, np
brachylog_main("^^>^^<^^^",_).
wypiszewrrgggy
na standardowe wyjście.Wyjaśnienie
Odpowiednik kodu SWI-Prolog
Jeśli nie chcesz zawracać sobie głowy kompilatorem Brachylog, możesz uruchomić to rozwiązanie w SWI-Prolog przy użyciu następującego kodu (to jest generowane przez kompilator Brachylog):
źródło
PowerShell, 882 bajty
Stosowanie
Zapisz kod w skrypcie i wywołaj go w ten sposób z wiersza poleceń. Zakładając, że katalog roboczy jest katalogiem bieżącym.
Kod
Mniej golfowy kod z wyjaśnieniem
Używanie wielu zmiennych jednoliterowych używanych do rejestrowania aktualnego stanu mrówki (kolor, położenie i orientacja). Mrówka zawsze jest skierowana do góry. Po odczytaniu instrukcji obrotu sześcian jest transponowany w tym kierunku. Zakodowane macierze transpozycji używane do określania nowej pozycji na podstawie aktualnej pozycji.
Kod spełnia wszystkie omawiane przykłady.
źródło
Tcl / Tk, 422 bajty
Niestety, nie mogę tego zmniejszyć. Wersja nie zaciemniona:
Działa poprzez utrzymywanie listy poziomych i pionowych kolorów komórek. ^ <i> to wszystkie polecenia, które poprawnie permutują listy. Bieżąca komórka jest pierwsza na każdej liście.
źródło
Ruby, 132
Ten system pozycji jest niestety bardzo podobny do innych dostępnych odpowiedzi.
x
iz
śledź swoją pozycję na bieżącej twarzy+x
jako kierunek podróży. Naprzód jest zawszex+=1
, a granice każdej twarzy są podzielne przez 3 (nie dbamy o liczbę, tylko jej moduł z 3).m
jest bieżącą twarzą (to oszczędza niektóre bajty)g
jest umieszczony[left, right, behind, opposite, front]
tak, że nie trzeba zmieniaćg[0..1]
na^
<
odbywa się to po prostu>
trzy razy.źródło
Java,
619605 bajtówCóż, tutaj nie ma nic ...
Przynajmniej pokonał PowerShell!
-14 bajtów dzięki @KevinCruijssen
Wyjaśnienie:
W przeciwieństwie do niektórych innych odpowiedzi, w których wykorzystano układ współrzędnych 2-d, użyłem układu 3-d, aby śledzić, gdzie była mrówka.
Kierunek został również zachowany w trójwymiarowy sposób, aby ułatwić zmianę stron i ruch.
Każda twarz miała jedną ze współrzędnych, x, y lub z, ustawioną na 2 (lub -2 dla przeciwnej ściany), aby wskazać, która to była twarz.
Przełączanie twarzy zostało dokonane przez sprawdzenie, czy mrówka miała zamiar zgasnąć (pozycja i kurs mają wartość, która jest taka sama, ale nie 0), upewnij się, że spadnie ona po przekątnej na następną, i zmień nagłówek na inny -przekątna. To było zaskakująco łatwe.
Toczenie było trudniejsze. Upewnienie się, że zawsze będzie zmierzać w tym samym kierunku, wymagało dodatkowej instrukcji if-else dla każdego znaku, co kosztowało mnie wiele bajtów. Ponadto osie „w górę” i „w prawo” musiały być na stałe zakodowane dla każdej strony.
Nieskluczony kod
(Bez zmian w stosunku do poprzedniej edycji dla zachowania przejrzystości metody)
źródło
d[]={"w","g","r","b","o","y"}
->"w,g,r,b,o,y".split(",")
(-1 bajt); 2x'^'
->94
(-2 bajty); 3x==0
-><1
(-3 bajty); 2x==1
-><2
(-2 bajty); etc==2
,==3
,==4
,==5
.