Ilekroć wykonasz ruch na Kostce Rubika, następuje ruch odwrotny, który cofa pierwszy ruch. Z tego powodu każdy algorytm (zestaw ruchów) ma algorytm odwrotny, który zastępuje pierwszy algorytm.
Celem tego wyzwania jest znalezienie odwrotności danego algorytmu.
Specyfikacja:
Dane wejściowe składają się z szeregu pojedynczych ruchów. Każdy ruch ma ciąg długości 1 lub 2. Oczywiście możesz użyć dowolnego formatu wejściowego, który jest najbardziej sensowny w twoim języku. Każdy ruch składa się z konstrukcji X
lub X'
lub X2
, gdzie X
jest list wielkie lub małe litery.
Aby cofnąć X
, po prostu zamień go na X'
. Podobnie X'
staje się X
. X2
z drugiej strony nie ulega zmianie.
Aby utworzyć wynik, odwróć każdy ruch, a następnie odwróć tablicę.
Przykłady (ciągi znaków oddzielone spacjami):
R
=> R'
D U'
=> U D'
S T A C K
=> K' C' A' T' S'
A2 B2
=> B2 A2
Punktacja:
To jest golf golfowy, więc wygrywa najmniej bajtów. Standardowe luki są niedozwolone.
źródło
R2
->R2'
lubB
-> jestB3
dozwolone?X3
lubX1
byłaby miłym dodatkiem do wyzwania.D2R2
przypadek testowy ...Odpowiedzi:
Python 2 ,
71575453 bajty-15 bajtów dzięki ovs! -3 bajty dzięki Rod.
Wypróbuj online!
Ciąg I / O, 70 bajtów
Wypróbuj online!
źródło
V ,
1310 bajtówWypróbuj online!
3 bajty zapisane dzięki @nmjmcman wskazując moją ulubioną funkcję. Wyjaśnienie:
źródło
ä
podobieństwo reprezentuje regex po skompilowaniu do vima?:g!/\d/norm A'<CR>:%s/''//g<CR>gg:g/^/m0<CR>
Więcej informacji o tym, jak V kompresuje wyrażenia regularne, można znaleźć tutajRetina 0.8.2 ,
2726 bajtówWypróbuj online! Link zawiera przypadki testowe. Objaśnienie: Pierwszy etap dodaje apostrof po każdym alfanumerycznym. Powoduje to podwójne apostrofy (z włączeniem 2 lub bez 2), które należy usunąć. Ostatni etap odwraca ruchy.
źródło
O$^
to, że w rzeczywistości jest to nadal najlepszy sposób na odwrócenie listy dopasowań, więc liczba bajtów w rzeczywistości nie uległa zmianie w Retina 1.JavaScript (ES6), 45 bajtów
Najkrótszym rozwiązaniem jest przejęcie Array IO. Proste i odpowiednie użycie niszczenia argumentów.
Dane wyjściowe ciągu wynoszą +8 bajtów
.join` `
.Ciąg wejściowy, wyjście tablicowe: 69 bajtów
źródło
.reverse()
z::reverse
oszczędności 1 bajt, ale co ES7Galaretka , 11 bajtów
Monadyczny link pobierający listę list znaków („tablica” „ciągów”).
Wypróbuj online! (Stopka pozwala uniknąć zniszczenia wyniku, wyświetlając listę podzieloną spacjami.)
W jaki sposób?
źródło
JavaScript (ES6), 46 bajtów
Pobiera dane wejściowe jako tablicę ruchów.
Sprawdź to
Wprowadź listę ruchów oddzieloną przecinkami.
Wyjaśnienie
Anonimowa funkcja przyjmująca tablicę ruchów jako argument za pomocą parametru
a
.Odwzoruj tablicę, przekazując każdy ciąg przez funkcję, gdzie
m
jest bieżący ciąg.Sprawdź, czy ciąg zawiera drugi drugi znak (
"'"
lub"2"
).Jeśli tak, spróbuj rzucić ten ciąg znaków na liczbę całkowitą. Jeśli łańcuch jest
"2"
, staje się2
, co jest prawdą. Jeśli struna jest"'"
, stajeNaN
się falsey.Jeśli poprzedni test jest prawdziwy, po prostu wróć
m
.W przeciwnym razie zwróć pierwszy znak
m
.Jeśli ciąg nie zawiera drugiego znaku, to wróć
m
z dopiskiem'
.Odwróć zmodyfikowaną tablicę.
źródło
Python ,
5148 bajtówNienazwana funkcja pobierająca i zwracająca listy ciągów.
Wypróbuj online!
Odwraca listę danych wejściowych za pomocą
a[::-1]
; dołącza'
do każdego wpisu za pomocąv+"'"
; każda z nich ma od 1 do 2 lub 2 znaków, w zależności od tego, czy oryginał zawierał,'
czy nie[:2-("'"in v)]
.źródło
Python 3 ,
918972706965 bajtówWypróbuj online! (Z walizkami testowymi)
Wygląda na to, że nie trzeba przyjmować danych wejściowych i wyjściowych jako ciągów, więc możliwe jest rozwiązanie 69-bajtowe
źródło
len(i)==1
len(i)-2
jest krótszy niżlen(i)==1
(pamiętaj, że 0 to falsey)Haskell , 43 bajty
Wypróbuj online! Deklaruje anonimową funkcję
map f.reverse
. Powiązaćg
i używać jakog["S","T","A","C","K"]
.źródło
PHP , 81 bajtów
Wypróbuj online!
źródło
05AB1E , 13 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
J, 25 bajtów
J dobrze sobie z tym radzi, oprócz niefortunnej sekwencji ucieczki potrzebnej do przedstawienia pojedynczego cytatu:
Musimy przedstawić listę za pomocą danych w ramkach, ponieważ jest to połączenie jednego i dwóch elementów znakowych, stąd:
&.>
- „under unbox”, co oznacza rozpakowanie każdego elementu, wykonaj następującą operację (tj. symbole wyjaśnione poniżej), a następnie ponownie zapakuj po zakończeniu(''''={:)
„jeśli druga postać to pojedynczy cytat” ...@.
(Czasownik porządku dziennego J, rodzaj uogólnionego oświadczenia trójkowego lub oświadczenie przypadku) „następnie wykonaj drugi punkt na liście porządku obrad, w przeciwnym razie wykonaj pierwszy”}:
(drugi punkt na liście porządku obrad), „usuń ostatni znak”, tj. pojedynczy cytat`(Czasownik remisowy J) Możesz to traktować jako separator pozycji porządku dziennego
,&''''
(pierwszy punkt na liście agend) „dodaj pojedynczy cytat na końcu”|.
"rewers"Wypróbuj online!
źródło
R , 51 bajtów
Wypróbuj online!
źródło
Rubinowy , 44 bajty
Wypróbuj online!
źródło
Java 8,
141128126 bajtówPobiera dane wejściowe jako pojedyncze
String
bez spacji (tjRUR'URU2R'U
.).Wyjaśnienie:
Wypróbuj online.
Przykład powyższych kroków, z podanymi danymi wejściowymi:
RUR'URU2R'U
RUR'URU2R'U
→R'U'R'''U'R'U'2'R'''U'
R'U'R'''U'R'U'2'R'''U'
→R'U'RU'R'U'2'RU'
R'U'RU'R'U'2'RU'
→'R'UR'U'R'U'2R'U
'R'UR'U'R'U'2R'U
→'R'UR'U'R2UR'U
'R'UR'U'R2UR'U
→U'RU2R'U'RU'R'
źródło