Inverser l'algorithme d'un cube Rubik


19

Chaque fois que vous effectuez un mouvement sur un Rubik's Cube, il y a un mouvement inverse qui annule le premier mouvement. Pour cette raison, chaque algorithme (ensemble de mouvements) a un algorithme inverse qui annule le premier algorithme.

Le but de ce défi est de trouver l'inverse d'un algorithme donné.

Spécification:

L'entrée se compose d'un tableau de mouvements individuels. Chaque mouvement est une chaîne de longueur 1 ou 2. Bien sûr, vous pouvez utiliser le format d'entrée le plus logique dans votre langue. Chaque mouvement se compose de la structure Xou X'ou X2, où Xest une lettre majuscule ou minuscule.

Pour inverser X, remplacez-le simplement par X'. De même, X'devient X. X2d'autre part ne change pas.

Pour créer la sortie, inversez chaque déplacement, puis inversez le tableau.

Exemples (chaînes séparées par des espaces):

R => R'

D U' => U D'

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

A2 B2 => B2 A2

Notation:

Il s'agit de code-golf, donc le moins d'octets est gagnant. Les échappatoires standard ne sont pas autorisées.


Est R2-> R2'ou B-> B3permis?
CalculatorFeline

2
Devoir gérer X3ou X1aurait été un bon ajout au défi.
Shaggy

1
"Pour cette raison, chaque algorithme (ensemble de mouvements) a un algorithme inverse qui annule le premier algorithme" est-ce vrai pour tous les algorithmes ?? Parce que je pense que les algorithmes de hachage sont à sens unique. Signifie qu'il n'a pas d'algorithmes inversés, non? faites-le moi savoir
Avishek Saha

4
@AvishekSaha: Pour les problèmes de Rubik's Cube, "algorithme" est limité à la signification "une séquence de mouvements que vous pouvez faire sur le Cube". En ce sens, il n'existe pas d'algorithme de hachage unidirectionnel sur le Cube.
Ross Presser

5
Aurait dû avoir D2R2comme cas de test ...
Neil

Réponses:



7

V , 13 10 octets

æGÇä/á'Ó''

Essayez-le en ligne!

3 octets économisés grâce à @nmjmcman soulignant ma fonctionnalité préférée. Explication:

æ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

Est-ce que älike représente une expression régulière lorsqu'elle est compilée dans vim?
Downgoat

@Downgoat Oui! Cela fait. Traduite en vim, cette solution est :g!/\d/norm A'<CR>:%s/''//g<CR>gg:g/^/m0<CR>Plus d'informations sur la façon dont V compresse les expressions régulières peut être trouvée ici
DJMcMayhem

@DJMcMayhem Les fins implicites ne sont-elles pas comme votre fonctionnalité préférée? Essayez-le en ligne!
nmjcman101

3
Je sais que c'est assez tard, mais ça ne marche pas pour moi. Il transforme un R2 en 2R, ce qui n'est pas valide
Jamie Sanborn

7

Retina 0.8.2 , 27 26 octets

\w
$&'
''

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

Essayez-le en ligne! Le lien inclut des cas de test. Explication: La première étape ajoute une apostrophe après chaque alphanumérique. Il en résulte des doubles apostrophes (avec ou sans 2 inclus) qui doivent être éliminées. La dernière étape inverse les mouvements.


Cela pourrait-il être amélioré avec la sortie de Retina 1.0 ?
MD XF

@MDXF Il semble que O$^c'est en fait toujours le meilleur moyen d'inverser une liste de correspondances, donc le nombre d'octets est en fait inchangé dans Retina 1.
Neil

5

JavaScript (ES6), 45 octets

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

La solution la plus courte consiste à prendre Array IO. Utilisation simple et appropriée de la destruction d'arguments.

La sortie de chaîne est de +8 octets pour .join` `.

Entrée chaîne, sortie tableau: 69 octets

