Послідовності ідентичності на кубі Рубіка


32

Послідовність руху - це послідовність рухів (поворотів) на кубі Рубіка (для позначення дивіться нижче). Поруч із порожньою послідовністю переміщення є багато інших послідовностей переміщення, які взагалі не впливають на куб. Ми називаємо ці ідентичні послідовності переміщення послідовностями.

Деякі з цих послідовностей ідентичності очевидно визначити, як U2 R R' U2або U D2 U' D2. У першому робиться два випадкові рухи, U2 Rа потім негайно скасовується R' U2. Другий подібний. Перші два випадкові ходи, U D2а потім вони скасовуються, але у зворотному порядку U' D2. Це працює лише тому, що переміщення Uвпливає лише на шматочки верхнього шару, а переміщення D2впливає лише на частини нижнього шару. Ви можете побачити візуалізацію цих двох послідовностей руху.

U2 R R' U2 U D2 U' D2

Інші ідентичності послідовностей можуть бути зовсім не очевидними. Наприклад, послідовність R' U' R' F' U F U' R' F R F' U' R U2 R. Він досить довгий, але також зовсім не впливає на куб.

enter image description here

Позначення переміщення

Хід описує поворот одного шару однієї з шести граней куба. Рух складається з однієї літери, що представляє обличчя, а потім необов'язковий суфікс, що представляє кут повороту.

Букви та їх відповідні грані - U (вгору - сторона, звернена вгору), D (вниз - сторона, спрямована вниз), R (праворуч - сторона, спрямована вправо), L (зліва - сторона, звернена вліво) , F (спереду - сторона, звернена до вас), і B (спина - сторона, спрямована від вас).

Якщо суфікса немає, обличчя повернене на 90 градусів за годинниковою стрілкою, суфікс 'означає, обличчя повернене на 90 градусів проти годинникової стрілки, а суфікс 2означає, що обличчя повернуто на 180 градусів за годинниковою стрілкою.

У вас є проблеми з позначеннями, просто використовуйте http://alg.cubing.net , де ви можете візуалізувати такі послідовності переміщення.

Змагання

Ваше завдання - написати програму, яка визначає, чи є послідовності переміщення ідентичністю чи ні.

Ви можете написати повну програму або функцію. Він повинен отримувати рядок, що містить послідовність переміщення (ходи розділені пробілами) як вхід (через STDIN, аргумент командного рядка, аргумент підказки або функції), а вихід (через значення повернення або STDOUT) булеве значення або відповідне ціле число ( Правда - 1 - послідовність ідентичності / Неправильно - 0 - не послідовність ідентичності).

Якщо суфікс 'створює проблеми в мові програмування, ви можете використовувати інший символ, але не в цифрі. R F2 U3не дозволено.

Це codegolf, тому найкоротший код (у байтах) виграє.

Випробування

"" -> True
"U2 R R' U2" -> True
"U D2 U' D2" -> True
"U2 R U2 R'" -> False
"R' U' R' F' U F U' R' F R F' U' R U2 R" -> True
"L'" -> False
"B B2 B' B2" -> True
"D D2 D'" -> False
"R F' D2 U B' F2 B' U2 D2 F2 B2 U F R'" -> True
"D2 U' R2 U F2 D2 U' R2 U' B' L2 R' B' D2 U B2 L' D' R2" -> False
"R U R' U' R' F R2 U' R' U' R U R' F' R2 U R2 U' R2 U' D R2 U' R2 U R2 D'" -> True
"R U R' U' R' F R2 U' R' U' R U R' F' R2 U' R2 U R2 U' D R2 U' R2 U R2 D'" -> False
"B2 F2 U' F2 U R2 F2 U2 B D' R' D' R2 D' F2 U' F U R2 U R B D B D2 L2 D' F2 U D' R' D B R2 D2 F2 R' F2 D2" -> True
"R U2 R' U R' U2 R U2 R U R' U' R' U R U2" -> False
"U F B' R' U F' R U' F' B L U' F L'" -> False
"R2 U' R' U' R U R U R U' R" -> False
"R' F R' B2 R F' R' B2 R2" -> False

Що не так R F2 U3?
Іван Дворак

2
Я просто хочу переконатися, що всі мають однакові передумови. Якщо я дозволю U3, то ти можеш просто передати суфікс у цифру.
Якубе

3
Я більше звик до позначень, які використовують T-Top, B-Bottom і P-Posterior (назад). Людям, напевно, просто сподобалось бачити послідовністьR2 D2 .
mbomb007

2
@ mbomb007 Я можу зрозуміти T для верху, але я ніколи не бачив P для задньої частини, і я б не зрозумів його значення, якби не ваш коментар ...
Джон Дворак

