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 0
wynosi 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 F1
spowoduje załadowanie polecenia F
do pamięci, a następnie wywołanie go z argumentem 1
. Dodatkowo F13
załaduje polecenie F
do 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 golf golfowy , 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 .
4
pomiędzy R
i D
w przykładzie RD3F2%5 -> 30
?