Twoim zadaniem jest stworzenie losowej sekwencji ruchów, których można użyć do szyfrowania Kostki Rubika. Taka walka składa się z dokładnie 25 ruchów. Każdy ruch składa się z liter, UDRLFB
po których opcjonalnie następuje jeden z przyrostków '2
.
Notacja ta nazywa się notacją Singmaster. UDRLFB
reprezentuje jedną z 6 ścian, a opcjonalny przyrostek '2
reprezentuje kąt obrotu. Informacje te nie są w żaden sposób konieczne do rozwiązania zadania.
Aby zapewnić, że jajecznice są „dobrej jakości”, muszą mieć zastosowanie następujące dwie zasady:
Dwa kolejne ruchy nie mogą mieć tej samej litery. Ta zakazuje kolejne ruchy
UU
,DD
,RR
,LL
,FF
iBB
oraz wszelkie ich kombinacje przy użyciu opcjonalnego przyrostków jakU2U
alboU'U'
.Te pary ruchów są zbanowane, ponieważ można je łatwo zredukować do 1 lub 0 ruchów.
U2U
ma taki sam efekt jakU'
,R'R
taki sam efekt jak.
Trzy kolejne ruchy nie mogą należeć do tej samej grupy liter. Grupy nas są
UD
,RL
iFB
. Zasada ta zakazuje dodatkowo kolejne ruchyUDU
,DUD
,RLR
,LRL
,FBF
,BFB
i wszystkie ich kombinacje przy użyciu opcjonalnego przyrostków jakU2DU
,RL'R
lubB2FB'
.Grupy sortują twarze według osi ruchu.
U
iD
należą do tej samej grupy, ponieważ oba obracają się wokół tej samej osi. DlategoU
ruch nie wpływa na częściD
twarzy, aD
ruch nie wpływa na częściU
twarzy. Dlatego te dwa ruchy mogą być wymieniane,UDU
ma taki sam efekt jakUUD
i można to zredukować doU2D
.
Wyzwanie
Napisz skrypt lub funkcję, która generuje jedną losową mieszankę. Brak danych wejściowych. Skrypt / funkcja musi wydrukować 25 ruchów bez separacji lub oddzielonych jedną spacją lub zwrócić odpowiedni ciąg.
Twój program musi być w stanie utworzyć każdą pojedynczą mieszankę, która spełnia powyższe zasady. Oczywiście zakładając, że generator liczb losowych jest prawdziwy losowy, a nie pseudolosowy.
To jest golf golfowy. Najkrótszy kod (liczony w bajtach ) wygrywa.
Przykłady wyników:
Wywołanie skryptu / funkcji 3 razy powinno wydrukować / zwrócić coś takiego:
R'B2R2F2R2FB'R2DR2ULFB2RB'U2B'FL'BR'U'RB'
U'DBR'B2U'B'U'RUF'B'RDR2U'B'LR'B'F2D2UF2L'
BR2F'B'R'D'R'U2B'F2D2R'F2D'F'D2R2B'L2R'UB'R2L'D
Jeśli oddzielisz ruchy spacjami, każdy:
R2 L' F2 U2 D' R2 L2 F L' D2 U R B D' U2 L B2 L U B2 D U2 R' D2 U'
B R D2 F U2 B' R2 F2 B' U' L' R2 B U2 R' D B' F' U2 R' B' L R D2 R2
B2 R2 U D' B R D' R L2 D2 L2 R B2 F U' F2 B2 U' F U' D F R2 U2 B'
Zauważ, że wszystkie te dane wyjściowe składają się z 25 ruchów, ale mają różne długości, ze względu na opcjonalne sufiksy. Nie wolno drukować spację, kiedy albo 2
czy '
są zastosowania jako przyrostek. Musisz wydrukować L2UR2F'R'U2
lub L2 U R2 F' R' U2
. L2U R2F'R'U2
nie jest dozwolone.
źródło
UR 2
nie jest dozwolone? Myślę, żeU R2
powinno być dozwolone, ponieważ odstępy między ruchami mają sens.L2U R2F'R'U2
.U
nie ma opcjonalnego sufiksu i dlatego nie powinien mieć spacji. Spacja nie powinna zastępować opcjonalnego sufiksu.U F2 L D2 R'...
na przykład generować dane ? W tym przypadku nie ma dodatkowej przestrzeni, która moim zdaniem powinna być w porządku.Odpowiedzi:
CJam,
4745 bajtówW tym rozwiązaniu zastosowano inne podejście niż jakikolwiek inny opublikowany do tej pory. Wykorzystuje zwięzłe operacje listy CJam, aby wygenerować dostępną listę ruchów i wybrać jedną losowo każdą iteraton. Modyfikatory są po prostu generowane niezależnie.
Wypróbuj online.
Wyjaśnienie
źródło
C 129
Wewnętrzna pętla generuje wartość z
m
zakresu,1..5
który po dodaniu dos
i wzięciu modułu 6 zapewnia, że żadne dwa kolejne ruchy nie będą wykonywane po tej samej stronie sześcianu. Stara wartość parametrum
jest przechowywana,n
a testm*n==9
zapewnia, że wartośćm
= 3 nigdy nie jest generowana dwa razy z rzędu (więc przeciwnych ścian nie można wybrać dwa razy z rzędu; zwróć uwagę na kolejność ścian w ciągu).Najmniej znaczna część
r
jest wykorzystywany do określenia, która sufiksu ('
,2
lub null) do wykorzystania, wykorzystując w postaci pustego w końcu"'2"
.Zewnętrzna pętla działa 26 razy. Za pierwszym razem
U
nie można go wybrać, więcprintf
jest pomijany przy pierwszej iteracji.Nieskluczony kod w programie testowym
Niegolfowany kod umieszcza odstęp między każdym ruchem dla zachowania przejrzystości (kod golfowy nie, aby zaoszczędzić jeden bajt.) Dodatkowo kod golfowy oszczędza średnik poprzez przeniesienie
printf
wewnątrzfor
przedziału.Typowa wydajność
źródło
Pyth
6566Nigdy tak naprawdę nie grałem w golfa w Pyth, może napisałem program lub dwa. Jest to w zasadzie rozwiązanie @ steveverrill przetłumaczone na Pyth. Sugestie dotyczące ulepszeń są mile widziane.
Aktualizacja: dodano 1 bajt, aby zaczynał się również kodowanie
U
. Być może rozwiązanie C polega na niezdefiniowanym zachowaniu, aby działało ...Uważam, że należy to zrobić przy mniejszej liczbie zadań, ale wymagałoby to ode mnie dużej modyfikacji algorytmu. (Cóż, może spróbować.)
Oto wyjaśnienie oparte na kodzie C:
źródło
Y
iZ
.Z
jest wstępnie zainicjowany na 0, więc zapisujesz pierwsze 3 znaki.n = m
(trzecia linia wyjaśnień), co musi oznaczaćn = 0
pierwszy raz, co z kolei wymagałoby wartościY
0.Y
jest wstępnie zainicjowany z pustą listą[]
. I nie sądzę, aby wartośćn
spraw w pierwszej iteracji.U
.JavaScript (ES6) 175
178 204Edytuj 3 bajty mniej, 1 zmieniając kod i 2 zmieniając sposób liczenia bajtów (nie licząc
F=
)Kod pozwalający uniknąć powtórzeń pochodzi z @stevemiller. Jego sposób zarządzania grupami listów jest jeszcze lepszy, ale nie zamierzam go ukraść.
Premia: możesz opcjonalnie określić liczbę ruchów.
Mniej golfa
Test
źródło
JavaScript - 112
źródło
Java 8,
189183 bajtówPort odpowiedzi C @LevelRiverSt . Sam próbowałem pewnych rzeczy, ale to było krótsze niż to, co miałem ...
Wypróbuj online.
źródło
Rubin ,
116 107 10595 bajtówWypróbuj online!
źródło
Clojure, 223 bajty
Zależy to w dużej mierze od wzoru „sekwencja -> podział według -> filtr -> konkat”, służy do filtrowania „nielegalnych” sekwencji twarzy. Sekwencja ta jest następnie mapowana na ciąg wraz z losowym postfiksem (w tym pusty ciąg).
Punkt wyjściowy bez golfa:
źródło