Kostka Rubika ma 6 kolorów: czerwony, pomarańczowy, żółty, biały, niebieski i zielony. Czerwone i pomarańczowe, żółte i białe oraz niebieskie i zielone twarze znajdują się po przeciwnych stronach.
Siatka rozwiązanej kostki Rubika wygląda następująco:
Y
BRGO
W
A płytki wyglądają tak:
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
Wyzwanie
Podane obroty, odwrócone obroty lub podwójne obroty generują to, co przekształci rozwiązany sześcian, jako sztuka ASCII lub jako obraz (białe spacje nie są konieczne, mogą istnieć lub mogą nie istnieć, dozwolone są końcowe spacje).
Wejście będzie rotacją (i opcjonalnym modyfikatorem). Notacja rotacji wygląda następująco: U
(p), L
(eft), F
(ront), R
(ight), B
(ack), D
(own); 2
(podwójne) '
lub i
(odwrotne).
Wszystkie normalne obroty będą o 90 ° zgodnie z ruchem wskazówek zegara, odwrotne będą przeciwne do ruchu wskazówek zegara.
Objaśnienie dotyczące ruchu wskazówek zegara : Wyobraź sobie sześcian, gdy patrzysz na czerwoną twarz, a żółta twarz znajduje się u góry. Następnie obróć sześcian, aby twarz obracana przez program była skierowana w Twoją stronę. W ten sposób będzie działać prawoskrętność. (Z wyjątkiem tylnej ściany, w takim przypadku obrócisz sześcian w poziomie).
Wkład
Dane wejściowe będą listą ruchów.
Wydajność
Grafika ASCII reprezentująca kostkę lub obraz sieci kostki.
Przykłady
Dane wejściowe : (pusty)
Wyjście :
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
Wejście : U
(w górę)
Wyjście :
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
Wejście : U'
lub Ui
(odwrotnie w górę)
Wyjście :
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
Wejście : U2
(podwójne)
Wyjście :
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
Dane wejściowe : L'
(odwrócony w lewo)
Wyjście :
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
Wejście : R
(z prawej)
Wyjście :
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
Wejście : U2 L' D
(podwójne w górę, odwrotnie w lewo, w dół)
Wyjście :
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
Zasady
- Niedozwolone są luki.
- To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach rozwiązujący problem.
S
,E
,M
,x
,y
,z
,u
/Uw
,d
/Dw
,r
/Rw
,l
/Lw
,f
/Fw
,b
/Bw
ruchów, jak również? Lub tylko domyślnie:U
,D
,R
,L
,F
,B
a ich wariant lewo z apostrof ('
)? Off-topic: Zawsze zastanawiam się nad pytaniami związanymi z Kostką Rubika, czy jesteś też kolekcjonerem Twisty Puzzles?Odpowiedzi:
Rubinowy,
370 339305 bajtówOstatnia edycja: kilka bajtów zapisanych przez przegrupowanie wzorów kreślenia i usunięcie niepotrzebnych nawiasów. Ogromna oszczędność dzięki przepisaniu generacji kostki - nigdy nie wiedziałem, że Ruby ma wbudowane produkty kartezjańskie!
Funkcja anonimowa.
Akceptuje tablicę ciągów, z których każdy reprezentuje jeden obrót twarzy (pojedynczy ciąg ze spacjami między każdym obrotem twarzy to dodatkowe 6 bajtów).
Zwraca ciąg prostokątny 9x12.
Krótkie wyjaśnienie
Jest to ściśle oparte na koncepcji z mojej odpowiedzi na to pytanie , która z kolei była oparta na podobnej koncepcji Jana Dvoraka.
Pierwszy wiersz generuje tablicę 27 elementów, reprezentującą 27 sześcianów. Każdy sześcian jest reprezentowany przez trójwymiarowy wektor, w którym znak reprezentuje jego bieżącą pozycję, a wielkość każdej współrzędnej reprezentuje kod ascii dla koloru naklejki.
Przykład ruchu: dla R, dla każdego sześcianu sprawdź, czy współrzędna x jest> 0, a jeśli tak, obróć o 90 stopni, zamieniając współrzędne y i z, i zamieniając znak jednego z nich.
Weź tablicę 9 x 12 pól i narysuj w niej sześcian. Dla każdego sześcianu i osi sprawdzamy, czy naklejka istnieje (współrzędna w tej osi niezerowa) i ustalamy, dokąd ma się udać. Następnie bierzemy współrzędną i wykonujemy,
.abs.chr
aby zmienić liczbę na wymaganą postać i wykreślić ją.Niegolfowany w programie testowym (na edycję 339 bajtów)
Wydajność
źródło
JavaScript (ES5), 1615 bajtów
Nie golfowany:
To było bardzo trudne wyzwanie.
Wyjaśnienie
Weź przykładowe połączenie
s("R U' F")
.Program może wykonywać tylko ruchy X, Y i R.
U'
jest równaU U U
, więc wymień to.F
jest równay y y R y
, więc wymień to.R U' F'
jest więc równy temuR U U U y y y R y
, który program może uruchomić.cstate jest zdefiniowany za pomocą rozwiązanej kostki. Sześcian jest reprezentowany przez tablicę zawierającą 6 tablic zawierających 9 naklejek. Pierwsza tablica jest przeznaczona dla R, druga dla U, trzecia dla F, D, B, ostatnia dla L. Gdy konieczne jest wykonanie y, program zamienia cztery tablice przedniej, lewej, tylnej i prawej twarzy. W przypadku x zamienia przód, dół, tył i górę. Każdy obrót powoduje również obrót innych ścian, które nie zostały zamienione. Ruch AR obraca prawą twarz i zamienia prawą część przedniej, górnej, tylnej, dolnej twarzy.
Można to zmodyfikować, aby móc rozwiązać problemy ze wszystkimi rodzajami ruchów, definiując je za pomocą x, y i R.
źródło
R U' F2
zostajeR U' F F
najpierw przekonwertowany na , a następnieR U U U F F
,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
który następnie wykonuje? Dziwne ... ale bardzo oryginalne. +1 :) Jak wpadłeś na ten pomysł?U'
językU U U
zbyt, alex
ie iy
s są naprawdę dobre. Też chcę to ukraść: p'
i2
, a następnie zastępuje wszystkie ruchy.C,
17151709168613361328 bajtów25 bajtów zapisanych dzięki @KevinCruijssen!
Do tej pory brak odpowiedzi, więc zdecydowałem się na własne rozwiązanie.
Wypróbuj online!
Niegolfowana stara wersja:
źródło
for(b=1;b<8;b++)for(a=1;a<11;a++)r[b][a]=c[b];
tofor(b=1;b<8;)for(a=1;a<11;)r[b][a++]=c[b++];
ifor(i=1;i<=9;i++)
tofor(i=0;++i<=9;)
, a także w niektórych innych pętlach for. Ponadto,else if
mogą być zmieniane tylkoif
po sprawdzeniuif(d==66)B(r);if(d==76)L(r);...
I, chyba żei
może być ujemna, można zmienićif(i%3==0)
naif(i%3<1)
dwa razy. I jestem pewien, że można jeszcze trochę zagrać w golfa. Jednak miło jest zobaczyć odpowiedź na własne wyzwanie. :)if
ii
chociaż zredaguję je, kiedy wrócę do domu. Dzięki!else
s bork programu, pętle do golfa bork programu, rzecz zi
działa. W każdym razie dzięki.else if
zmiana sięif
nie udaje? : S W każdym zelse if
porównywanych elementówd==##
, więc jestem zdezorientowany, dlaczego tak nie jest. Znowu nie programuję C, więc może brakuje mi czegoś oczywistego, czego C nie może zrobić, ale nadal… Ach, cieszę się, że mogłem pomóc z<1
==0
Python 3,
610 563 533526 bajtów-7 bajtów dzięki mojemu koledze rsmitom (naprawdę fajna
d,*c
forma i usunięcie zbędnych nawiasów)To jest pełny program.
Superflip i wszystkie testy są dostępne w ideone lub Wypróbuj online!
Program:
YBRGOW
naklejek.r
która obraca tylko naklejki na twarzy, zgodnie z ruchem wskazówek zegara o ćwierć obrotuU
która obracaU
twarz o ćwierć obrotu zgodnie z ruchem wskazówek zegara, nakładającr
i obracając naklejki na górnym paskuLFRB
ćwierć obrotu zgodnie z ruchem wskazówek zegaray
która działar
naU
iD
twarze i plastryLFRB
- wykonuje obrót całego sześcianu w
y
osi (która biegnie przezU
iD
)- obrót jest zgodny z ruchem wskazówek zegara, jeśli patrzy się z góry
z
, która wykonuje obrót całego sześcianu wz
osi zgodnie z ruchem wskazówek zegara o ćwierć obrotuR
(oś biegnie przezR
iL
) - tym razem, ponieważ sposób, w jaki twarze są zorientowane w naszej sieci (tak jak podano w PO) muszą odwrócićB
iU
twarze (przełączają się z poziomych do pionowych części siatki i odwrotnie)input()
(ruchy, które należy wykonać) dopasowując znak odBUDLRF
(faktycznieB-U
) ewentualnie poprzedzającego znak'i2
'i2
liczby obrotów zgodnie z ruchem wskazówek zegara (porządki tych mod6
wykonują zadanie, z manekinema
ustępującym,1
gdy nie ma żadnego)y
iz
, obrót o ćwierć obrotuU
(który będzie teraz poleceniem twarzy), a następnie połączenia w celu odwrócenia sekwencji wykonanej konfiguracji. Biorąc porządek modulo postaci twarzy do11
tego czasu za pomocą7
mapB:0 U:1 D:2 L:3 F:4 R:5
, umożliwiając proste indeksowanie w ciągu sekwencji nazw funkcji rozdzielonych spacjami.d
aby skrócić wydrukU
iD
Oto superflip :
źródło
Pyton
760750649 bajtówbezwstydnie ukradł pomysł użycia tylko 3 obrotów z @Paul Schmitz: D
Nowa wersja:
Przeważnie po prostu robiłem dużo wycinania list numpy i korzystałem z jego wbudowanych funkcji obracania i przewijania. Wejście jest obsługiwane przez bezpośrednie wywoływanie funkcji
eval()
bez golfa ..
wejście testowe:
Komentarze i sugestie są mile widziane :)
źródło
of using only 3 rotations
źle. Program konwertuje dowolną sekwencję na sekwencję z większą liczbą ruchów. Jeśli wprowadziszF F F F
, użyje więcej niż 3 obroty, podczas konwersjiy y y R y y y y R y y y y R y y y y R y
. Wykorzystuje trzy rodzaje rotacji.C 839 bajtów
Ponieważ nie jest to pełny program (funkcja z wejściem argumentu łańcuchowego i wyjściem do konsoli), musisz wywołać go w następujący sposób:
Używaj tylko jednego wywołania na raz, ponieważ funkcja używa i modyfikuje zmienne globalne.
Nie golfowany:
Jak widać, główną ideą jest zastosowanie podejścia w pełni opartego na danych: różne obroty są wyrażone jako listy indeksów, które muszą być permutowane. Kod permutacji może więc być bardzo krótki i ogólny.
źródło
f(h,g)int*g;{
-2,l(g,m){
-8,n(char*o){
-5,printf("%s",a)
doputs(a)
-7, a także możesz zastąpić stałe char ich reprezentacją dziesiętną ASCII -1 każdySześciennie , 2 bajty
Wypróbuj online!
Wyjaśnienie:
Jeśli dozwolone jest wyjście z zewnątrz, jest to alternatywa. 1 bajt:
Wypróbuj online!
Cubicznie automatycznie zrzuca swoją kostkę pamięci do
STDERR
momentu zakończenia programu. Jednak drukuje również wcześniej notatnik.źródło
+1
JavaScript (ES6), 820
Przeniesienie błędnej odpowiedzi autorstwa @Paul Schmitz. Nadal nie jest całkowicie golfa, ale ma wartość dodaną, że działa.
Głównym problemem w oryginalnej odpowiedzi jest to, że pojedyncza funkcja Q nie wystarcza dla wszystkich ruchów związanych z obrotem. Musiałem dodać 2 inne funkcje O i N. Wszystkie z nich są właśnie wywoływane w prawej funkcji obrotu R.
Może bardziej czytelny
źródło
update()
nie jest zdefiniowany w mojej konsoli podczas uruchamiania fragmentu