Це кубик Рубіка?


25

Почитаний час проходження педантів повинен зазначити, що малюнки «Кубики Рубіка» (на футболках, плакатах тощо) насправді не вирішуються.

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

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

Пов'язане пояснення

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

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

IO

Ви можете взяти куб будь-яким розумним чином. Якщо у вашій мові є якийсь вбудований тип «куб-обличчя», добре для вас, це чудово, як вхід, іншим розумним ви можете взяти двовимірний масив мережі, куба, 1 3 на 3 списки для кожного обличчя. Просто будьте розумні. Якщо ви хочете знати, чи є прийнятний коментар для певного формату, або пінг-мене в чаті, і я додаду до виклику заяву про свою дійсність.

Ваш формат введення потребує лише до 9 можливих кольорів.

Для виводу це проблема рішення, тому вам слід вивести одне постійне значення для "Так, це дійсний куб Рубіка" та одне інше постійне значення для "Ні, це не дійсний куб Рубікса".


Це тому відповіді будуть набиратись у байтах, менша кількість байтів - краща.

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

Ось тестові випадки. Вони відформатовані як сітка куба з кожним квадратом у вигляді однієї літери. Різні букви представляють різні кольори. За запитом можна додати будь-які інші тести.

Розв’язний

   RRR
   RRR
   RRR
GGGWWWBBBOOO
GGGWWWBBBOOO
GGGWWWBBBOOO
   YYY
   YYY
   YYY


   GRR
   GRR
   ORW
WWRBWYBOOGGY
GGRBWGYBBOOO
OOGRWGYWWRBB
   WYO
   YYB
   YYB

Нерозв’язний

   RRR
   RRR
   RRR
GGGWWWBBBOOO
GGGWWWBBBOOO
GGGWYWBBBOOO
   YWY
   YYY
   YYY


   RRR
   RRR
   RRR
GGGWWWBBBOOO
GGGWWWBBBOOO
GGGWWWBBBOOO
   YWY
   YYY
   YYY


   RRR
   RRR
   GGG
GGYWYWRBBOBO
GGYWWWROBOOO
GGYWWWRBBOOO
   BBB
   YWY
   YYY


   RRW
   RRW
   GGG
GGYWWYEOBROO
GGYWWYEBBROO
GGOWWYWBBROO
   BBB
   YYW
   YYO

14
Мені потрібно обов'язково зазначити, що кубик Рубіка у вашому аватарі не вирішується. Він має лише 4 квадрата на стороні, що виходить назустріч, тоді як у нормального куба Рубіка має бути 9. Не кажучи вже про дивні символи на вершині квадратів.
DJMcMayhem

2
@DJMcMayhem У моїх дітей є кубики Рубіка з чотирма лише «кубиками».
Adám

2
@ H.PWiz Ні, ви не можете. Це було неявним у моїх визначеннях, але я зроблю це явно у питанні.
Пшеничний майстер

2
Ваша специфікація не включає повний опис трьох законів паритету куба. 1. Неможливо мати лише 1 край перевернутий на 180 градусів (згаданий) 2. Не можна мати лише 1 кут, закручений 120 градусів (не згадується) 3. Неможливо мати непарну перестановку кубиків (не згадується). ). Я решаю голосувати, поки це не буде вирішено. Див. Ryanheise.com/cube/cube_laws.html для пояснення.
Рівень річки Св.

4
@LevelRiverSt Зауважимо, що куб Рубіка є автономним, кожен може вийти з законів математичного формулювання та парності незалежно.
користувач202729

Відповіді:


14

Кубічно , 1664 1631 1089 байт

