Sekwencja ruchów jest sekwencją ruchów (zakrętów) na Kostce Rubika (notacja znajduje się poniżej). Oprócz pustej sekwencji ruchów istnieje wiele innych sekwencji ruchów, które nie mają żadnego wpływu na kostkę. Te sekwencje ruchów nazywamy sekwencjami tożsamości.
Niektóre z tych sekwencji identyczności są oczywiste do ustalenia, jak U2 R R' U2
lub U D2 U' D2
. W pierwszym wykonywane są dwa losowe ruchy, U2 R
a następnie natychmiast cofane R' U2
. Drugi jest podobny. Pierwsze dwa losowe ruchy, U D2
a następnie cofane, ale w odwrotnej kolejności U' D2
. Działa to tylko, ponieważ ruch U
wpływa tylko na kawałki górnej warstwy, a ruch D2
tylko na kawałki dolnej warstwy. Możesz zobaczyć wizualizację tych dwóch sekwencji ruchów.
Inne sekwencje tożsamości mogą wcale nie być oczywiste. Na przykład sekwencja R' U' R' F' U F U' R' F R F' U' R U2 R
. Jest dość długi, ale nie ma żadnego wpływu na kostkę.
Przenieś notację
Ruch opisuje obrót jednej warstwy jednej z sześciu ścian sześcianu. Ruch składa się z jednej litery reprezentującej twarz, po której następuje opcjonalny przyrostek reprezentujący kąt obrotu.
Litery i odpowiadające im twarze to U (w górę - strona skierowana w górę), D (w dół - strona skierowana w dół), R (w prawo - strona skierowana w prawo), L (w lewo - strona skierowana w lewo) , F (przód - strona skierowana do ciebie) i B (tył - strona skierowana od siebie).
Jeśli nie ma przyrostka, twarz jest obrócona o 90 stopni w prawo, przyrostek '
oznacza, twarz jest obrócona o 90 stopni w lewo, a przyrostek 2
oznacza, że twarz jest obrócona o 180 stopni w prawo.
Jeśli masz jakieś problemy z notacją, po prostu użyj http://alg.cubing.net , gdzie możesz wizualizować takie sekwencje ruchów.
Wyzwanie
Twoim zadaniem jest napisanie programu, który określa, czy sekwencje ruchu są tożsamością, czy nie.
Możesz napisać pełny program lub funkcję. Powinien otrzymać ciąg zawierający sekwencję ruchów (ruchy są oddzielone spacjami) jako dane wejściowe (przez STDIN, argument wiersza poleceń, argument zachęty lub funkcji), a dane wyjściowe (przez wartość zwracaną lub STDOUT) mają wartość logiczną lub odpowiednią liczbę całkowitą ( Prawda - 1 - sekwencja tożsamości / Fałsz - 0 - brak sekwencji tożsamości).
Jeśli sufiks '
powoduje problemy w języku programowania, możesz użyć innego symbolu, ale nie cyfrowo. R F2 U3
nie jest dozwolone.
Jest to codegolf, dlatego wygrywa najkrótszy kod (w bajtach).
Przypadki testowe
"" -> True
"U2 R R' U2" -> True
"U D2 U' D2" -> True
"U2 R U2 R'" -> False
"R' U' R' F' U F U' R' F R F' U' R U2 R" -> True
"L'" -> False
"B B2 B' B2" -> True
"D D2 D'" -> False
"R F' D2 U B' F2 B' U2 D2 F2 B2 U F R'" -> True
"D2 U' R2 U F2 D2 U' R2 U' B' L2 R' B' D2 U B2 L' D' R2" -> False
"R U R' U' R' F R2 U' R' U' R U R' F' R2 U R2 U' R2 U' D R2 U' R2 U R2 D'" -> True
"R U R' U' R' F R2 U' R' U' R U R' F' R2 U' R2 U R2 U' D R2 U' R2 U R2 D'" -> False
"B2 F2 U' F2 U R2 F2 U2 B D' R' D' R2 D' F2 U' F U R2 U R B D B D2 L2 D' F2 U D' R' D B R2 D2 F2 R' F2 D2" -> True
"R U2 R' U R' U2 R U2 R U R' U' R' U R U2" -> False
"U F B' R' U F' R U' F' B L U' F L'" -> False
"R2 U' R' U' R U R U R U' R" -> False
"R' F R' B2 R F' R' B2 R2" -> False
źródło
R F2 U3
?U3
, to możesz po prostu dodać sufiks do cyfry.R2 D2
.That is F(orward), B(ackward), L(eft), R(ight), U(p), D(own)
Odpowiedzi:
Haskell,
263261247243 znakówRaczej prosty algorytm; każdy sześcian składa się z 1,2,4 lub 8 części kodujących jego położenie i orientację; 4 kawałki na sześcian krawędzi, 8 na narożnik, 7 szafek są nieruchome.
c
c przekształca każde słowo wejścia w sekwencję zwojów CW i!
wysyła każdy fragment zgodnie z zakrętem.i
jest mi stanowisko dentity.f
jest głównym F maść.Nie jestem zbyt zadowolony z
c
funkcji homp, ale nie mogę znaleźć sposobu, aby ją skrócić (jednak @Nimi zrobił)źródło
c(x:"2")=[x,x]
ic(x:_)=[x,x,x]
. Oszczędza 2 bajty.i=sequence[s,s,s]
i zmienisz wszystkie krotki na listy (tzn.:(x,y,z)
Staje się[x,y,z]
) - zapisuje ~ 9 znaków. Wstawienie oszczędza jeszcze 4. Usunięcie_
skrzynki z!
zapisuje kolejne 11.i
, dzięki. Nie jestem pewien, co masz na myśli przez wstawianiei
- pamiętaj, że pojawia się dwukrotnie w definicji dlaf
. Nie jestem pewien, co masz na myśli mówiąc o opuszczeniu_
skrzynki -_->a
całkowite pominięcie lub przeniesienie jej na górę daje niewyczerpujący wyjątek wzoru, a przeniesienie jej na górę i tak nie uratuje żadnych postaci. Udało mi się jednak zapisać tam 5 znaków.Sześciennie ,
64 bajtówWygrywam: P
Notatnik jest inicjowany do zera. Ósma „twarz” zawiera 1, jeśli sześcian jest nierozwiązany, a 0 w przeciwnym razie.
Wypróbuj online!
źródło
J -
232, 220, 381, 315296 bajtówTo rozwiązanie koduje wszystkie operacje jako permutacje ścian i działa w oparciu o fakt, że wszystkie skręty ścian są w rzeczywistości takie same, przy obrocie całej kostki.
Edycja : trochę więcej gry w golfa
Inne niż w poprzednich próbach, to nie brać pod uwagę obrót rożny.
f
jest tylko funkcją pomocniczą.r
wykonuje obrót jednej twarzy. twarz jest kodowana w następujący sposób:ta kolejność ułatwia kodowanie obrotów i zwrotów akcji.
t
to przysłówek, który przekręca twarz pod pewnym obrotem sześcianu, wybierając twarz.X
iY
są przysłówkami, które przyjmują jako lewy argument liczbę w tym kierunku całej kostki.Kolejny wiersz określa wszystkie obroty: 3 znaki na obrót: nazwę, liczbę obrotów i kierunek.
Ostatni wiersz definiuje czasownik testowy
T
, konwertując 3 i'
na notację Mocy, odwracając kolejność działania, dodając wektor testowy i ostatecznie wyliczając całość.Więcej szczegółów na życzenie.
źródło
Python 3: 280 znaków
To nie jest uczestnik wyzwania. Po pierwsze dlatego, że sam zadałem to wyzwanie, a po drugie dlatego, że nie jest to mój kod. Wszystkie kredyty należą do Stefana Pochmanna , który odkrył ten niesamowity sposób symulowania Kostki Rubika. Zrobiłem tylko trochę golfa i kilka drobnych zmian w odniesieniu do wyzwania.
Idea tego jest następująca.
s
reprezentuje położenie kawałkiUF
,UR
i tak dalej. Na przykład:s = ['DF', 'BL', ...]
oznacza, że elementUF
jest w pozycjiDF
, elementUR
jest w pozycjiBL
, ...Jak zmienia się pozycja elementu podczas wykonywania ruchu. Jeśli wykonasz
U
ruch, wszystkie naklejki (kolory)U
warstwy, które są skierowane do przedniej ściany, przesuwają się na lewą twarz. Naklejki lewej twarzy przesuwają się do tyłu, te po prawej i te na przednią twarz. Kodowane przezFLBR
. Kilka przykładów:UF
ruchy doUL
,UFR
ruchy doULF
i tak dalej. Dlatego zastosowanie ruchu jest po prostu translacją powierzchni elementów na odpowiedniej warstwie.źródło