Внедрить кубически куб

10

Кубически - это довольно новый эзотерический язык, способный создавать короткие, похожие на гольф ответы на очень специфический набор проблем. Он уникален тем, что хранит память в форме кубика Рубика 3х3, что делает вычисления гораздо менее тривиальными, чем в большинстве языков. В Кубе программист должен вращать внутренний куб, чтобы манипулировать значениями, хранящимися на гранях, а затем использовать эти значения в своих вычислениях. Вычисления выполняются для одного 32-разрядного целого числа, хранящегося на воображаемом лице, известном как «блокнот». Кроме того, Cubically может запросить ввод данных пользователем и сохранить его во входном буфере, состоящем только из одного целочисленного значения.

Куб

Грани куба U р, D собственный, L EFT, R РАВО, F Ront и Б извед:

   UUU
   UUU
   UUU
LLLFFFRRRBBB
LLLFFFRRRBBB
LLLFFFRRRBBB
   DDD
   DDD
   DDD

Когда программа запускается, куб инициализируется таким образом, чтобы каждый квадрат на этой грани был равен основанному на 0 индексу грани:

   000
   000
   000
111222333444
111222333444
111222333444
   555
   555
   555

Всякий раз, когда лицо поворачивается, оно всегда поворачивается по часовой стрелке:

Cubically> F1

   000
   000
   111
115222033444
115222033444
115222033444
   333
   555
   555

Значение лица определяется как сумма каждого квадрата на этом лице. Например, в приведенном выше кубе значение face 0равно 3.

Синтаксис

Команды выполняются сначала загрузкой команды в память, затем передачей ей аргументов для выполнения команды. Например, команда F1загрузит команду Fв память, а затем вызовет ее с аргументом 1. Кроме того, F13загрузит команду Fв память, затем вызовет ее с аргументом 1, затем вызовет ее с аргументом 3. Любой нецифровый символ рассматривается как команда, а любая цифра - как аргумент.

Твое задание

Ваша задача - внедрить куб внутренней памяти Cubious на выбранном вами языке. Ваш код должен иметь возможность выполнять очень маленькое подмножество языка.

команды

  • R - Поверните правую грань куба по часовой стрелке указанное количество раз.
  • L - Поверните левую грань куба по часовой стрелке указанное количество раз.
  • U - Поверните верхнюю грань куба по часовой стрелке указанное количество раз.
  • D - Поверните нижнюю грань куба по часовой стрелке указанное количество раз.
  • F - Поверните переднюю грань куба по часовой стрелке указанное количество раз.
  • B - Поверните заднюю грань куба по часовой стрелке указанное количество раз.
  • %- Выводит значение на заданной грани. Значение лица определяется как сумма всех квадратов на этом лице.

правила

  • Вы можете использовать любой язык, созданный до или после даты публикации этого задания, чтобы написать программу или функцию, способную решить эту проблему.
  • Входные данные будут передаваться либо через STDIN, либо в виде строки, либо в виде массива символов (выберите, пожалуйста, укажите).
  • Выходные данные должны быть переданы либо в STDOUT, либо в качестве выходных данных функции, и это должно быть либо целое число, строка, содержащая только цифры, либо массив цифр. Если ваш язык требует, чтобы вы выводили завершающий символ новой строки, вы можете сделать это.
  • Вход всегда будет в следующем формате: ([UDLRFB]\d*)*%[0-5]. На входе не будет пробельных символов.
  • Ввод для %всегда будет использовать индекс на основе 0.

Это , поэтому выигрывает самый короткий ответ в байтах.

Тестовые случаи

%0 -> 0
%1 -> 9
%2 -> 18
%3 -> 27
%4 -> 36
%5 -> 45
R1%2 -> 27
RD3F2%5 -> 32
L1R23F1B5U9D2%3 -> 17

Для большего количества тестовых случаев проверьте интерпретатор TIO . Если TIO не работает, вы можете использовать вместо этого интерпретатор Lua .

TehPers
источник
3
Является ли этот вопрос дубликатом этого ?
TehPers
@TehPers Я думаю, что это очень похоже. Для будущих задач я рекомендую оставлять их в песочнице как минимум на 24 часа, дольше, если у вас все еще есть вопросы по этому поводу. (Мне пришлось усвоить этот трудный путь; мои первые испытания были не совсем хорошо приняты. Это еще не закрыто и не было отклонено, так что это неплохо , но если бы оно оставалось в песочнице дольше, другие пользователи могли бы заметил недостатки, которые я не сделал.)
MD XF
@MDXF Я буду помнить это в следующий раз. Спасибо!
TehPers
Вы пропустили несколько 4между Rи Dв примере RD3F2%5 -> 30?
Джонатан Аллан

Ответы:

8

Python 2 , 476 байт

import re
c=[[i]*9for i in range(6)]
r=lambda f:[f[a+b]for a in(0,1,2)for b in(6,3,0)]
U=lambda c:[r(c[0])]+[c[j+1][:3]+c[j or 4][3:]for j in(1,2,3,0)]+[c[5]]
y=lambda c:[r(c[0])]+c[2:5]+[c[1],r(r(r(c[5])))]
z=lambda c:[c[2],r(r(r(c[1]))),c[5],r(c[3]),c[0][::-1],c[4][::-1]]
s=input()
exec("c="+"(c);c=".join("".join("zzzUz U zzUzz yyyzUzzzy zUzzz yzUzzzyyy".split()[ord(t)%11%7]*sum(map(int,n))for t,n in re.findall("([BUDLFR])(\d*)",s[:-2])))+"(c)")
print sum(c[int(s[-1])])

Попробуйте онлайн!

Порт из моего ответа Simulate A Rubik's Cube . Пересмотр побудил меня к гольфу, что на 47 байтов.

Джонатан Аллан
источник
0

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

Не конкурирует, потому что это хромает. Не принимай это.

¶  Read a line from stdin and evaluate

Я добавил, что сегодня днем: P

MD XF
источник
2
Ну, я думаю, что у вас самый короткий код.
TehPers
2
@TehPers я делаю, но, как я уже сказал, это хромает. Кубически может выиграть другие задачи Рубик-куба с помощью этой встроенной функции, для этого не нужно побеждать.
MD XF