⇒FD2F'R'D2RUR'D2RFD2F'U'
⇒Ff1F'
⇒LFf1F'L'
⇒F'f1F
⇒F2f1F2
⇒L'F2f1F2L
⇒D'F'f1FD
⇒LR'FLR'DLR'B2L'RDL'RFL'RU2
⇒LFf8F'L'
⇒R'F'f8FR
⇒Ff8F'
⇒F'f8F
⇒ULU'f8UL'U'
⇒U'R'Uf8U'RU
⇒F2f8F2
⇒Df15D'
⇒D'f15D
⇒D2f15D2
⇒UF2UF2D'L2B2U'B2DL2F2D2B2D2F2
⇒U'DL2UD'B2
⇒UF2UF2D'L2B2D'R2UR2F2D2B2U2B2
⇒BL'BU2D2F'RF'U2D2
⇒LD'F2U'B2U'RU2R'F2R2F2D'R2DF2D
⇒B2URB2D2B2RB2U'D'L2D'B2
⇒B2LF'U'B2UFL'R2B2U'D2L2D'B2U
⇒B2RB2D2B2RB2U'L2UD'F2U'F2B2
⇒D2R'FUB2U'F'RU2B2D'F2R2UF2UF2
⇒B2R2U'L'D2B2U2R'U2R2F2L2R2UR2
⇒D2L'B2U2F2RUL2U'F2R2U'R2U2F2DL2D'
⇒UB2U'L2DL2B2DB2D'B2
⇒BR'BL2B'RBL2B2
⇒UF2B2U'F2B2U'F2L2R2B2R2
⇒R2U'F2DR2UF2D'R2DF2R2D'F2
⇒U'F2DF2UL2F2DL2DF2L2D2F2
⇒U2D'L2U'F2L2U'B2L2R2U'L2B2
⇒F2D'R2U2L2B2UF2L2U2F2L2UF2R2
⇒[f1]3
⇒[f2f37]3
⇒[f3f38]3
⇒[f4f39]3
⇒[f5f40]3
⇒[f6f41]3
⇒[f7f42]3
⇒[f8f43]2
⇒[f9f44]2
⇒[f10f45]2
⇒[f11f46]2
⇒[f12f47]2
⇒[f13f48]2
⇒[f14f49]2
⇒[f15f50]2
⇒[f16f51]2
⇒[f17f52]2
⇒[f18f53]2
⇒[f19f54]2
⇒[f20f55]3
⇒[f21f56]4
⇒[f22f57]5
⇒[f23f58]6
⇒[f24f59]7
⇒[f25f60]8
⇒[f26f61]9
⇒[f27f62]9[f27f62]2
⇒[f28f63]9[f28f63]3
⇒[f29f64]9[f29f64]4
⇒[f30f65]2
⇒[f31f66]3
⇒[f32f67]4
⇒[f33f68]5
⇒[f34f69]6
⇒[f35f70]7
rs[f36f71]8

Вихід, якщо вирішується: Solved!
Виводиться, якщо нерозв'язується: (порожній, немає виводу)

Введення має бути відформатоване як кубічний куб-дамп (див. DebugРозділ). Це явно дозволило ОП.

Пояснення

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

Кожен рядок, що починається з (0x84 на сторінці коду Кубіка), є визначенням функції; ці функції вибудовують одна одну, щоб скласти власне алгоритм Диявола. Перший рядок, який потрібно виконати, - останній:

rs[f36f71]8

rзчитує куб зі stdin і встановлює йому куб пам'яті. sпереводить інтерпретатора в "розчинмоду", що означає, що він виходить і друкує, Solved!якщо куб вирішиться (після того, як не буде розв'язано) в будь-якій точці. Решта команд (які просто повторюються f36f718 разів) відповідають остаточному алгоритму внизу пов’язаної сторінки:

(D) = (CP) = (CPT8) = [(CPC8)(CPT7)]8 (3,847,762,288,469,010,006,992 moves)

(D) is the Devil's Algorithm. If you apply it to the cube, it will be solved at some point before you have done the algorithm once. As you can see, it is terribly long, nearly a thousand times more moves than there are possible positions.

Як я можу це запустити?

Ви можете спробувати в Інтернеті , але це посилання не працює. TIO майже напевно вичерпається до завершення роботи цього алгоритму (максимальний час виконання перекладача - 60 секунд). Якщо куб не вирішується, цей алгоритм потребуватиме до 11 мільйонів років, щоб закінчити Кубічно (зі швидкістю ~ 15,2 мільйона рухів в секунду, що і отримує мій Cloud9 IDE ).

Крім того, вам потрібно багато пам’яті, щоб виконати 3 рухи секстиліона. Кубічно може виконувати близько 4 мільйонів рухів в секунду, але процес, швидше за все, загине через надмірну передачу пам'яті . Він вмирає через 15 секунд на моєму ВМ із пам'яттю 512 Мб. Чому слід виконувати рухи на вже виділений плоский масив пам'яті? Знайшли витік пам'яті (або двадцять) і виправили її .

Ось набагато більш читабельна версія, яка поводиться так само.

Але дуже хочеться побачити, що це працює!

