Zaimplementuj Cubical Cube

10

Cubically to dość nowy ezoteryczny język zdolny do tworzenia krótkich, przypominających golfa odpowiedzi na bardzo specyficzny podzbiór problemów. Jest wyjątkowy, ponieważ przechowuje pamięć w postaci kostki Rubika 3x3, dzięki czemu obliczenia są mniej banalne niż w większości języków. W trybie Cubical programista musi obrócić wewnętrzny sześcian, aby manipulować wartościami zapisanymi na powierzchniach, a następnie użyć tych wartości w swoich obliczeniach. Obliczenia są wykonywane na pojedynczej 32-bitowej liczbie całkowitej zapisanej na wyimaginowanej twarzy zwanej „notatnikiem”. Dodatkowo, Cubically może zażądać danych wejściowych od użytkownika i zapisać je w buforze wejściowym składającym się tylko z jednej wartości całkowitej.

Sześcian

Ściany sześcianu to U p, D own, L eft, R ight, F ront i B ack:

   UUU
   UUU
   UUU
LLLFFFRRRBBB
LLLFFFRRRBBB
LLLFFFRRRBBB
   DDD
   DDD
   DDD

Po uruchomieniu programu sześcian jest inicjalizowany tak, że każdy kwadrat na tej powierzchni jest równy indeksowi 0 na tej powierzchni:

   000
   000
   000
111222333444
111222333444
111222333444
   555
   555
   555

Ilekroć twarz jest obracana, zawsze jest obracana zgodnie z ruchem wskazówek zegara:

Cubically> F1

   000
   000
   111
115222033444
115222033444
115222033444
   333
   555
   555

Wartość twarzy jest definiowana jako suma każdego kwadratu na tej twarzy. Na przykład w powyższym sześcianie wartość face 0wynosi 3.

Składnia

Polecenia są wykonywane najpierw poprzez załadowanie polecenia do pamięci, a następnie przekazanie mu argumentów w celu wykonania polecenia. Na przykład polecenie F1spowoduje załadowanie polecenia Fdo pamięci, a następnie wywołanie go z argumentem 1. Dodatkowo F13załaduje polecenie Fdo pamięci, a następnie wywoła go z argumentem 1, a następnie wywoła z argumentem3 . Każdy znak nie będący cyfrą jest traktowany jako polecenie, a każda cyfra jest traktowana jako argument.

Twoje zadanie

Twoim zadaniem jest zaimplementowanie kostki pamięci wewnętrznej Cubically w wybranym języku. Twój kod powinien być w stanie wykonać bardzo mały podzbiór języka.

Polecenia

  • R - Obróć prawą powierzchnię sześcianu zgodnie z ruchem wskazówek zegara o określoną liczbę razy.
  • L - Obróć lewą powierzchnię sześcianu zgodnie z ruchem wskazówek zegara o określoną liczbę razy.
  • U - Obróć górną powierzchnię sześcianu zgodnie z ruchem wskazówek zegara o określoną liczbę razy.
  • D - Obróć dolną powierzchnię sześcianu zgodnie z ruchem wskazówek zegara o określoną liczbę razy.
  • F - Obróć przednią powierzchnię sześcianu zgodnie z ruchem wskazówek zegara o określoną liczbę razy.
  • B - Obróć tylną powierzchnię sześcianu zgodnie z ruchem wskazówek zegara o określoną liczbę razy.
  • %- Wyświetla wartość na danej twarzy. Wartość twarzy jest definiowana jako suma wszystkich kwadratów na tej twarzy.

Zasady

  • Możesz użyć dowolnego języka utworzonego przed lub po dacie opublikowania tego wyzwania, aby napisać program lub funkcję zdolną do rozwiązania tego wyzwania.
  • Dane wejściowe będą przekazywane przez STDIN, jako ciąg znaków lub jako tablicę znaków (wybierz, proszę określić).
  • Dane wyjściowe muszą być przekazywane do STDOUT lub jako dane wyjściowe funkcji i musi być liczbą całkowitą, ciągiem zawierającym tylko cyfry lub tablicą cyfr. Jeśli wymaga tego Twój język wypisania końcowego znaku nowej linii, możesz to zrobić.
  • Wejście będzie zawsze w formacie następujący: ([UDLRFB]\d*)*%[0-5]. Na wejściu nie będzie znaków białych znaków.
  • Dane wejściowe dla %zawsze będą używać indeksu 0.

To jest , więc wygrywa najkrótsza odpowiedź w bajtach.

Przypadki testowe

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

Więcej przypadków testowych znajdziesz w interpretatorze TIO . Jeśli TIO nie działa, możesz zamiast tego użyć interpretera Lua .

TehPers
źródło
3
Jest to pytanie duplikat tego ?
TehPers
Związane z.
notjagan
@TehPers Myślę, że to bardzo podobne. W przypadku przyszłych wyzwań zalecamy pozostawienie ich w piaskownicy na co najmniej 24 godziny, dłużej, jeśli nadal masz pytania. (Musiałem nauczyć się tego na własnej skórze; moje pierwsze wyzwania w ogóle nie zostały dobrze przyjęte. Nie jest to jeszcze zamknięte ani przegłosowane, więc nie jest złe , ale gdyby pozostawiono je w piaskownicy na dłużej, inni użytkownicy mogliby zauważyłem wady, których ja nie zauważyłem.)
MD XF
@MDXF Będę o tym pamiętać następnym razem. Dzięki!
TehPers,
Czy przegapiłeś wielokrotność 4pomiędzy Ri Dw przykładzie RD3F2%5 -> 30?
Jonathan Allan

Odpowiedzi:

8

Python 2 , 476 bajtów

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

Wypróbuj online!

Port z mojej odpowiedzi Symuluj Kostkę Rubika . Ponowna wizyta skłoniła mnie do gry w golfa o 47 bajtów.

Jonathan Allan
źródło
0

Sześciennie , 1 bajt

Nie konkuruje, bo jest kiepski. Nie akceptuj tego

¶  Read a line from stdin and evaluate

Dodałem, że dziś po południu: P.

MD XF
źródło
2
Myślę, że masz najkrótszy kod.
TehPers
2
@TehPers tak, ale jak powiedziałem, jest kiepski. Cubically może wygrać inne wyzwania kostki rubika dzięki temu wbudowanemu, nie musi wygrywać tego.
MD XF,