2
@ mbomb007 Я теж бачив цю нотацію, але вона не є настільки поширеною або такою ж старою, як оригінальна нотація Singmaster, і я не знаю, чому люди хочуть возитися з оригіналом. Хоча Девід Сінгмастер (наскільки я знаю) про це не згадував, я помітив, що всі обличчя цілком послідовні і без сутичок, якщо розглядати їх як напрямки, а не позиції.That is F(orward), B(ackward), L(eft), R(ight), U(p), D(own)
Річка Рівня Св.

Відповіді:


14

Haskell, 263 261 247 243 символів

c[x]=[x]
c(x:"2")=[x,x]
c(x:_)=[x,x,x]
s!a@[x,y,z]=case s of
 'R'|x>0->[x,-z,y]
 'B'|y>0->[z,y,-x]
 'U'|z>0->[-y,x,z]
 'L'|x<0->[x,z,-y]
 'F'|y<0->[-z,y,x]
 'D'|z<0->[y,-x,z]
 _->a
r=[-2..2]
i=mapM id[r,r,r]
f w=i==foldr(map.(!))i(c=<<words w)

Досить прямолінійний алгоритм; кожен кубик складається з 1,2,4 або 8 шматочків, що кодують його положення та орієнтацію; 4 куски на край кубика, 8 на кутовий куб, 7 кубів нерухомі.

c c прив'язує кожне слово вводу до послідовності поворотів CW, і! надсилає кожен фрагмент відповідно до черги. iце я позиція dentity. fє основним ф ункцією.

Я не надто задоволений c функцією homp, але, здається, не можу знайти і спосіб її скоротити (@Nimi, проте)


Як щодо c(x:"2")=[x,x]і c(x:_)=[x,x,x]. Економить 2 байти.
німі

Якщо ви використовуєте i=sequence[s,s,s]та зміните всі кортежі до списків (тобто: (x,y,z)стає [x,y,z]) - це збереже ~ 9 символів. Вкладиш економить ще 4. Відмова від _справи !зберігає ще 11.
MtnViewMark

@MtnViewMark зроблено та вдосконалено i, дякую. Не впевнені, що ви маєте на увазі підкресленням i- будь ласка, зверніть увагу, що воно з’являється двічі у визначенні для f. Не впевнений, що ви маєте на увазі під випаданням _корпусу - або _->aповністю вийти з нього, або перемістивши його до вершини, виходить невичерпне виняток з шаблону, а переміщення його до вершини жодного разу не врятує жодних символів. Однак мені вдалося зберегти 5 символів.
Джон Дворак

Прекрасне рішення. Я перевірив усі тестові випадки.
Якубе

Знову вітаю ваше рішення. Оскільки ви представили найкоротший код, ви отримуєте репутацію на суму 100 репутацій.
Якубе

4

Кубічно , 6 4 байти

¶=8%

Я виграю: P

¶=8%
¶     read a string, evaluate as Cubically code
 =8   set notepad to (notepad == 8th face)
   %  print notepad

Блокнот ініціалізується до нуля. 8-е "обличчя" містить 1, якщо куб нерозв'язаний, і 0 в іншому випадку.

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


3
Схоже на цікаву мову. Але оскільки мова була створена після публікації виклику, вона не підходить для перемоги.
Якубе

2
@Jakube Я погоджуюся, що його не слід приймати, лише через те, що це мова з вбудованими Кубками Рубіка, розміщеними настільки пізно після виклику, і так повністю знижуючи інші відповіді. Але технічно це право на перемогу відповідно до мета (неконкурентне правило було дещо скасовано).
MD XF

3

J - 232, 220, 381, 315 296 байт

Це рішення кодує всі операції як перестановки обличчя і працює на основі того, що всі повороти обличчя насправді однакові, при обертанні всього куба.

Редагувати : ще трохи гольфу

