Зворотний алгоритм куба Рубіка


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було б приємним доповненням до виклику.
Shaggy

1
"Через це кожен алгоритм (набір рухів) має зворотний алгоритм, який скасовує перший алгоритм" - це правда для всіх алгоритмів ?? Тому що я думаю, що алгоритми хешуваннявання - це один із способів. Значить, у нього немає зворотних алгоритмів, правда? будь ласка, повідомте мене
Авішек Саха

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

Чи äподібне представляє собою регулярний вираз, коли компілюється в vim?
Downgoat

@Downgoat Так! Це робить. Це рішення перекладається на 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>


Хороший. Чому я ніколи не думаю руйнувати параметри функції ?! :(
Shaggy

Ви повинні бути в змозі замінити .reverse()з ::reverseекономією 1 байт , але роблячи ES7
Downgoat

@Downgoat Будь-яке місце, де я можу протестувати ES7?
Conor O'Brien

@ ConorO'Brien ви можете використовувати дівочий онлайн REPL (виконати галочки та всі встановлені поля для всіх функцій): babeljs.io/repl
Пуховик

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 байт з новим желе.
користувач202729

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додається з a '.

.reverse()

Зворотно змінений масив.


Вибачте, я щойно це побачив. Моя власна відповідь схожа на вашу: P
Conor O'Brien

2

Пітон ,  51  48 байт

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

Безіменна функція, яка приймає та повертає списки рядків.

Спробуйте в Інтернеті!

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


2

Пітон 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 байт можливе


AFAIK ви можете видалити пробіл післяlen(i)==1
Стівен

@StepHen Хм, не знав, що це дозволено (Знав, що це дозволяють деякі перекладачі, просто не знав, що це дозволено в codegolf)
sagiksp

2
Тут мови визначаються їх перекладачами, так що, якщо він працює в будь-якому одному перекладачі, він дійсний.
Shaggy

Якщо перекладач дозволяє, ви можете це зробити. Ось і все про код-гольф піклується;)
Стівен

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 '  

1

J, 25 байт

J обробляє цю свердловину, окрім нещасної послідовності втечі, необхідної для представлення єдиної цитати:

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

Нам потрібно представити список за допомогою коробкових даних, оскільки це поєднання одного та двох символьних елементів, отже:

  • &.> - "під розгорткою", що означає розблокувати кожен елемент, виконайте наступну операцію (тобто символи, пояснені нижче), а потім перезавантажте, коли буде зроблено
  • (''''={:) "якщо 2-й символ є однією цитатою" ....
  • @. (Дієслово порядку денного J, вид узагальненої потрійної заяви або випадок справи) "потім виконайте другий пункт у списку порядку денного, інакше виконайте перший"
  • }: (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'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.