Kehre einen Zauberwürfel-Algorithmus um

19

Immer wenn Sie mit einem Zauberwürfel einen Zug machen, gibt es einen umgekehrten Zug, der den ersten Zug rückgängig macht. Aus diesem Grund hat jeder Algorithmus (Zugmenge) einen umgekehrten Algorithmus, der den ersten Algorithmus rückgängig macht.

Das Ziel dieser Herausforderung ist es, das Gegenteil eines gegebenen Algorithmus zu finden.

Spezifikation:

Die Eingabe besteht aus einer Reihe von einzelnen Zügen. Jeder Zug ist eine Zeichenfolge der Länge 1 oder 2. Natürlich können Sie jedes Eingabeformat verwenden, das in Ihrer Sprache am sinnvollsten ist. Jeder Zug besteht aus der Struktur Xoder X'oder X2, wobei Xes sich um einen Groß- oder Kleinbuchstaben handelt.

Zum Umkehren Xeinfach durch ersetzen X'. Ebenso X'wird X. X2wird dagegen nicht verändert.

Um die Ausgabe zu erstellen, kehren Sie jede Bewegung um und kehren Sie dann das Array um.

Beispiele (durch Leerzeichen getrennte Zeichenfolgen):

R => R'

D U' => U D'

S T A C K => K' C' A' T' S'

A2 B2 => B2 A2

Wertung:

Dies ist Code-Golf, so dass die wenigsten Bytes gewinnen. Standardlücken sind nicht erlaubt.

Julian Lachniet
quelle
Ist R2-> R2'oder B-> B3erlaubt?
CalculatorFeline
2
Sich der Herausforderung stellen zu müssen X3oder das X1wäre eine schöne Ergänzung gewesen.
Shaggy
1
"Aus diesem Grund hat jeder Algorithmus (Zugmenge) einen umgekehrten Algorithmus, der den ersten Algorithmus rückgängig macht." Trifft dies für alle Algorithmen zu? Denn ich denke, die Hashalgorithmen sind eine Möglichkeit. Bedeutet, dass es keine umgekehrten Algorithmen gibt, oder? Bitte lassen Sie es mich wissen
Avishek Saha
4
@AvishekSaha: Bei Rubiks Cube-Problemen ist "Algorithmus" auf die Bedeutung "eine Folge von Zügen, die Sie auf dem Cube ausführen können" beschränkt. In diesem Sinne gibt es auf dem Cube keinen Einweg-Hashing-Algorithmus.
Ross Presser
5
Sollte D2R2als Testfall gehabt haben ...
Neil

Antworten:

7

V , 13-10 Bytes

æGÇä/á'Ó''

Probieren Sie es online!

3 Bytes gespart dank @nmjmcman, der auf mein Lieblingsfeature hinweist. Erläuterung:

æ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
quelle
Stellt älike einen regulären Ausdruck dar, wenn es zu vim kompiliert wird?
Downgoat
@ Downgoat Ja! Es tut. Übersetzt in Vim ist diese Lösung :g!/\d/norm A'<CR>:%s/''//g<CR>gg:g/^/m0<CR>Weitere Informationen darüber, wie V reguläre Ausdrücke komprimiert, finden Sie hier
DJMcMayhem
@DJMcMayhem Entsprechen implizite Endungen nicht Ihrem Lieblingsfeature? Probieren Sie es online!
nmjcman101
3
Ich weiß, dass es ziemlich spät ist, aber das funktioniert bei mir nicht. Es verwandelt einen R2 in einen 2R, der nicht gültig ist
Jamie Sanborn
7

Retina 0.8.2 , 27 26 Bytes

\w
$&'
''

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

Probieren Sie es online! Link enthält Testfälle. Erläuterung: In der ersten Stufe wird nach jedem alphanumerischen Zeichen ein Apostroph eingefügt. Dies führt zu doppelten Apostrophen (mit oder ohne inklusive 2), die entfernt werden müssen. Die letzte Phase kehrt die Bewegungen um.

Neil
quelle
Könnte dies mit der Veröffentlichung von Retina 1.0 verbessert werden ?
MD XF
@MDXF Es scheint, dass dies O$^tatsächlich immer noch der beste Weg ist, eine Liste von Übereinstimmungen umzukehren, sodass die Byteanzahl in Retina 1 tatsächlich unverändert bleibt.
Neil
5

JavaScript (ES6), 45 Byte

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

Die kürzeste Lösung besteht darin, Array IO zu verwenden. Einfache und angemessene Verwendung von Argumenten zur Vernichtung.

Die Zeichenfolgenausgabe beträgt +8 Byte für .join` `.

String-Eingabe, Array-Ausgabe: 69 Bytes

