Odwróć algorytm kostki Rubika

19

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 Xlub X'lub X2, gdzie Xjest list wielkie lub małe litery.

Aby cofnąć X, po prostu zamień go na X'. Podobnie X'staje się X. X2z 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.

Julian Lachniet
źródło
Czy R2-> R2'lub B-> jest B3dozwolone?
CalculatorFeline
2
Konieczność poradzenia sobie X3lub X1byłaby miłym dodatkiem do wyzwania.
Kudłaty
1
„Z tego powodu każdy algorytm (zestaw ruchów) ma algorytm odwrotny, który cofa pierwszy algorytm” czy to prawda dla każdego algorytmu? Ponieważ myślę, że algorytmy mieszające są jednym ze sposobów. Czyli nie ma żadnych algorytmów odwrotnych, prawda? daj mi znać
Avishek Saha,
4
@AvishekSaha: W przypadku problemów z kostką Rubika „algorytm” jest ograniczony do „sekwencji ruchów, które można wykonać na kostce”. W tym sensie nie ma czegoś takiego jak jednokierunkowy algorytm haszujący na kostce.
Ross Presser
5
Powinien był mieć D2R2przypadek testowy ...
Neil

Odpowiedzi:

7

Python 2 , 71 57 54 53 bajty

-15 bajtów dzięki ovs! -3 bajty dzięki Rod.

lambda l:[i.strip("'")+" '"[len(i):]for i in l[::-1]]

Wypróbuj online!

Ciąg I / O, 70 bajtów

lambda s:' '.join(i.strip("'")+"'"*(len(i)<2)for i in s.split()[::-1])

Wypróbuj online!

całkowicie ludzki
źródło
1
53 bajty
ovs
7

V , 13 10 bajtów

æGÇä/á'Ó''

Wypróbuj online!

3 bajty zapisane dzięki @nmjmcman wskazując moją ulubioną funkcję. Wyjaśnienie:

æG          " Revere the order of every line
  Ç         " On every line not containing...
   ä/       " a digit:
     á'     "   Append an '
       Ó    "   Remove every instance on this line
        ''  "     Of two single quotes
DJMcMayhem
źródło
Czy äpodobieństwo reprezentuje regex po skompilowaniu do vima?
Downgoat
@Downgoat Tak! To robi. Przetłumaczone na vim, to rozwiązanie jest :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źć tutaj
DJMcMayhem
@DJMcMayhem Czy niejawne zakończenia nie są twoją ulubioną funkcją? Wypróbuj online!
nmjcman101
3
Wiem, że jest dość późno, ale to nie działa dla mnie. Zamienia R2 w 2R, co nie jest ważne
Jamie Sanborn
7

Retina 0.8.2 , 27 26 bajtów

\w
$&'
''

