Czczony czas przejścia pedantów polega na tym, że zdjęcia „kostek Rubika” (na koszulkach, plakatach itp.) Nie są w rzeczywistości możliwe do rozwiązania.
Pierwszą rzeczą, którą należy sprawdzić, jest to, że sześcian składa się z odpowiednich elementów. Aby rozwiązać zagadkę, sześcian potrzebuje sześciu kolorów z dziewięcioma kwadratami. Kostka potrzebuje również każdej jednostki krawędzi i narożnika (są to mniejsze kostki, które składają się na kostkę), aby była unikalna. Muszą być nie tylko wyjątkowe, ale jeśli dwa środkowe elementy są naprzeciw siebie, żadna krawędź lub narożnik nie może zawierać obu tych kolorów.
Gdy masz kostkę złożoną ze wszystkich odpowiednich elementów, musisz sprawdzić, czy można ją rozwiązać. Tutaj jest kilka zasad, więc odłożę się do eksperta, aby je wyjaśnić, spoiler poniżej wyjaśnia, jak możemy to zrobić. Jeśli chcesz samodzielnie rozwiązać problem, nie musisz odwiedzać witryny, aby zrozumieć lub wziąć udział w tym wyzwaniu.
Twoim zadaniem jest pobranie wzorca jako danych wejściowych i ustalenie, czy jest to faktycznie sześcian Rubika do rozwiązania. Aby można go było rozwiązać, musi istnieć sposób wykonywania prawidłowych ruchów na kostce, tak aby kostka miała tylko jeden kolor na każdej powierzchni (a różne ściany miały różne kolory). Większość kostek Rubika ma standardową kolorystykę (biały jest przeciwny do żółtego itp.), Możesz nie zakładać, że stan rozwiązania odpowiada tej konkretnej kolorystyce.
Prawidłowym ruchem jest obrót w prawo lub w lewo o jedną powierzchnię sześcianu. Wraz z obrotem powierzchni sześcianu obracają się również wszystkie kwadraty graniczące z twarzą, pozostając w kontakcie z twarzą, której wcześniej dotykali.
IO
Możesz wziąć kostkę w dowolny rozsądny sposób. Jeśli twój język ma wbudowany typ „sześcianu”, co jest dobre dla ciebie, to jest dobre jako dane wejściowe, w przeciwnym razie możesz wziąć tablicę 2D sieci, kostki, 1 3 na 3 listy dla każdej twarzy. Po prostu bądź rozsądny. Jeśli chcesz wiedzieć, czy określony format jest akceptowalny, wpisz komentarz lub wyślij mi ping na czacie, a dodam wyzwanie, aby określić jego ważność.
Twój format wejściowy wymaga obsługi maksymalnie 9 możliwych kolorów.
Dla danych wyjściowych jest to problem decyzyjny, dlatego powinieneś wypisać jedną stałą wartość dla „Tak, to jest poprawna kostka Rubika” i jedną inną stałą wartość dla „Nie, to nie jest poprawna kostka Rubika”.
To jest golf golfowy, więc odpowiedzi będą liczone w bajtach, przy czym mniej bajtów będzie lepszych.
Przypadki testowe
Oto przypadki testowe. Są one sformatowane jako sieć sześcianu z każdym kwadratem jako pojedynczą literą. Różne litery reprezentują różne kolory. Na życzenie można dodać więcej przypadków testowych.
Rozpuszczalny
RRR
RRR
RRR
GGGWWWBBBOOO
GGGWWWBBBOOO
GGGWWWBBBOOO
YYY
YYY
YYY
GRR
GRR
ORW
WWRBWYBOOGGY
GGRBWGYBBOOO
OOGRWGYWWRBB
WYO
YYB
YYB
Nierozstrzygalny
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
źródło
Odpowiedzi:
Sześciennie ,
166416311089 bajtówDane wyjściowe, jeśli możliwe do rozwiązania: Dane
Solved!
wyjściowe, jeżeli nie można rozwiązać: (pusty, brak danych wyjściowych)
Dane wejściowe powinny być sformatowane jako sześcienny zrzut kostki (patrz
Debug
sekcja). Zostało to wyraźnie dozwolone przez PO.Wyjaśnienie
Program ten wykorzystuje podejście Diabelskiego Algorytmu do iteracji w każdym możliwym stanie kostki w tej samej grupie co rozwiązany sześcian. Jeśli sześcian da się rozwiązać, zostanie on rozwiązany w pewnym momencie przed zakończeniem algorytmu (zakładając , że użyty algorytm działa poprawnie).
Każda linia rozpoczynająca się od
⇒
(0x84 na stronie kodowej Cubically) jest definicją funkcji; funkcje te łączą się ze sobą, tworząc rzeczywisty algorytm diabła. Pierwszy wiersz do wykonania to ostatni:r
czyta kostkę ze standardowego wejścia i ustawia do niej kostkę pamięci.s
ustawia interpreter w trybie „solvemode”, co oznacza, że kończy działanie i drukuje,Solved!
jeśli kostka zostanie rozwiązana (po nierozwiązaniu) w dowolnym momencie. Reszta poleceń (które powtarzają sięf36f71
8 razy) odpowiada ostatecznemu algorytmowi na dole połączonej strony:Jak mogę to uruchomić?
Możesz spróbować online , ale ten link nie działa. TIO prawie na pewno przekroczy limit czasu przed zakończeniem działania tego algorytmu (maksymalny czas działania interpretera wynosi 60 sekund). Jeśli kostki nie da się rozwiązać, algorytm ten zajmie do 11 milionów lat, aby Cubically skończył (z prędkością około 15,2 miliona ruchów na sekundę, co dostaje mój Cloud9 IDE ).
Dodatkowo potrzebujesz dużo pamięci, aby wykonać 3 sekstyliony ruchów. Cubically może wykonać około 4 milionów ruchów na sekundę, ale proces najprawdopodobniej zostanie zabity z powodu nadmiernej pamięci . Umiera po 15 sekundach na mojej maszynie wirtualnej z 512 MB pamięci.Dlaczego wykonywanie ruchów w już przydzielonej pamięci z płaską macierzą? Znalazłem wyciek pamięci (lub dwadzieścia) i naprawiłem go .Oto o wiele bardziej czytelna wersja, która zachowuje się w ten sam sposób.
Ale naprawdę chcę zobaczyć, że to działa!
Pierwszym faktycznym ruchem wykonanym w algorytmie tego diabła jest
F2
, więc najszybszą kostką do rozwiązania byłby ten, w którym zmieszanoF2
:To faktycznie działa w 0,007 sekundy na TIO .
Jak można to poprawić?
Z pewnością jest więcej algorytmów diabła; Znalazłem taki, który wykonuje mniej niż trzydzieści ruchów, jakie wykonuje ten jeden. Kosztowałoby to jednak kilka tysięcy bajtów (około 100 MB więcej) i kilkadziesiąt godzin konwersji złożonego obwodu hamiltonowskiego na kod Cubic.
Możliwe jest również usunięcie niektórych funkcji i umieszczenie ich prosto w pętli na dole. Jednak poświęcę trochę bajtów dla pewnej czytelności.
Dodatkowo zastanawiam się nad modyfikacją zachowania pętli Cubically, dzięki czemu mogę łatwiej powtarzać algorytmy 7 lub 8 razy (zamiast po prostu kodować je za pomocą wywołań funkcji powtarzanych 7 lub 8 razy w źródle). Albo popracuję nad magią z notatnikiem i zagram w golfa, używając więcej pętli.
Pamiętaj, że będę nadal optymalizował wszystko, co możliwe w tłumaczu, więc może to kiedyś działać na przeciętnym komputerze!
Sześciennie, 2 bajty
Bardziej podoba mi się powyższa odpowiedź, więc dodaję to jako alternatywne rozwiązanie. To trwa mniej niż sekundę, w przeciwieństwie do kilku milionów lat.
Dane wyjściowe, jeśli kostka jest do rozwiązania: (nic) Dane
wyjściowe, jeśli kostka jest nierozwiązywalna:
Error: The cube has reached an unsolvable state.
źródło
APL (Dyalog Classic) ,
190174 bajtówWypróbuj online!
Argumentem jest macierz 3x2 (wiersz0: przód tył, wiersz1: lewy prawy, wiersz2: góra dół) macierzy 3x3 znaków. Zwraca 1 za możliwą do rozwiązania kostkę Rubika, w przeciwnym razie 0.
W łączu TIO funkcja
t
, która nie jest uwzględniona w liczbie znaków, odczytuje 9 linii wejściowych, konwertuje je z domyślnego formatu wejściowego (sieci) na wymaganą macierz 3x2 x 3x3, wywołuje rozwiązanie i drukuje OK, jeśli wynik jest zgodnie z oczekiwaniami.Algorytm dzieli dany sześcian na 26 sześcianów - ciągi o długości 3 (narożniki), 2 (krawędzie) i 1 (środkowe). Generuje również 26 kostek rozwiązanego sześcianu z tymi samymi 6 centralnymi kostkami. Wszystkie poniższe kryteria muszą być spełnione:
wśród 6 ośrodków nie ma duplikatów
zestawy podanych / rozwiązanych kostek pasują do rotacji - np. rozważ
'WBR'
i'BRW'
ten sam sześcian, ale nie'BWR'
parzystości zarówno permutacji narożnej, jak i permutacji krawędziowej są równe
sumy modulo 3 wskaźników obrotu rogu (na przykład biorąc litery „najmniejszy”
B
jako punktu odniesienia, mamy:'BRW'→0
,'WBR'→1
,'RWB'→2
) pasują między daną a rozwiązywanych kostki; to samo dotyczy narożników modulo 2źródło