Напишите самую короткую программу, которая решает кубик Рубика (3 * 3 * 3) в течение разумного промежутка времени и перемещается (скажем, максимум 5 секунд на вашей машине и менее 1000 ходов).
Ввод в формате:
UF UR UB UL DF DR DB DL FR FL BR BL UFR URB UBL ULF DRF DFL DLB DBR
(этот конкретный вход представляет решенный куб).
Первые 12 двухсимвольных строк - это ребра в позициях UF, UR, ... BL (U = вверх, F = спереди, R = справа, B = сзади, L = слева, D = вниз), затем следующие 8 3-символьные строки - это углы в позициях UFR, URB, ... DBR.
Вывод должен дать последовательность ходов в этом формате:
D+ L2 U+ F+ D+ L+ D+ F+ U- F+
Где D1 или D + представляет поворот D (вниз) по часовой стрелке на 90 градусов, L2 поворачивает L-грань на 180 градусов, U3 или U- представляет поворот U-образной грани против часовой стрелки на 90 градусов.
Буквы не чувствительны к регистру, а пробелы необязательны.
Например, приведенный выше вывод корректен для следующего ввода:
RU LF UB DR DL BL UL FU BD RF BR FD LDF LBD FUL RFD UFR RDB UBL RBU
Для получения более подробной информации, пожалуйста, обратитесь к кубическому конкурсу Томаса Рокицки , за исключением того, что оценка будет производиться напрямую по размеру файла, как при обычной игре в гольф. Онлайн тестер включен тоже.
Для справки, самое короткое решение, которое уже написано, - это последняя запись в списке победителей конкурса кубов.
Для тех, кто пытается визуализировать формат макета:
0-1 2-3 4-5 6-7 8-9 10-11 12-13 14-15 16-17 18-19 20-21 22-23 24-25-26 27-28-29 30-31-32 33-34-35 36-37-38 39-40-41 42-43-44 45-46-47
UF UR UB UL DF DR DB DL FR FL BR BL UFR URB UBL ULF DRF DFL DLB DBR
Front:
+-------+-------+-------+
/ / / /|
/ 30 / 4 / 27 / |
+-------+-------+-------+ |
/ / / /|28+
/ 6 / / 2 / | /|
+-------+-------+-------+ |/ |
/ / / /|3 + |
/ 33 / 0 / 24 / | /|21+
+-------+-------+-------+ |/ | /|
| | | |26+ |/ |
| 35 | 1 | 25 | /| + |
| | | |/ | /|47+
+-------+-------+-------+ |/ | /
| | | |17+ |/
| 18 | | 16 | /|11+
| | | |/ | /
+-------+-------+-------+ |/
| | | |37+
| 40 | 9 | 38 | /
| | | |/
+-------+-------+-------+
Hidden faces:
+-------+-------+-------+
/| | | |
/ | 31 | 5 | 29 |
+ | | | |
/|32+-------+-------+-------+
/ | /| | | |
+ |/ | 22 | | 20 |
/|7 + | | | |
/ | /|23+-------+-------+-------+
+ |/ | /| | | |
|34+ |/ | 44 | 13 | 46 |
| /| + | | | |
|/ | /|43+-------+-------+-------+
+ |/ | / / / /
|19+ |/ 42 / 12 / 45 /
| /|15+-------+-------+-------+
|/ | / / / /
+ |/ 14 / / 10 /
|41+-------+-------+-------+
| / / / /
|/ 39 / 8 / 36 /
+-------+-------+-------+
источник
Ответы:
С ++ - 1123
Пока никто не опубликовал ни одного ответа, я решил упростить и оценить свое решение 2004 года. Это все еще далеко позади самого короткого, который я упомянул в вопросе.
Это не случайно, но это не так просто. Сначала решаются края, затем углы. На каждом шаге он пробует различные комбинации до 4 алгоритмов и простых поворотов (последовательно, а не случайным образом), пока не обнаружит улучшения в количестве решенных фигур, а затем повторяется до тех пор, пока не будет решен. Он использует 2 алгоритма для краев и 2 для углов, переведенных во все позиции куба.
Пример вывода для
RU LF UB DR DL BL UL FU BD RF BR FD LDF LBD FUL RFD UFR RDB UBL RBU
:L2F3B2F3B1U3F1B3R2F3B1U3F1B3D2F2L3D2L1U2B1L1R3U2R1L3B1U2R1U2L1F1B3U2B1F3L1U2L3R1D3L1R3B2L3R1D3L1R3L3R1D3L1R3B2L3R1D3L1R3B3F1D3B1F3R2B3F1D3B1F3U2F3L3R1B3L1R3U2L3R1B3L1R3F1D2F1L1R3D2R1L3F1D2F3L2U1B1F3L2F1B3U1L2R3L1F3R1L3U2R3L1F3R1L3U1F2U1L1R3F2R1L3U1F2U3L3U3L1U3L3U2L1R1U1R3U1R1U2R3F3U3F1U3F3U2F1B1U1B3U1B1U2B3L1B3R3B1L3B3R1B1B3D3B1D3B3D2B1F1D1F3D1F1D2F3R1F3L3F1R3F3L1F1R3B3R1B3R3B2R1L1B1L3B1L1B2L3R1D3L3D1R3D3L1D1B3D3B1D3B3D2B1F1D1F3D1F1D2F3U3R3U1R3U3R2U1D1R1D3R1D1R2D3
(234 хода, 0,3 с здесь)
источник
Python 1166 байт
Значительное количество пробелов было оставлено для удобства чтения. Размер измеряется после удаления этого пробела и изменения различных уровней отступов на
Tab
,Tab
Space
,Tab
Tab
и т.д. Я также избегал играть в гольф , который повлиял на производительность слишком резко.Пример использования:
Это реализация алгоритма Thistlethwaite, использующая поиск IDA * для решения каждого шага. Поскольку все эвристические таблицы необходимо вычислять на лету, было сделано несколько компромиссов, обычно разбив эвристику на две или более равные по размеру части. Это ускоряет вычисление эвристических таблиц во многие сотни раз, в то же время замедляя фазу поиска, обычно незначительно, но это может быть значительным в зависимости от исходного состояния куба.
Переменный индекс
T
- основная эвристическая таблица.S
- решенное состояние куба. Каждый отдельный фрагмент хранится в виде битовой маски, представленной в виде символа. Решенный вектор ориентации определяется как нулевой вектор.I
- различные повороты в том порядке, в котором они исключены из пространства поиска.G
- группы для твист-перестановок, хранящиеся в виде пар, подлежащих обмену. Каждый байт в сжатой строке кодируется для одной пары. Каждому повороту требуется шесть перестановок: три для цикла края и три для цикла угла. Сжатая строка содержит только печатные ASCII (символы от 32 до 126).M
- функция, выполняющая ход, заданная Г.N
- преобразует перестановку четырех объектов в число для целей кодирования.H
- вычисляет эвристическое значение для заданного состояния куба, используемого для поиска глубины перемещения от T.P
- выполнить поиск на одной глубине одной фазы алгоритма.s
- состояние перестановки входного куба.o
- вектор ориентации входного куба.Спектакль
Использование набора данных Томаса Рокицкого , этот сценарий в среднем составлял 16,02 поворотов за одно решение (максимум 35) со средним временем 472 мс (процессор i5-3330 при 3,0 ГГц, PyPy 1,9,0). Минимальное время решения составило 233 мс, максимальное - 2,97 с, стандартное отклонение - 0,488. Используя рекомендации по подсчету очков из соревнования (пробелы не учитываются, ключевые слова и идентификаторы считаются одним байтом на длину 870), общая оценка составила бы 13 549.
Для последних 46 случаев (случайных состояний) оно в среднем составляло 30,83 поворотов за одно решение при среднем времени 721 мс.
Заметки об алгоритме Тистлуэйта
Для тех, кто захочет применить алгоритм Thistlethwaite , вот краткое объяснение.
Алгоритм работает по очень простому принципу уменьшения пространства решения. Таким образом, приведите куб в состояние, в котором подмножество скручиваний не требуется для его решения, уменьшите его до меньшего пространства решения, а затем решите оставшуюся часть, используя только несколько оставшихся скруток.
Первоначально Thistlethwaite предложил
<L,R,F,B,U,D>
→<L,R,F,B,U2,D2>
→<L,R,F2,B2,U2,D2>
→<L2,R2,F2,B2,U2,D2>
. Однако, учитывая формат ввода, я думаю, что сначала легче уменьшить его<L,R,F2,B2,U,D>
(без четверти оборотаF
илиB
), а затем,<L2,R2,F2,B2,U,D>
прежде чем, наконец, достигнуть состояния пол оборота. Вместо того, чтобы точно объяснять, почему это так, я думаю, что это станет очевидным после определения критериев для каждого государства.<L,R,F,B,U,D>
⇒<L,R,F2,B2,U,D>
Чтобы исключить
F
иB
четверть поворота, только края должны быть правильно ориентированы. Жиль Ру имеет очень хорошее объяснение на своем сайте, что такое «правильная» и «неправильная» ориентация, поэтому я оставлю объяснение ему. Но в основном, (и именно поэтому этот формат ввод настолько располагающее кF
иB
ликвидация), кромка Cubie правильно ориентирована , если он соответствует следующему регулярному выражению:[^RL][^UD]
. Правильная ориентация обычно обозначается как «0
а», а неправильная -1
. В принципеU
иD
наклейки не могут появляться наR
илиL
лицо, или по краям любойU
илиD
краевой cubies, или они не могут быть перемещены на место , не требуяF
илиB
поворот четверти<L,R,F2,B2,U,D>
⇒<L2,R2,F2,B2,U,D>
Два критерия здесь. Во- первых, все углы должны быть ориентированы правильно, а во- вторых, каждый из cubies для среднего слоя (
FR
,FL
,BR
,BL
) должны быть где - то в среднем слое. Ориентация угла очень просто определяется с учетом формата ввода: положение первогоU
илиD
. Например,URB
имеет ориентацию0
(правильно ориентированную),LDF
имеет ориентацию1
иLFU
ориентацию2
.<L2,R2,F2,B2,U,D>
⇒<L2,R2,F2,B2,U2,D2>
Критерии здесь следующие: каждое лицо может содержать наклейки только со своего лица или прямо напротив него. Например, на
U
лице может быть толькоU
иD
наклейки, наR
лице может быть толькоR
иL
наклейки, наF
лице может быть толькоF
иB
наклейки и т.д. Самый простой способ обеспечить это , чтобы проверить , если каждое ребро часть находится в его «срез», и каждый угловой элемент на своей «орбите». Кроме того, нужно обратить внимание на краевой паритет. Хотя, если вы проверяете только четность углов, четность границ также гарантируется, и наоборот.Как повороты влияют на ориентацию
U
иD
повороты не влияют ни на ориентацию кромки, ни на ориентацию угла. Части могут быть поменяны местами без обновления вектора ориентации.R
иL
повороты не влияют на ориентацию кромки, но они влияют на ориентацию угла. В зависимости от того, как вы определяете свой цикл, изменение угла ориентации будет либо+1, +2, +1, +2
или+2, +1, +2, +1
все по модулю3
. Обратите внимание, чтоR2
иL2
повороты не влияют на угловую ориентацию, так как+1+2
равен нулю по модулю3
, как есть+2+1
.F
иB
влияют как на ориентацию краев, так и на ориентацию углов. Ориентация краев становится+1, +1, +1, +1
(мод 2), а ориентация углов такая же, как дляR
иL
. Обратите внимание, чтоF2
и неB2
влияют ни на ориентацию ребер, ни на ориентацию углов.источник
<L,R,F,B,U,D>
-><L2,R2,F2,B2,U,D>
-><I>
. Для решения куба требуется максимум 29 поворотов (вместо 52 для Thistlethwaite), но также требуются очень большие таблицы поиска, которые было бы непрактично генерировать «на лету».Руби, 742 персонажа
Вышеупомянутый код рубина еще не полностью в гольфе. Есть еще возможности улучшить код дальше (но его уже достаточно для начала).
Он решает куб слой за слоем, но не использует никакого конкретного алгоритма, но вместо этого выполняет случайные последовательности ходов, пока куб не будет решен.
Из-за вероятностного характера для решения куба иногда может потребоваться больше 5 секунд, а в редких случаях - более 1000 ходов.
Пример вывода (для входа «RU LF UB DR DL BL UL FU BD RF BR FD LDF LBD FUL RFD UFR RDB UBL RBU») составляет 757 шагов:
Можно значительно уменьшить количество ходов, если одни и те же ходы сгруппированы вместе. Следовательно, можно заменить вывод как
источник
FU FR RU BR DB LD LU LB LF RD DF BU FRU BUR FDR DLB DFL LUB FUL DBR
U1 U1 U1
в одинU3
?