(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>


Joli. Pourquoi est-ce que je ne pense jamais à détruire les paramètres des fonctions?! :(
Shaggy

Vous devriez pouvoir remplacer .reverse()en ::reverseéconomisant 1 octet mais en faisant ES7
Downgoat

@Downgoat N'importe quel endroit où je peux tester ES7?
Conor O'Brien

@ ConorO'Brien vous pouvez utiliser babel REPL en ligne (cochez exécuter et toutes les cases prédéfinies pour toutes les fonctionnalités): babeljs.io/repl
Downgoat

4

Gelée , 11 octets

ḟ;ċ?”'ḣ2µ€Ṛ

Un lien monadique prenant un retour d'une liste de listes de caractères (un "tableau" de "chaînes").

Essayez-le en ligne! (Le pied de page évite d'écraser la sortie, affichant la liste divisée avec des espaces.)

Comment?

ḟ;ċ?”'ḣ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"]

10 octets avec une nouvelle gelée.
user202729

4

JavaScript (ES6), 46 octets

Prend l'entrée comme un tableau de mouvements.

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

Essaye-le

Entrez une liste de mouvements séparés par des virgules.

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>


Explication

a=>

Fonction anonyme prenant le tableau de mouvements comme argument via un paramètre a.

a.map(m=>                       )

Mappez sur le tableau, en passant chaque chaîne à travers une fonction, où mest la chaîne actuelle.

 m[1]?

Vérifiez si la chaîne contient un deuxième deuxième caractère ( "'"ou "2").

+m[1]?

S'il essaie de convertir cette chaîne de caractères en un entier. Si la chaîne est "2", elle devient 2, ce qui est vrai. Si la chaîne est "'", elle devient NaN, ce qui est falsey.

m

Si le test précédent est véridique, revenez simplement m.

:m[0]

Sinon, retournez le premier caractère de m.

:m+"'"

Si la chaîne ne contient pas de second caractère, renvoyez-le mavec un '.

.reverse()

Inversez le tableau modifié.


Désolé, je viens de voir ça. Ma propre réponse est similaire à la vôtre: P
Conor O'Brien

2

Python ,  51  48 octets

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

Une fonction sans nom prenant et renvoyant des listes de chaînes.

Essayez-le en ligne!

Inverse la liste d'entrée avec a[::-1]; ajoute un 'à chaque entrée avec v+"'"; dirige chacun de 1 ou 2 caractères selon que l'original a 'ou non un in [:2-("'"in v)].


2

Python 3 , 91 89 72 70 69 65 octets

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

Essayez-le en ligne! (Avec des cas de test)

Apparemment, vous n'avez pas besoin de prendre l'entrée et la sortie comme des chaînes, donc une solution de 69 octets est possible


AFAIK vous pouvez supprimer l'espace aprèslen(i)==1
Stephen

@StepHen Huh, je ne savais pas que c'était autorisé (Je savais que certains interprètes l'ont autorisé, je ne savais tout simplement pas que c'était autorisé dans codegolf)
sagiksp

2
Les langues sont définies par leurs interprètes ici donc, si cela fonctionne dans n'importe quel interprète, c'est valide.
Shaggy

Si l'interprète le permet, vous pouvez le faire. C'est tout ce qui compte pour le golf de code;)
Stephen

len(i)-2est plus court que len(i)==1(rappelez-vous que 0 est falsey)
Stephen



1

05AB1E , 13 octets

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

Essayez-le en ligne!

Explication

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 '  

1

J, 25 octets

J gère bien celui-ci, autre que la séquence d'échappement malheureuse nécessaire pour représenter une seule citation:

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

Nous devons représenter la liste à l'aide de données encadrées, car il s'agit d'un mélange d'éléments à un et deux caractères, d'où:

  • &.> - "under unbox", ce qui signifie déballer chaque élément, effectuer l'opération qui suit (c'est-à-dire, les symboles expliqués ci-dessous) puis réemballer une fois terminé
  • (''''={:) "si le 2ème caractère est un guillemet simple" ....
  • @. (Verbe de l'ordre du jour de J, une sorte de déclaration ternaire généralisée ou une déclaration de cas) "puis effectuez le 2e point de la liste de l'ordre du jour, sinon effectuez le premier"
  • }: (le 2e point de la liste de l’ordre du jour), "supprimer le dernier caractère", c’est-à-dire la citation unique
  • `(Le verbe de cravate de J) Vous pouvez penser à cela comme le séparateur de point de l'ordre du jour
  • ,&'''' (premier point de la liste de l'ordre du jour) "ajouter une seule citation à la fin"
  • |. "sens inverse"

Essayez-le en ligne!




0

Java 8, 141 128 126 octets

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

Prend l'entrée comme simple Stringsans espaces (ie RUR'URU2R'U).

Explication:

Essayez-le en ligne.

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

Exemple des étapes ci-dessus, avec comme entrée donnée: 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'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.