'2'
2
O$^`.'?2?

Wypró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.

Neil
źródło
Czy można to poprawić dzięki wydaniu Retina 1.0 ?
MD XF
@MDXF Wygląda na 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.
Neil
5

JavaScript (ES6), 45 bajtów

s=>s.map(([a,b])=>b?+b?a+b:a:a+"'").reverse()

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

(s,k=[])=>s.replace(/\S\S?/g,([a,b])=>k.unshift(b?+b?a+b:a:a+"'"))&&k

f=

(s,k=[])=>s.replace(/\S\S?/g,([a,b])=>k.unshift(b?+b?a+b:a:a+"'"))&&k

;

console.log(["R", "D U'", "S T A C K", "A2 B2"].map(e => `${e} => ${f(e)}`));
<textarea oninput="out.value=(f(this.value)||[]).join` `" placeholder="input here"></textarea>
<textarea id="out" readonly></textarea>

Conor O'Brien
źródło
Niezłe. Dlaczego nigdy nie myślę o destrukcji parametrów funkcji ?! :(
Shaggy
Powinieneś być w stanie wymienić .reverse()z ::reverseoszczędności 1 bajt, ale co ES7
Downgoat
@Downgoat Jakieś miejsce, w którym mogę przetestować ES7?
Conor O'Brien
@ ConorO'Brien możesz używać Babel REPL online (zaznacz opcję wykonywania i wszystkie gotowe pola dla wszystkich funkcji): babeljs.io/repl
Downgoat
4

Galaretka , 11 bajtów

ḟ;ċ?”'ḣ2µ€Ṛ

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?

ḟ;ċ?”'ḣ2µ€Ṛ - Link: list of lists of characters             e.g. ["F'", "D2" , "R"]
        µ€  - perform the chain to the left for €ach turn instruction:
    ”'      -   literal "'" character
   ?        -   if:
  ċ         -     count (number of "'" in the instruction) i.e.:  1   , 0    , 0
ḟ           -   then: filter out                                  "F"
 ;          -   else: concatenate                                       "D2'", "R'"
      ḣ2    -   head to index 2                                   "F" , "D2" , "R'"
          Ṛ - reverse                                            ["R'", "D2" , "F"]
Jonathan Allan
źródło
10 bajtów z nową galaretką.
user202729,
4

JavaScript (ES6), 46 bajtów

Pobiera dane wejściowe jako tablicę ruchów.

a=>a.map(m=>m[1]?+m[1]?m:m[0]:m+"'").reverse()

Sprawdź to

Wprowadź listę ruchów oddzieloną przecinkami.

o.innerText=(f=
a=>a.map(m=>m[1]?+m[1]?m:m[0]:m+"'").reverse()
)((i.value="S,T,A,C,K").split`,`);oninput=_=>o.innerText=f(i.value.split`,`)
<input id=i><pre id=o>


Wyjaśnienie

a=>

Anonimowa funkcja przyjmująca tablicę ruchów jako argument za pomocą parametru a.

a.map(m=>                       )

Odwzoruj tablicę, przekazując każdy ciąg przez funkcję, gdzie mjest bieżący ciąg.

 m[1]?

Sprawdź, czy ciąg zawiera drugi drugi znak ( "'"lub "2").

+m[1]?

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 "'", staje NaNsię falsey.

m

Jeśli poprzedni test jest prawdziwy, po prostu wróć m.

:m[0]

W przeciwnym razie zwróć pierwszy znak m.

:m+"'"

Jeśli ciąg nie zawiera drugiego znaku, to wróć mz dopiskiem '.

.reverse()

Odwróć zmodyfikowaną tablicę.

Kudłaty
źródło
Przepraszam, właśnie to widziałem. Moja własna odpowiedź jest podobna do twojej: P
Conor O'Brien
2

Python ,  51  48 bajtów

lambda a:[(v+"'")[:2-("'"in v)]for v in a[::-1]]

Nienazwana 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)].

Jonathan Allan
źródło
2

Python 3 , 91 89 72 70 69 65 bajtów

lambda s:[i[0]+(len(i)-2and"'"or"2"*("2"==i[1]))for i in s[::-1]]

Wypró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

sagiksp
źródło
AFAIK możesz usunąć spację polen(i)==1
Stephen
@StepHen Huh, nie wiedziałem, że to dozwolone (Wiedziałem, że niektórzy tłumacze na to pozwalają, po prostu nie wiedziałem, że jest to dozwolone w codegolf)
sagiksp
2
Języki są tutaj definiowane przez ich tłumaczy, więc jeśli działa w jednym tłumaczu, jest poprawny.
Kudłaty
Jeśli tłumacz na to pozwala, możesz to zrobić. To wszystko zależy od golfa;)
Stephen
len(i)-2 jest krótszy niż len(i)==1 (pamiętaj, że 0 to falsey)
Stephen
1

Haskell , 43 bajty

map f.reverse
f[x]=x:"'"
f[x,c]=x:[c|c>'1']

Wypróbuj online! Deklaruje anonimową funkcję map f.reverse. Powiązać gi używać jako g["S","T","A","C","K"].

Laikoni
źródło
1

PHP , 81 bajtów

<?foreach(array_reverse($_GET)as$v)$r[]=$v[1]?$v[1]<2?$v[0]:$v:"$v'";print_r($r);

Wypróbuj online!

Jörg Hülsermann
źródło
1

05AB1E , 13 bajtów

RεÐ1èQ''si«ëK

Wypróbuj online!

Wyjaśnienie

RεÐ1èQ''si«ëK
R             # Reverse input array
 ε            # Map over each element...
  Ð1èQ         # Is the second char in the element the first one? (Uses the fact that in python indexing loops)
      ''       # Push '
        s      # Swap top items of stack
         i     # If the question above is true...
          «     # Concatenate
           ë   # Else
            K   # Push element without '  
Datboi
źródło
1

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!

Jonasz
źródło
0

Java 8, 141 128 126 bajtów

a->new StringBuffer(a.replaceAll("(.)","$1'").replace("'''","").replaceAll("(.)'","'$1").replaceAll("'(.)'2","2$1")).reverse()

Pobiera dane wejściowe jako pojedyncze Stringbez spacji (tj RUR'URU2R'U.).

Wyjaśnienie:

Wypróbuj online.

a->new StringBuffer(           // Method with String parameter and StringBuffer return-type
  a.replaceAll("(.)","$1'")    //1  Add an apostrophe after every character
   .replace("'''","")          //2  Remove all occurrences of three adjacent apostrophes
   .replaceAll("(.)'","'$1")   //3  Reverse letter+apostrophe to apostrophe+letter
   .replaceAll("'(.)'2","2$1") //4  Reverse letter+2 to 2+letter and remove aphostrophes
  ).reverse()                  //5 Reverse everything

Przykład powyższych kroków, z podanymi danymi wejściowymi: RUR'URU2R'U

  1. RUR'URU2R'UR'U'R'''U'R'U'2'R'''U'
  2. R'U'R'''U'R'U'2'R'''U'R'U'RU'R'U'2'RU'
  3. R'U'RU'R'U'2'RU''R'UR'U'R'U'2R'U
  4. 'R'UR'U'R'U'2R'U'R'UR'U'R2UR'U
  5. 'R'UR'U'R2UR'UU'RU2R'U'RU'R'
Kevin Cruijssen
źródło