Это кубик Рубика?

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 У моих детей кубики Рубика только с четырьмя «субкубами».
Адам
2
@ H.PWiz Нет, ты не можешь. Это подразумевалось в моих определениях, но я сделаю это в вопросе явным.
Пшеничный волшебник
2
Ваша спецификация не включает в себя полное описание трех законов четности куба. 1. Невозможно иметь только 1 ребро, перевернутое на 180 градусов (упомянуто) 2. Невозможно иметь только 1 угол, повернутое на 120 градусов (не упомянуто) 3. Невозможно иметь нечетную перестановку кубов (не упомянуто). ). Я голосую близко, пока это не будет решено. См. Ryanheise.com/cube/cube_laws.html для объяснения.
Уровень Река St
4
@LevelRiverSt Обратите внимание, что кубик Рубика является самодостаточным, любой может получить математическую формулировку и законы четности независимо.
user202729

Ответы:

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 в кодовой странице Cubically), является определением функции; эти функции строятся друг от друга, чтобы составить настоящий алгоритм дьявола. Первая строка, которая будет выполнена, является последней:

rs[f36f71]8

rчитает куб из stdin и устанавливает для него куб памяти. sпереводит интерпретатор в «resolmode», что означает, что он выходит и печатает, 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

Это действительно выполняется за 0,007 секунды на TIO .

Как это можно улучшить?

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

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

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

Обратите внимание, что я буду продолжать оптимизировать все, что возможно в интерпретаторе, так что это может сработать на среднем ПК в будущем!


Кубически, 2 байта

r▦

Мне больше нравится ответ выше, поэтому я добавляю это как альтернативное решение. Это занимает менее секунды, а не несколько миллионов лет.

r    read cube from standard in
 ▦   and solve it

Выведите, если куб разрешим: (ничего)
Выведите, если куб неразрешим: Error: The cube has reached an unsolvable state.

MD XF
источник
Это работает, если мы поменяемся местами? Например, 2 на противоположном 4 в дампе куба, работает ли оно, если 2 противоположно 5, а 4 противоположно 0?
Волшебник Пшеницы
1
@WheatWizard Да, это так, решает режим, проверяет, имеет ли каждое лицо уникальное целое число, и является ли это целое число единственным на лице.
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 (row0: спереди назад, row1: слева направо, row2: вверх вниз) из матриц 3x3 символов. Возвращает 1 для разрешимого кубика Рубика, 0 в противном случае.

В ссылке TIO функция t, которая не включена в число символов, читает 9 строк ввода, преобразует их из формата ввода по умолчанию (нетто) в требуемую матрицу 3x2 x 3x3, вызывает решение и печатает OK, если результат как и ожидалось.

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

  • среди 6 центров дубликатов нет

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

  • четности как перестановки углов, так и перестановок ребер четны

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

СПП
источник