Перший фактичний хід, який виконується в алгоритмі цього диявола, є F2таким, що найшвидший куб для вирішення був би одним зі скруткою F2:

   000
   000
   555
113222133444
113222133444
113222133444
   000
   555
   555

Це дійсно виконується за TIO за 0,007 секунд .

Як це можна покращити?

Звичайно, є більше чортових алгоритмів; Я знайшов той, який використовує менше тридцятої частини кроків, які робить цей. Однак це коштувало б декількох тисяч байтів (приблизно на 100 МБ більше) та декількох десятків годин перетворення складної гамільтонової схеми на кубічний код.

Також можна видалити деякі функції і помістити їх прямо в цикл внизу. Однак я збираюся пожертвувати деякими байтами для читабельності.

Крім того, я розглядаю модифікацію циклічної поведінки кубічно, щоб я міг легше повторювати алгоритми 7 або 8 разів (замість того, щоб просто жорстко кодувати їх за допомогою викликів функції, повторених 7 або 8 разів у джерелі). Або я попрацюю з чарівним блокнотом, і гольфую, використовуючи більше циклів.

Зауважте, що я продовжуватиму оптимізувати все можливе у перекладачі, тому це може працювати на середньому ПК десь у майбутньому!


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

r▦

Мені подобається відповідь вище, тому я додаю це як альтернативне рішення. Це триває менше секунди, на відміну від кількох мільйонів років.

r    read cube from standard in
 ▦   and solve it

Вихід, якщо куб вирішується: (нічого)
Вивести, якщо куб нерозв’язний: Error: The cube has reached an unsolvable state.


Чи працює це, якщо ми обміняємо сторони? Наприклад, 2 знаходиться на протилежному рівні 4 на купі, чи працює 2, якщо 2 протилежне 5, а 4 - 0?
Пшеничний майстер

1
@WheatWizard Так, це дає, taskmode перевіряє, чи має кожне обличчя унікальне ціле число, і чи є це ціле число єдиним на обличчі.
MD XF

Гаразд, як треба. Я був недостатньо знайомий з кубічно, щоб знати, чи це було так чи ні з вашого опису.
Пшеничний майстер

@WheatWizard Просто переконайтесь, що я вас правильно зрозумів - це (відповідно до цього) те, про що ви мали на увазі, чи не так?
MD XF

Так. І це повинно бути вирішуваним.
Пшеничний майстер

4

APL (Dyalog Classic) , 190 174 байт

{∧/~∊(×1 2 3|+.-⌿↑⊃∘⍋¨¨¨a)({2|≢∪{⍵⌊⍵[⍵]}⍣≡⍵,0}¨⍳⌿↑⌽b)((∪≢∩)¨/b←(⊃∘⍋⌽⊢)¨¨¨a),6≢≢∪⊃⊃a←{c4⍴⊂⍬⋄c[+/1≠i],←(≠/×i←↑⍳33){⊂⌽⍣⍺⊢⍵~' '}¨,⌿(3|∘.+⍨⍳3)⍉⍤¯11 0 1\⍵1c}¨⍵(3 3∘⍴¨1 1∘⌷¨⍵)}

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

Аргумент - матриця 3x2 (рядок0: передня спина, рядок1: ліворуч праворуч, рядок2: вгору вниз) з 3x3 матриць символів. Повертає 1 для вирішуваного куба Рубіка, 0 в іншому випадку.

У посиланні TIO функція t, яка не включена до числа символів, зчитує 9 рядків введення, перетворює їх із формату вводу за замовчуванням (нетто) у необхідну матрицю 3x2 x 3x3, викликає рішення та друкує ОК, якщо результат як очікувалося.

Алгоритм розбиває заданий куб на 26 кубіків - рядки довжиною 3 (кути), 2 (ребра) та 1 (центри). Він також генерує 26 кубіків вирішеного куба з тими ж 6 центральними кубиками. Усі наступні критерії повинні бути виконані:

  • дублікатів серед 6 центрів немає

  • набори даних / вирішених кубіків відповідають, до обертання - наприклад, врахуйте 'WBR'і 'BRW'того самого кубі, але ні'BWR'

  • парності як кутової перестановки, так і крайової перестановки рівні

  • сума по модулю 3 індексів обертання кутових (наприклад , приймаючи «найменше» лист в Bякості точки відліку ми маємо: 'BRW'→0, 'WBR'→1, 'RWB'→2) збігаються між даними і вирішених кубів; те ж саме для кутів модуля 2

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