Последовательность ходов - это последовательность ходов (поворотов) кубика Рубика (обозначения см. Ниже). Помимо пустой последовательности ходов, есть много других последовательностей ходов, которые никак не влияют на куб. Мы называем эти ходовые последовательности идентичными последовательностями.
Некоторые из этих последовательностей идентичности очевидно для определения, как U2 R R' U2
или U D2 U' D2
. В первом случае два случайных хода выполняются, U2 R
а затем сразу же отменяются R' U2
. Второй похож. Первые два случайных хода, U D2
а затем они отменяются, но в обратном порядке U' D2
. Это работает только потому, что движение U
влияет только на части верхнего слоя, а движение D2
влияет только на части нижнего слоя. Вы можете увидеть визуализацию этих двух последовательностей ходов.
Другие идентичные последовательности могут быть не очевидны вообще. Например, последовательность R' U' R' F' U F U' R' F R F' U' R U2 R
. Это довольно долго, но также никак не влияет на куб.
Переместить нотацию
Ход описывает поворот одного слоя одной из шести граней куба. Ход состоит из одной буквы, представляющей грань, за которой следует необязательный суффикс, представляющий угол поворота.
Буквы и соответствующие им грани: U (вверх - сторона, обращенная вверх), D (вниз - сторона, обращенная вниз), R (справа - сторона, направленная вправо), L (слева - сторона, обращенная влево) , F (передняя сторона - сторона, обращенная к вам) и B (задняя сторона - сторона, обращенная от вас).
Если суффикса нет, грань поворачивается на 90 градусов по часовой стрелке, суффикс '
означает, грань поворачивается на 90 градусов против часовой стрелки, а суффикс 2
означает, что грань поворачивается на 180 градусов по часовой стрелке.
Если у вас есть какие-либо проблемы с обозначениями, просто используйте http://alg.cubing.net , где вы можете визуализировать такие последовательности перемещения.
Соревнование
Ваша задача - написать программу, которая определяет, является ли последовательность перемещения идентификатором или нет.
Вы можете написать полную программу или функцию. Он должен получить строку, содержащую последовательность перемещений (перемещения разделяются пробелами) в качестве входных данных (через STDIN, аргумент командной строки, аргумент приглашения или функции) и вывести (через возвращаемое значение или STDOUT) логическое значение или соответствующее целое число ( True - 1 - идентификационная последовательность / False - 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
?U3
, то вы могли бы просто преобразовать суффикс в цифру.R2 D2
.That is F(orward), B(ackward), L(eft), R(ight), U(p), D(own)
Ответы:
Haskell,
263261247243 персонажаСкорее простой алгоритм; каждый кубет состоит из 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 символов. Inlining это экономит еще 4. Отказ от_
дела!
спасает еще один 11.i
, спасибо. Не уверен, что вы подразумеваете под встраиваниемi
- пожалуйста, обратите внимание, что оно появляется дважды в определении дляf
. Не уверен, что вы имеете в виду, отбрасывая_
регистр - либо_->a
полное исключение, либо перемещение его наверх приводит к неисчерпывающему исключению шаблона, а перемещение наверх не сохраняет никаких символов в любом случае. Однако мне удалось сохранить там 5 символов.Кубы ,
64 байтаЯ выигрываю: P
Блокнот инициализируется на ноль. Восьмое «лицо» содержит 1, если куб не решен, и 0 в противном случае.
Попробуйте онлайн!
источник
J -
232, 220, 381, 315296 байтЭто решение кодирует все операции как перестановки граней и работает на основе того факта, что все скручивания граней фактически являются одинаковыми при вращении всего куба.
Редактировать : еще немного игры в гольф
Кроме предыдущих попыток, это делает принять поворот угла во внимание.
f
это просто вспомогательная функция.r
делает вращение одного лица. лицо кодируется следующим образом:этот порядок облегчает кодирование поворотов и поворотов.
t
это наречие, которое поворачивает лицо под определенным вращением куба, выбирая лицо.X
а такжеY
являются наречиями, которые принимают в качестве левого аргумента число в этом направлении всего куба.Следующая строка определяет все повороты: 3 символа на оборот: имя, количество поворотов и направление.
Последняя строка определяет тестовый глагол
T
, преобразовывая 3 и'
в нотацию Power, переворачивая порядок операций, добавляя тестовый вектор и, наконец, исключая всю вещь.Более подробная информация по запросу.
источник
Python 3: 280 символов
Это не участник соревнования. Во-первых, потому что я сам задал вызов, а во-вторых, потому что это не мой код. Все кредиты принадлежат Стефану Пухману , который обнаружил этот удивительный способ симуляции кубика Рубика. Я только сделал некоторые игры в гольф и некоторые незначительные изменения в отношении проблемы.
Идея этого заключается в следующем.
s
представляет расположение частейUF
,UR
и так далее. Например:s = ['DF', 'BL', ...]
означает, что кусокUF
находится в позицииDF
, кусокUR
находится в позицииBL
, ...Как меняется положение фигуры при выполнении хода. Если вы делаете
U
перемещение, все наклейки (цвета)U
слоя, которые обращены к передней грани, перемещаются в левую сторону. Наклейки с левой стороны перемещаются назад, справа и вот так. Закодированные с помощьюFLBR
. Некоторые примеры:UF
перемещается вUL
,UFR
перемещается вULF
и так далее. Поэтому применение перемещения - это просто перевод граней кусков в соответствующем слое.источник