Обратный алгоритм Кубика Рубика

19

Всякий раз, когда вы делаете ход на кубике Рубика, есть обратный ход, который отменяет первый ход. Из-за этого каждый алгоритм (набор ходов) имеет обратный алгоритм, который отменяет первый алгоритм.

Цель этой задачи - найти обратную сторону заданного алгоритма.

Спецификация:

Вход состоит из массива отдельных ходов. Каждый шаг представляет собой строку длиной 1 или 2. Конечно, вы можете использовать любой формат ввода, наиболее подходящий для вашего языка. Каждый ход состоит из структуры Xили X'или X2, где Xесть заглавные или строчные буквы.

Чтобы полностью изменить X, просто замените это X'. Аналогично X'становится X. X2с другой стороны не меняется.

Чтобы создать вывод, поменяйте местами каждое движение, а затем обратный массив.

Примеры (строки, разделенные пробелами):

R => R'

D U' => U D'

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

A2 B2 => B2 A2

Подсчет очков:

Это код-гольф, поэтому выигрывает наименьшее количество байтов. Стандартные лазейки не допускаются.

Джулиан Лахниет
источник
Есть R2-> R2'или B-> B3разрешено?
CalculatorFeline
2
Необходимость справиться X3или X1была бы хорошим дополнением к вызову.
Лохматый
1
«Из-за этого каждый алгоритм (набор ходов) имеет обратный алгоритм, который отменяет первый алгоритм», верно ли это для каждого алгоритма? Потому что я думаю, что алгоритмы хеширования являются одним из способов. Значит, у него нет обратных алгоритмов, верно? пожалуйста, дайте мне знать
Avishek Saha
4
@AvishekSaha: Для задач Кубика Рубика «алгоритм» ограничен значением «последовательность ходов, которые вы можете делать на Кубе». В этом смысле на кубе не существует такого понятия, как односторонний алгоритм хеширования.
Росс Прессер
5
Должен был D2R2в качестве контрольного примера ...
Нил

Ответы:

7

V , 13 10 байт

æGÇä/á'Ó''

Попробуйте онлайн!

3 байта сохранены благодаря @nmjmcman, указывающему на мою любимую функцию. Объяснение:

æ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
источник
äНравится ли представлять регулярное выражение при компиляции в vim?
Вниз
@ Даунгоат Да! Оно делает. В переводе на vim это решение :g!/\d/norm A'<CR>:%s/''//g<CR>gg:g/^/m0<CR>Подробнее о том, как V сжимает регулярные выражения, можно найти здесь
DJMcMayhem
@DJMcMayhem Не являются ли неявные окончания как ваша любимая особенность? Попробуйте онлайн!
nmjcman101
3
Я знаю, что уже поздно, но это не работает для меня. Он превращает R2 в 2R, что недопустимо
Джейми Санборн
7

Сетчатка 0.8.2 , 27 26 байт

\w
$&'
''

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

Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Пояснение: Первый этап добавляет апостроф после каждого буквенно-цифрового. Это приводит к двойным апострофам (с или без включительно 2), которые должны быть удалены. Финальный этап меняет ходы.

Нил
источник
Можно ли это улучшить с выпуском Retina 1.0 ?
MD XF
@MDXF Похоже, что O$^на самом деле это лучший способ перевернуть список совпадений, поэтому количество байтов в Retina 1 фактически не изменяется
Нил
5

JavaScript (ES6), 45 байт

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

Самое короткое решение - взять Array IO. Простое и правильное использование аргумента уничтожения.

Вывод строки составляет +8 байт для .join` `.

Строковый ввод, вывод массива: 69 байт

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

