Реалізуйте кубічний кубик


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

Значення обличчя визначається як сума кожного квадрата на цьому обличчі. Наприклад, у наведеному вище кубі значення обличчя 0дорівнює 3.

Синтаксис

Команди виконуються, завантажуючи команду спочатку в пам'ять, а потім передаючи їй аргументи для виконання команди. Наприклад, команда F1завантажить команду Fв пам'ять, а потім викликає її аргументом 1. Додатково F13завантажте команду Fв пам'ять, потім зателефонуйте їй з аргументом 1, а потім зателефонуйте з аргументом 3. Будь-який нецифровий символ трактується як команда, а будь-яка цифра трактується як аргумент.

Ваше завдання

Ваше завдання - реалізувати куб внутрішньої пам’яті Cubically мовою, яку ви обрали. Ваш код повинен мати можливість виконувати дуже невелику підмножину мови.

Команди

  • 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 .


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])])

Спробуйте в Інтернеті!

Порт з моєї імітації відповіді на кубик Рубіка . Повторне відвідування підштовхнуло мене до гольфу на 47 байт.


0

Кубічно , 1 байт

Неконкуруючий, бо це кульгавий. Не приймайте цього.

¶  Read a line from stdin and evaluate

Я додав, що сьогодні вдень: P


2
Ну, я думаю, у вас найкоротший код.
TehPers

2
@TehPers Я це роблю, але, як я вже сказав, це кульгаво. За допомогою цього вбудованого кубічно можна виграти інші завдання з кубіком рубіксу , не потрібно перемагати в цьому.
MD XF
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.