f=:+/~6&*
r=:4 :'y f&.>(]{^:x~)&.C.;/i.2 4'"0
t=:((r~0),_4<\44#.inv 1478253772705907911x)&C.&.
Y=:(C.(,0 2 r 4 5),;/4 f&i.8)&{^:t
X=:((,1 1 0 2 r 2 4 3 1)C.C.;/0 4 2 5 f i.8)&{^:t
61".@A."1'=: ',"#~6 3$'D0XR1YF1XU2YB3XL3Y'
T=:[:(_2".@}.'(i.48)-:'&(,,[))[:(,'^:',])/&.>@|.&.;:[:''''&=@{.`]},:&'3'

Крім попередніх спроб, це робить прийняти поворот кута до уваги.

f - це лише помічна функція. rробить обертання одного обличчя. обличчя кодується так:

  1. всі кути з кроком 6
  2. всі краї з кроком по шість

цей порядок полегшує кодування обертів і поворотів. t- прислівник, який закручує обличчя під певним обертанням куба, вибираючи обличчя.

Xі Yє прислівниками, які беруть за аргумент лівий номер у тому напрямку всього куба.

У наступному рядку визначаються всі обертання: 3 символи за обертання: назва, кількість обертів та напрямок.

Останній рядок визначає тестове дієслово T, перетворюючи 3, і 'на позначення Power, гортаючи порядок операції, додаючи тестовий вектор, і остаточно виводить всю справу.

Детальніше на запит.

tests =: (] ;. _2) 0 : 0

 U2 R R' U2
 U D2 U' D2
 U2 R2 R'
 R' U' R' F' U F U' R' F R F' U' R U2 R
 L'
 B B2 B' B2
 D D2 D'
 R F' D2 U B' F2 B' U2 D2 F2 B2 U F R'
 D2 U' R2 U F2 D2 U' R2 U' B' L2 R' B' D2 U B2 L' D' R2
 R U R' U' R' F R2 U' R' U' R U R' F' R2 U R2 U' R2 U' D R2 U' R2 U R2 D'
 R U R' U' R' F R2 U' R' U' R U R' F' R2 U' R2 U R2 U' D R2 U' R2 U R2 D'
 B2 F2 U' F2 U R2 F2 U2 B D' R' D' R2 D' F2 U' F U R2 U R B D B D2 L2 D' F2 U D' R' D B R2 D2 F2 R' F2 D2
 R U2 R' U R' U2 R U2 R U R' U' R' U R U2
 U F B' R' U F' R U' F' B L U' F L'
 R2 U' R' U' R U R U R U' R
 R' F R' B2 R F' R' B2 R2
)
res =: 1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0
res ([,],:=) T"1 tests NB. passes all tests.
1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0
1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

NB. some handy display methods:
dispOrig=: (". ;._2) 0 :0
   _   _   _   5  29  11   _   _   _   _   _   _
   _   _   _  47  _1  35   _   _   _   _   _   _
   _   _   _  23  41  17   _   _   _   _   _   _
   3  27   9   0  24   6   1  25   7   2  26   8
  45  _3  33  42  _6  30  43  _5  31  44  _4  32
  21  39  15  18  36  12  19  37  13  20  38  14
   _   _   _   4  28  10   _   _   _   _   _   _
   _   _   _  46  _2  34   _   _   _   _   _   _
   _   _   _  22  40  16   _   _   _   _   _   _
)
ind =: dispOrig i.&, i. 48 NB. indices of i.48 in the original display

disp =: (9 12$(,dispOrig) ind}~ ])
changed =: 1 : '(u ~:&disp ]) i.48' NB. use to debug permutation verbs: L ch
vch =: 1 :'disp  ((]+_*=) u)'
NB. viewmat integration RGB
cm =: 255 * 1 0 0 , 1 1 1, 0 1 0, 1 1 0, 1 0.5 0, 0 0 1,: 0 0 0 NB. colormap
NB. use as:  "cube i. 48" for seeing a nice folded out cube.
cube =: cm viewmat (>&7 + >&15 + >&23 + >&31 + >& 39 + >&47)@|@disp@]

11
"оскільки результати моїх тестів не відповідають наведеним ...", як у вашому рішенні, не працює? Я б тоді не опублікував це ...
Джон Дворак

Ти правий. Виправлено це зараз.
jpjacobs

Я додав 4 додаткові тестові справи. Двоє з них досі повертають хибний результат. Схоже, ви ігноруєте орієнтацію кутів.
Якубе

@jpjacobs У цьому питанні зараз 100 багатств. Хочете виправити свій код?
Якубе

Вуаля, зроблено. Тепер просто зменшуємо.
jpjacobs

2

Пітон 3: 280 знаків

Це не учасник виклику. По-перше, тому, що я задав виклик сам, а по-друге, це не мій код. Усі кредити належать Стефану Похману , який відкрив цей дивовижний спосіб імітації куба Рубіка. Я лише зробив кілька гри в гольф та деякі незначні зміни стосовно виклику.

def f(a):
 s=t="UF UR UB UL DF DR DB DL FR FL BR BL UFR URB UBL ULF DRF DFL DLB DBR".split()
 for m in a.split():q="FLBR FRBL FDBU FUBD URDL ULDR".split()['UDLRFB'.index(m[0])];n=2+"2'".find(m[-1]);s=[[p,p.translate(str.maketrans(q,q[n:]+q[:n]))][m[0]in p]for p in s]
 return s==t

Ідея цього полягає в наступному. sпредставляє розташування частин UF, URі так далі. Наприклад: s = ['DF', 'BL', ...]означає, що шматок UFзнаходиться в положенні DF, шматок URзнаходиться в положенніBL , ...

Як змінюється положення шматка при русі. Якщо ви робите U-переміщення, всі наклейки (кольори) Uшару -шару, які стикаються з лицьовою стороною, переміщуються до лівого обличчя. Наклейки лівого обличчя переміщуються назад, ці праворуч та цілі переднє. Зашифровано FLBR. Деякі приклади: UFпереміщення до UL, UFRпереміщення до ULFтощо. Тому нанесення ходу - просто перекладення граней шматків у відповідний шар.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.