Конор О'Брайен
источник
Хороший. Почему я никогда не думаю, чтобы разрушить параметры функции ?! :(
Лохматый
Вы должны быть в состоянии заменить .reverse()с ::reverseсохранением 1 байта, но сделав ES7
Downgoat
@ Downgoat В любом месте, где я могу проверить ES7?
Конор О'Брайен
@ ConorO'Brien, вы можете использовать Babel Online REPL (отметьте галочкой «Выполнить» и все предустановки для всех функций): babeljs.io/repl
Downgoat
4

Желе , 11 байт

ḟ;ċ?”'ḣ2µ€Ṛ

Монадическая ссылка, возвращающая список списков символов («массив» из «строк»).

Попробуйте онлайн! (Нижний колонтитул избегает разрушения вывода, отображая список разделенным пробелами.)

Как?

ḟ;ċ?”'ḣ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 байт с новым желе.
user202729
4

JavaScript (ES6), 46 байт

Принимает ввод как массив ходов.

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

Проверь это

Введите разделенный запятыми список ходов.

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>


объяснение

a=>

Анонимная функция, принимающая массив ходов в качестве аргумента через параметр a.

a.map(m=>                       )

Отобразить массив, передав каждую строку через функцию, где mнаходится текущая строка.

 m[1]?

Проверьте, содержит ли строка второй второй символ ( "'"или "2").

+m[1]?

Если это так, попробуйте привести эту строку символов к целому числу. Если строка есть "2", она становится 2правдивой. Если строка "'", это становится NaN, что ложно.

m

Если предыдущий тест верен, просто вернитесь m.

:m[0]

В противном случае верните первый символ m.

:m+"'"

Если строка не содержит второй символ, возвращаемое mс добавлением '.

.reverse()

Переверните измененный массив.

мохнатый
источник
Извините, я только что видел это. Мой собственный ответ похож на ваш: P
Конор О'Брайен
2

Python ,  51  48 байт

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

Безымянная функция, принимающая и возвращающая списки строк.

Попробуйте онлайн!

Переворачивает список ввода с помощью a[::-1]; добавляет 'к каждой записи с v+"'"; заголовки каждого из них на 1 или 2 символа в зависимости от того, был ли оригинал с 'или нет [:2-("'"in v)].

Джонатан Аллан
источник
2

Python 3 , 91 89 72 70 69 65 байт

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

Попробуйте онлайн! (С тестами)

Очевидно, вам не нужно принимать ввод и вывод в виде строк, поэтому возможно 69-байтовое решение

sagiksp
источник
AFAIK вы можете удалить пробел послеlen(i)==1
Стивен
@ StepHen Да, не знал, что это разрешено (знал, что некоторые переводчики это разрешали, просто не знал, что это разрешено в Codegolf)
sagiksp
2
Здесь языки определяются их интерпретаторами, поэтому, если он работает в каком-либо одном интерпретаторе, он действителен.
Лохматый
Если переводчик это позволяет, вы можете это сделать. Вот и все, что волнует код-гольф;)
Стивен
len(i)-2короче len(i)==1(помните, 0 - фальсификация)
Стивен
1

05AB1E , 13 байтов

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

Попробуйте онлайн!

объяснение

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
источник
1

J, 25 байт

J хорошо с этим справляется, кроме неудачной escape-последовательности, необходимой для представления одной кавычки:

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

Нам нужно представить список с помощью данных в штучной упаковке, так как это набор из одного и двух символов, следовательно:

  • &.> - «under unbox», что означает «распаковать каждый элемент», выполнить следующую операцию (т. е. символы, описанные ниже), а затем перезагрузить, когда закончите
  • (''''={:) "если 2-ой символ - одинарная кавычка" ....
  • @. (Глагол повестки дня J, своего рода обобщенное троичное утверждение или падежное утверждение) «затем выполните 2-й пункт в списке повестки дня, в противном случае выполните первый»
  • }: (2-ой пункт в списке повестки дня), «удалить последний символ», то есть, одиночная кавычка
  • `(Галстук глагола J) Вы можете рассматривать это как разделитель пунктов повестки дня
  • ,&'''' (первый пункт в списке повестки дня) "добавить одну цитату в конец"
  • |. "задний ход"

Попробуйте онлайн!

Ион
источник
0

Java 8, 141 128, 126 байт

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

Принимает ввод как один Stringбез пробелов (т.е.RUR'URU2R'U ).

Объяснение:

Попробуйте онлайн.

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

Пример описанных выше шагов с заданным вводом: 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'
Кевин Круйссен
источник