Стандартный решенный кубик 3 × 3 × 3 имеет 6 разноцветных граней, где каждая грань представляет собой сетку из квадратов 3 × 3 одного цвета. Белое лицо напротив желтого, красное - оранжевого, синий - зеленого, а когда белый указывает вверх, красный слева от синего:
Представьте, что муравей сидит на центральном квадрате белого лица, лицом к красному лицу. Вы можете дать ему 3 команды:
- Вперед (
^
) - сделайте шаг в направлении к следующему квадрату сетки, перешагнув через край куба, если это необходимо. - Вправо (
>
) - повернуть вправо (по часовой стрелке) на 90 °, оставаясь в том же квадрате сетки. - Влево (
<
) - повернуть влево (против часовой стрелки) на 90 °, оставаясь в том же квадрате сетки.
По произвольному списку команд найдите цвета квадратов, которые посещает муравей (не считая белого начального квадрата).
Например, последовательность команд
^^>^^<^^^
имеет путь, который выглядит следующим образом:Цвета квадратов сетки посещены по порядку, не считая начальный квадрат, равны
white red red green green green yellow
или простоwrrgggy
.
Напишите программу или функцию, которая принимает строку символов команды <^>
и печатает или возвращает строку символов wyrobg
(белый, желтый, красный оранжевый, синий, зеленый), которая соответствует пути муравья над кубом.
Самый короткий код в байтах побеждает. Tiebreaker - более ранний ответ.
Заметки
- Куб находится в воздухе, и у муравья есть эффективные пульвиллы, поэтому он может пересечь весь куб.
- Куб всегда остается в своем решенном состоянии.
- Цвет квадрата записывается только при движении в квадрат, а не при вращении. Начальный белый квадрат не должен быть записан.
- На входе и / или выходе может присутствовать один необязательный завершающий символ новой строки.
Тестовые случаи
input : output
[empty string] : [empty string]
^ : w
< : [empty string]
> : [empty string]
><><<<>> : [empty string]
>^ : w
<<^> : w
^<^<^<^< : wwww
^^ : wr
<^^ : wb
>><<<<^^ : wo
<^^^<^^^^<>^>^^>^ : wbbboooggyo
^^^^^^^^^^^^^^ : wrrryyyooowwwr
<<<^<^>^<^<^<^>^^^^<^>>>>>^^<^>^^<^>^>^>^>< : wwgrwgggoooobbbbyrby
^^>^^<^^^ : wrrgggy
источник
Ответы:
Perl,
156143134128127125120119117113109 байтВключает +1 для
-p
Запустите со строкой управления на STDIN, например
rubic.pl
:объяснение
Старая версия:
Задача этого вопроса состоит в том, чтобы найти систему координат, которая позволяет легко отслеживать положение и направление муравья и все же легко получить личность лица.
Система, которую я выбрал, заключалась в том, чтобы поместить стандартные
(x,y)
координаты на лицо, на котором находится муравей, так, чтобы муравей всегда был направлен в отрицательномy
направлении относительно центра лица(0,0)
. Так:Если
y
это уже-1
было, муравей покинет текущее лицо и перейдет к следующему. В новой системе координат онаx
сохраняет свое значение, ноy'
становится 1.Это дает простую систему координат внутри лица. Мне тоже нужно что-то для самих лиц. Там я использую массив, состоящий из
Итак, начальный массив есть
(g,b,o,y,r,w)
. Переход к следующей грани соответствует повороту последних 4 элементов, поэтому переход от белого к красному делает это(g,b,w,o,y,r)
. Поворот направо - перестановка первых 5 элементов, дающих(o,r,b,y,g,w)
. Поворот влево - это симулированная перестановка, но ее также можно выполнить, повернув вправо 3 раза, поэтому примените эту перестановку 3 раза. А вообще не поворачивать можно сделать, применив перестановку 8 раз. На самом деле поворот вправо также можно выполнить, применив перестановку 5 раз.Зная это, программа довольно проста:
Таким образом, для этого последнего оператора повороты ведут к пустой строке, а шаги вперед приводят к текущей грани. Поэтому
$_
заменяется лицами, посещенными на каждом шаге.источник
@1
это удивительное злоупотребление тем, что выглядит как ужасная языковая особенность.use strict
. Спасибо за модуль 3, кстати.Брахилог , 287 байт
Ожидает строку, содержащую ходы в качестве входных данных, но без выходных данных, например
brachylog_main("^^>^^<^^^",_).
, записываетwrrgggy
в STDOUT.объяснение
Эквивалентный код SWI-Пролог
Если вы не хотите беспокоиться о компиляторе Brachylog, вы можете запустить это решение в SWI-Prolog, используя следующий код (это то, что генерируется компилятором Brachylog):
источник
PowerShell, 882 байта
использование
Сохраните код в скрипте и назовите его так из командной строки. Предполагая, что рабочий каталог является текущим каталогом.
Код
Меньше гольф-кода с объяснением
Использование множества однобуквенных переменных используется для записи текущего состояния муравья (цвет, положение и ориентация). Муравей всегда обращен вверх. При считывании инструкции поворота куб перемещается в этом направлении. Жестко закодированные матрицы транспозиции используются для определения новой позиции на основе текущей позиции.
Код удовлетворяет всем рассматриваемым примерам.
источник
Tcl / Tk, 422 байта
Увы, я не могу получить это немного меньше. Не запутанная версия:
Это работает, поддерживая список горизонтальных и вертикальных цветов ячейки. ^ <и> - все команды, которые правильно переставляют списки. Текущая ячейка является первой в каждом списке.
источник
Руби, 132
Эта система позиций, к сожалению, очень похожа на другие ответы.
x
иz
отслеживать свою позицию на текущем лице с+x
указанием направления движения. Вперед всегдаx+=1
, и границы каждой грани делятся на 3 (нам все равно число, просто его модуль с 3).m
текущее лицо (это экономит несколько байтов)g
устроен[left, right, behind, opposite, front]
так, что нам не нужно менятьg[0..1]
на^
<
это делается просто>
трижды.источник
Java,
619605 байтНу, здесь ничего не идет ...
По крайней мере, это лучше, чем PowerShell!
-14 байт благодаря @KevinCruijssen
Объяснение:
В отличие от некоторых других ответов, в которых использовалась двумерная система координат, я использовал трехмерную систему, чтобы отслеживать, где находится муравей.
Направление также сохранялось в трехмерном виде, чтобы облегчить переключение сторон и движение.
У каждой грани была одна из координат x, y или z, которая должна быть установлена на 2 (или -2 для противоположной грани), чтобы указать, какая это была грань.
Переключение граней осуществлялось путем проверки того, собирается ли муравей уйти (положение и заголовок имеют одно и то же значение, но не 0), убедитесь, что он будет «падать» по диагонали на следующий, и измените заголовок на -диагональ. Это было удивительно легко.
Поворот был сложнее. Чтобы убедиться, что он всегда будет идти в одном и том же направлении, потребовалась дополнительная инструкция if-else внутри проверки для каждого символа, что стоило мне много байтов. Кроме того, оси «вверх» и «вправо» должны были быть жестко запрограммированы для каждой стороны.
Код без правил
(Без изменений от предыдущего редактирования для ясности в методе)
источник
d[]={"w","g","r","b","o","y"}
->"w,g,r,b,o,y".split(",")
(-1 байт); 2x'^'
->94
(-2 байта); 3x==0
-><1
(-3 байта); 2x==1
-><2
(-2 байта); и т.д. для==2
,==3
,==4
,==5
.