Муравей идет по краям (не граням) каркасного куба. Каждая встречаемая вершина представляет его вилкой, от которой отходят два новых ребра. Муравей выбирает, в какую сторону повернуть - left
или right
. Эти направления относятся к муравью, который обращен к вершине и находится вне куба. Ваша цель состоит в том, чтобы определить, из последовательности left
/ right
выборов, которые принял муравей, заканчивается ли он в том же положении, в котором он начал.
Например, если муравей повернет налево четыре раза ( left left left left
), он пройдет через квадрат против часовой стрелки и закончится в том же месте, где и начал. Но, если он пойдет left left left left right
, он закончится в другом месте на кубе. Кроме того, если он идет left right right right left
, он заканчивается на своем начальном ребре, но обращен к противоположной вершине, которая не считается той же позицией.
Путь муравья может повторять ребра, включая ребро, с которого он начинался, но важно то, где он заканчивается после всей последовательности.
Напишите именованную функцию, которая принимает последовательность ходов муравья и выводит, вернулся ли муравей в исходное положение после последовательности. Назначение неназванной функции переменной достаточно, чтобы сделать ее именованной функцией.
(Редактировать: если ваш язык не может создать именованную функцию, он может вместо этого реализовать функцию с входами и выходами через STDIN / печать или стек. Если это невозможно, сделайте его фрагментом, в котором вход и выход сохранены в переменные.)
вход
Последовательность left
/ right
решения от длины 0
до 31
включительно, представленные в формате по вашему выбору. Это может быть строка букв R
/ L
, список чисел 1
/ -1
или массив логических значений. Ничего такого, как использование имен методов или строк, полезных для вашего кода.
Пожалуйста, опубликуйте тестовые примеры в вашем формате, если они отличаются от тестовых примеров ниже.
Выход
True
/ False
, 0
/ 1
или аналоги на вашем языке.
Критерии победы
Побеждает несколько байтов. Помните, вам нужно дать именованную функцию. Вы можете иметь код вне функции, но эти байты тоже учитываются. Ваша функция должна вести себя правильно, если вызывается несколько раз.
Контрольные примеры
True
падежи (по одному на строку, второй - пустой список):
1 1 1 1
-1 -1 -1 -1
1 -1 1 -1 1 -1
1 1 -1 -1 1 1 -1 -1
-1 1 1 -1 -1 1 1 -1
1 1 1 -1 -1 -1 -1 1
1 -1 -1 1 -1 -1
1 1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1
-1 -1 -1 1 -1 -1 1 1 -1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
False
случаи (по одному на строку):
1
1 1
1 1 1
-1 1
1 -1 -1 -1 1
1 -1 -1 1 1
-1 1 -1 1
1 1 1 1 -1
-1 -1 1 -1 1 -1 -1 1
1 -1 1 1 1 1 -1 -1 -1 1 1 -1 -1 -1
Вот те же тесты с L
'и R
'.
True
случаи:
RRRR
LLLL
RLRLRL
RRLLRRLL
LRRLLRRL
RRRLLLLR
RLLRLL
RRRRLLLLRLLRLL
LLLRLLRRLRLRRRRRRRRRRRRRRRRR
False
случаи:
R
RR
RRR
LR
RLLLR
RLLRR
LRLR
RRRRL
LLRLRLLR
RLRRRRLLLRRLLL
Дополнительный кредитный вызов
То же самое, но с додекаэдром, а не с кубом. См. « Охота на Вумпуса» для идей.
Ответы:
GolfScript, 24 символа (19 только для функционального тела)
Математика FTW!
Протестируйте это решение онлайн.
Эта функция принимает в качестве входных данных двоичный массив (0 для левого, 1 для правого) и возвращает 1 для истинного и 0 для ложного.
Концептуально, он работает, вращая куб так, что муравей всегда сохраняет ту же позицию и ориентацию, и проверяя, заканчивается ли куб в той же ориентации, в которой он начал.
В частности, мы можем представить левый и правый повороты в виде двух линейных карт в трех измерениях, где левый поворот соответствует повороту на 90 ° вокруг оси x , т.е. карта ( x , y , z ) → ( x , z , - y ), а поворот вправо соответствует повороту на 90 ° вокруг оси y , т. Е. Карте ( x , y , z ) → ( z , y , - x ).
В начале функции мы просто устанавливаем трехэлементный вектор, содержащий различные положительные значения (1, 2, 3), применяем к нему последовательность карт вращения и проверяем, равен ли результирующий вектор начальному.
(Фактически, чтобы сохранить несколько символов, я на самом деле преобразую координаты так, чтобы начальный вектор был (0, 1, 2), а карты были ( x , y , z ) → ( x , z , −1− y ) и ( x , y , z ) → ( z , y , −1− x ), но конечный результат тот же.)
Ps. Спасибо гордому haskeller за обнаружение ошибки в оригинальной версии этого решения.
Perl, 58 символов
Как и просили в комментариях, вот то же решение, портированное на Perl. (Эта версия фактически использует нетрансформированные координаты, поскольку преобразование не сохраняет символов в Perl.)
Протестируйте это решение онлайн.
Бонус: муравей на додекаэдре (GolfScript, 26 символов)
Протестируйте это решение онлайн.
Как и в приведенной выше функции ant-on-a-cube, эта функция принимает в качестве входных данных двоичный массив (0 для левого, 1 для правого) и возвращает 1, если муравей оказывается в той же позиции и ориентации, в которой он был запущен, или 0 иначе.
Это решение использует немного более абстрактное представление, чем решение куба выше. В частности, он использует тот факт, что группа вращательной симметрии додекаэдра изоморфна знакопеременной группе A 5 , то есть группе четных перестановок из пяти элементов. Таким образом, каждое возможное вращение додекаэдра (которое отображает ребра в ребра и вершины в вершины) может быть уникально представлено как перестановка массива из пяти элементов с последовательными вращениями, соответствующими применению соответствующих перестановок в последовательности.
Таким образом, все, что нам нужно сделать, это найти две перестановки L и R, которые могут представлять левый и правый повороты. В частности, эти перестановки должны быть 5-тактными (чтобы их применение пять раз возвращалось к исходному состоянию), они не должны быть степенями друг друга (т. Е. R ≠ L n для любого n ), и они должны удовлетворять соотношению ( LR ) 5 = (1), где (1) обозначает тождественную перестановку. (По сути, этот критерий утверждает, что путь
LRLRLRLRLR
должен вернуться в исходное положение.)Исправление перестановки L в простой сдвиг бочки влево, т. Е. Отображение ( a , b , c , d , e ) → ( b , c , d , e , a ), поскольку это может быть реализовано в GolfScript всего за два chars (
(+
), мы находим, что есть пять возможных вариантов для перестановки R. Из них я выбрал отображение ( a , b , c , d , e ) → ( c , e , d ,b , a ), поскольку он также имеет относительно компактную реализацию GolfScript. (Фактически, я реализую это, сначала чередуя элементы с,2*2%
чтобы получить ( a , c , e , b , d ), затем поменяв местами последние два элемента с[~\]
и, наконец, безоговорочно применяя перестановку L, чтобы переместить a в конец.)Приведенная выше демонстрационная онлайн-ссылка включает в себя несколько тестовых примеров действительных путей на додекаэдре, которые возвращаются к источнику, например:
источник
{[~@]-1%}*[~@]
или){[~@]-1%}*-1%
заменят вашего{2*2%[~\]}*(+
Python, 68
Принимает список из 1 и -1. На основе трехмерных поворотов: проверяет, окажется ли точка (3,2,1) в одной и той же позиции после применения серии поворотов. Есть два возможных поворота, соответствующих 1 и -1. Каждая из них выполняется путем перестановки двух координат и изменения знака одной из них. Точные координаты, которые нужно изменить, и какой знак переставлять не важны.
РЕДАКТИРОВАТЬ: это на самом деле в основном то же решение, что и "Perl, 58".
источник
p
в отдельную переменную.Mathematica
Вдохновленный решением Ильмари Каронена. Группа вращательной симметрии куба изоморфна S 4 .
Куб, 51 байт
Принимает список
1
s и-1
s в качестве входных данных.Попробуйте онлайн!
Додекаэдр, 55 байт
Принимает список
1
s и-1
s в качестве входных данных.Попробуйте онлайн!
источник
C (gcc) ,
118116107105 байтов-2 байта благодаря потолку
Попробуйте онлайн!
Предположим, мы дали кубу следующие координаты:
Если мы начнем с угла D, то движение к С или Н можно будет рассматривать как вращение куба вокруг нас. Движение вправо означало бы вращение против часовой стрелки вокруг оси Z, а движение влево означало бы вращение по часовой стрелке вокруг оси X. Это только два поворота, о которых нам нужно заботиться. Поскольку каждое вращение составляет ровно 90 градусов, мы можем представить, как углы «скользят» по краям. Для движения вправо это означает, что A -> B, B -> C, C -> D, D -> A, а другая сторона выполняет E -> F и т. Д. Для перемещения влево мы вместо этого получаем A -> E, E - > H и т. Д.
Поскольку каждый угол скользит только вдоль края, это означает, что для каждого поворота изменяется только одно из размеров каждой точки. Когда B перемещается в C, изменяется только его компонент y, а когда H перемещается в D, изменяется только его компонент z и так далее. Кроме того, поскольку координаты ограничены 0 и 1, мы можем думать о каждой точке как о двоичном числе, с соответствующим битом, переключаемым при движении.
Мы можем видеть, что для движения вправо, A и C переворачивают свои x, а D и B переворачивают свои y. Если мы изменим перспективу, чтобы посмотреть на эту сторону куба, и проигнорируем компонент z (который в любом случае не изменяется для этого вращения), мы получим:
Возникает закономерность: для точек, которые переворачивают свои x, x == y, тогда как для точек, переворачивающих их y, верно обратное. Это верно для другого типа вращения, но с z вместо x.
Другими словами:
Теперь мы можем легко пройти все повороты и в конце посмотреть, соответствует ли финальный D нашему первоначальному D.
Хранить каждую точку в виде одного числа - это данность, но в C назначение массива char намного компактнее, чем массива int. Мы стараемся выбирать символы, чьи младшие три бита соответствуют 000..111, что позволяет просто игнорировать остальные биты. Переключение координат - это просто XOR с соответствующей битовой маской.
источник
Питон - 110, 150
Принимает список целых чисел с
-1
для поворота налево,1
для поворота направо.Куб, 110:
Тест:
Додекаэдр, 150:
источник
Marbelous 188
Бесстыдная кража алгоритма Илмари Каронена с целью показать новый язык.
Этот сценарий ожидает строку 0x00 для левого и 0x01 для правого на стандартный ввод, за которым следует 0x0A (перевод строки). Он выводит «0» для неудачного случая и «1» для успеха.
пример выполнения:
источник
Python 2 , 57 байт
Попробуйте онлайн!
Это использует представление перестановки
где левый и правый (0 и 1) соответствуют циклам длины-4 на 4 элементах. Мы перебираем входные данные, применяя указанную перестановку, и проверяем, равно ли результат исходному значению.
Мы начинаем
a,b,c,d
как список из четырех элементов0,1,2,3
. Мы сжимаем их в одно числоn=abcd
с основанием 4 , причем начальное значениеn=27
соответствует0123
основанию 4. Каждую перестановку инстанцируем арифметическиn
.Поскольку оба результата начинаются с
d
, мы можемn%4
извлечьd
, а затемn%4*64
переместить его в правильную позициюd___
. Остальные цифрыabc
извлекаются какn/4
. Нам нужно вставить их в три нижних значения.Для направления
x=0
мы вставляемabc
как есть, а дляx=1
, мы вращаем их какcab
. Вращение может быть достигнуто*16%63
, которое принимаетabc
наabc00
кcab
. (Операция%63
может пойти не такa==b==c==3
, но эти значения невозможны.) Так как простое выполнение не%63
является операцией, выражение, зависящее от направления,*16**x%63
выдаетabc
или поcab
мере необходимости.Python 2 , 55 байт
Попробуйте онлайн!
источник
Haskell,
104103999796/6764 символовЯ чувствую, что эквивалентом right / left будет Direction типа данных:поэтому я предположил в своем ответе, что они были доступны.редактировать: на самом деле понял, что логическое приведет к сокращению кода. True представляет левый поворот, а False представляет правый поворот (хотя, технически, код работал бы так же, если бы он был перевернут; он симметричный)
96 символов:
g - функция, которая, учитывая список Direction, будет возвращать погоду, когда муравей не вернулся на свое место.
объяснение представления положения: положение муравья закодировано как три кортежа целых чисел. первое целое число представляет вершину, к которой направляется муравей. первый бит представляет собой, если вершина находится в верхней / нижней половине, второй - в левой / правой половине, а третий - в задней / передней половине. это делается для того, чтобы перейти от вершины к соседней вершине можно, щелкнув один бит.
второе целое число - это величина, которую вершина муравья изменит, если она пойдет влево. например, если муравей находился в вершине 3, а второе целое число было 4, то после поворота влево вершина была бы 7. Обратите внимание, что это всегда будет степень 2, потому что ровно один бит переворачивается при перемещении одной вершины.
третье целое число то же самое, но для правильного пути; я знаю, что это можно рассчитать по первым двум, но я не знаю, как это сделать. если у вас есть идея, пожалуйста, скажите мне.
Следует обратить внимание на то, что при повороте налево третье целое число останется прежним, а второе станет значением от 1 2 до 4, которое не будет ни вторым целым числом, ни третьим, что будет совпадать с 7 - второе целое число - третье целое число.
Я выбрал этот способ представления позиции, потому что (как было только что сказано в предыдущем параграфе) вычисление следующей позиции было тривиальным.
объяснение функций:
функция (%) - это функция, которая берет текущую вершину и сумму, чтобы изменить ее, и изменяет ее. он попадает в бит, который будет меняться, и переворачивает его (очень числовым образом).
Функция m - это функция, которая принимает положение муравья и направление и возвращает новую позицию, используя примечание, которое мы отметили ранее.
затем функция m объединяется с использованием foldl (что-то вроде как
reduce
в javascript, но немного более выразительно), чтобы создать функцию g, ответ на этот вопрос.Хаскель, 64 символа
Вдохновленный ответом @ alphaalpha, вот его версия, портированная на haskell:
редактировать:
теперь я чувствую себя невероятно глупо из-за ответа Имари Каронен. возможно я перенесу его ответ на haskell.другое редактирование: не чувствуя себя глупо , как его ответбудетне такправить: переключился с использованием фактически кортежей с использованием списков , их
Ord
примером и[ ... ]
синтаксический сахар делает его корочеисточник
[0,1,2,3]
переменной и использовать ее как входные данные для выражения и проверки результата?[0..3]
... Я не знаю, почему я не заметил этого раньше. Спасибо. но теперь твой трюк не работает. Ну что ж.Haskell , 53 байта
Попробуйте онлайн!
Та же логика, что и у моего Python-ответа , даже подумала
mod
иdiv
дольше писать.Haskell , 58 байт
Попробуйте онлайн!
источник
APL (Dyalog Unicode) , 22 байта ( SBCS Адама )
Попробуйте онлайн!
H.PWiz предположил, что изменение шагов не имеет значения, и это привело к -2 байта.
Что ж, это неловко, так как он должен был быть намного короче, чем GolfScript. По крайней мере, я пытался.
Функция названа
f
, и в тестовых примерах1
представляет левый поворот (логическое значение true) и0
представляет правый поворот (логическое значение false).⍬
представляет пустой список.источник
APL (Дьялог) , 21 байт
Попробуйте онлайн! (Используя среду тестирования из ответа Эрика Аутгольфера )
Я беру налево и направо как
1
и2
. Это использует следующие перестановкиabcd
:Я применяю перестановки , соответствующие
1
и2
к⍳4 : 1 2 3 4
, и проверить , если она не изменитсяисточник
Баш ,
7165 байтПопробуйте онлайн!
Как и во многих предыдущих ответах, используется представление группы вращений куба, сгенерированных 1234-> 4123 и 1234-> 4312. Использует числа вместо букв, чтобы я мог использовать троичный оператор с арифметическим расширением. Ожидает, что его ввод в виде 0 и 1 разделены пробелами, и выводит через код выхода.
6 байтов сохранено благодаря комментарию @ manatwork!
источник
брейкфук , 119 байт, 137 байт
Куб, 119 байт
Попробуйте онлайн!
Додекаэдр, 137 байт
Попробуйте онлайн!
Единственные различия между этими двумя программами - установка и перестановки. Здесь используется левая перестановка
DCAEB
, которая, казалось, была самой лучшей из доступных в мире конъюгатов.источник
Желе , 14 байт
Попробуйте онлайн!
1
= левый поворот,0
= правый поворот. Основано на моем решении Dyalog.К сожалению, у желе нет названных функций. Если я не могу использовать неявный ввод и нужно предположить, что он находится в переменной, эта версия той же длины подойдет:
Предполагается, что вход находится в регистре (© / ®).
источник
Perl - 120, 214
Принимает массив (список) логических значений.
Куб (120):
Додекаэдр (214):
источник