(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
quelle
Schön. Warum denke ich nie daran, Funktionsparameter zu zerstören ?! :(
Shaggy
Sie sollten ersetzen können .reverse()mit ::reverseSpeichern 1 Byte aber machen ES7
Downgoat
@ Downgoat Gibt es einen Ort, an dem ich ES7 testen kann?
Conor O'Brien
@ ConorO'Brien können Sie babel online REPL (Häkchen ausführen und alle voreingestellten Kästchen für alle Funktionen) verwenden: babeljs.io/repl
Downgoat
4

Jelly , 11 Bytes

ḟ;ċ?”'ḣ2µ€Ṛ

Ein monadischer Link, der eine Liste von Zeichenlisten zurückgibt (ein "Array" von "Strings").

Probieren Sie es online! (Die Fußzeile vermeidet das Zertrümmern der Ausgabe und zeigt die Liste mit Leerzeichen geteilt an.)

Wie?

ḟ;ċ?”'ḣ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
quelle
10 Bytes mit neuem Jelly.
user202729
4

JavaScript (ES6), 46 Byte

Nimmt Eingaben als Array von Zügen auf.

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

Probier es aus

Geben Sie eine durch Kommas getrennte Liste von Zügen ein.

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>


Erläuterung

a=>

Anonyme Funktion, die das Array von Zügen als Argument über einen Parameter verwendet a.

a.map(m=>                       )

Ordnen Sie über das Array zu und übergeben Sie jede Zeichenfolge einer Funktion. Dabei mhandelt es sich um die aktuelle Zeichenfolge.

 m[1]?

Überprüfen Sie, ob die Zeichenfolge ein zweites zweites Zeichen ( "'"oder "2") enthält.

+m[1]?

Wenn dies der Fall ist, versuchen Sie, diese Zeichenfolge in eine Ganzzahl umzuwandeln. Wenn die Zeichenfolge ist "2", wird es 2, was wahr ist. Wenn die Zeichenfolge ist "'", wird es NaN, was falsch ist.

m

Wenn der vorherige Test wahr ist, kehren Sie einfach zurück m.

:m[0]

Andernfalls geben Sie das erste Zeichen von zurück m.

:m+"'"

Wenn die Zeichenfolge kein zweites Zeichen enthält, wird ein mangefügtes zurückgegeben '.

.reverse()

Kehren Sie das geänderte Array um.

Zottelig
quelle
Entschuldigung, ich habe das gerade gesehen. Meine eigene Antwort ist ähnlich wie Ihre: P
Conor O'Brien
2

Python ,  51  48 Bytes

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

Eine unbenannte Funktion, die Listen von Zeichenfolgen aufnimmt und zurückgibt.

Probieren Sie es online!

Kehrt die Eingabeliste mit um a[::-1]; hängt ein 'an jeden Eintrag mit an v+"'"; Überträgt je ein bis zwei Zeichen, je nachdem, ob das Original ein 'In hatte oder nicht [:2-("'"in v)].

Jonathan Allan
quelle
2

Python 3 , 91 89 72 70 69 65 Bytes

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

Probieren Sie es online! (Mit Testfällen)

Anscheinend müssen Sie die Eingabe und Ausgabe nicht als Zeichenfolgen verwenden, sodass eine 69-Byte-Lösung möglich ist

sagiksp
quelle
AFAIK Sie können das Leerzeichen nachlen(i)==1
Stephen
@StepHen Huh, wusste nicht, dass das erlaubt war (wusste, dass einige Dolmetscher es erlaubten, wusste nur nicht, dass es im Codegolf erlaubt ist)
sagiksp
2
Die Sprachen werden hier von ihren Dolmetschern definiert. Wenn es also in einem Dolmetscher funktioniert, ist es gültig.
Shaggy
Wenn der Dolmetscher es erlaubt, können Sie es tun. Das ist alles, was Code-Golf interessiert;)
Stephen
len(i)-2ist kürzer als len(i)==1(denken Sie daran, 0 ist falsch)
Stephen
1

Haskell , 43 Bytes

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

Probieren Sie es online! Deklariert eine anonyme Funktion map f.reverse. Binden an gund verwenden als g["S","T","A","C","K"].

Laikoni
quelle
1

PHP , 81 Bytes

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

Probieren Sie es online!

Jörg Hülsermann
quelle
1

05AB1E , 13 Bytes

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

Probieren Sie es online!

Erläuterung

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
quelle
1

J, 25 Bytes

J handhabt dies gut, abgesehen von der unglücklichen Escape-Sequenz, die für die Darstellung eines einzelnen Anführungszeichens erforderlich ist:

|.,&''''`}:@.(''''={:)&.>

Wir müssen die Liste mit Boxed Data darstellen, da es sich um eine Mischung aus einem und zwei Zeichen handelt.

  • &.> - "under unbox" (unter Unbox), was bedeutet, dass jedes Element unbox ist, führen Sie die folgende Operation aus (dh die unten erläuterten Symbole) und boxen Sie dann neu, wenn Sie fertig sind
  • (''''={:) "wenn das 2. Zeichen ein einfaches Anführungszeichen ist" ....
  • @. (Js Agenda Verb, eine Art verallgemeinerte ternäre Aussage oder eine Fallaussage)
  • }: (der 2. Punkt auf der Tagesordnungsliste), "das letzte Zeichen entfernen", dh das einfache Anführungszeichen
  • `(Js Bindungsverb) Sie können sich das als Trennzeichen für die Tagesordnungspunkte vorstellen
  • ,&'''' (erster Punkt auf der Tagesordnungsliste) "füge ein einzelnes Zitat am Ende hinzu"
  • |. "umkehren"

Probieren Sie es online!

Jona
quelle
0

Java 8, 141 128 126 Bytes

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

Nimmt Eingaben als einzelne Stringohne Leerzeichen (dh RUR'URU2R'U).

Erläuterung:

Probieren Sie es online aus.

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

Beispiel für die obigen Schritte mit der angegebenen Eingabe: 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
quelle