Cubically jest zbyt żmudny, aby ręcznie pisać dowolny kod. Twoim zadaniem jest przetłumaczenie tekstu ASCII na Cubicowy kod źródłowy.
Cubical
To tylko szybki przegląd Cubically; repozytorium ma bardziej kompletny podręcznik oraz szczegóły.
Cubically to esolang, który napisałem jakiś czas temu, zaprojektowany z myślą o bolesnym użyciu. Zawiera dwa fragmenty pamięci, Kostkę Rubika 3x3x3 i rejestr zwany „notatnikiem”.
Pamięć
Wewnętrzna kostka Rubika jest inicjowana w następujący sposób:
000
000 top face
000
111222333444 left, front, right, and back faces, respectively
111222333444
111222333444
555
555 down face
555
Po wykonaniu obrotu o 90 ° w kierunku zgodnym z ruchem wskazówek zegara na prawej powierzchni kostka pamięci wygląda następująco:
002
002
002
111225333044
111225333044
111225333044
554
554
554
Polecenia
Znak nie będący liczbą całkowitą ustawia polecenie domyślne. Dla każdej liczby całkowitej przed ponownym ustawieniem domyślnego polecenia polecenie jest wykonywane z tą liczbą całkowitą. Na przykład x524y312
wykonałby polecenie za x
pomocą 5, następnie za pomocą 2, następnie za pomocą 4, następnie wykonał polecenie za y
pomocą 3, następnie za pomocą 1, a następnie za pomocą 2.
Liczby całkowite używane przez polecenia reprezentują indeksy twarzy. Tak x0
by działał x
na powierzchni UP (indeksowanej 0). x1
działałby x
na LEWEJ (1 indeksowanej) powierzchni i tak dalej.
Wykonanie dowolnego polecenia 6
spowoduje wykonanie tego polecenia na wartości notatnika. Wykonanie dowolnego polecenia z dowolną liczbą całkowitą większą niż 6 spowoduje błąd.
Oto kilka przykładowych poleceń:
R1
- obróć PRAWĄ ściankę o 90 ° zgodnie z ruchem wskazówek zegara, aby wewnętrzny sześcian wyglądał jak drugi przykład powyżejR11
- obrócić prawą twarz dwa razy w prawo o 90 °, identycznie jakR2
+0
- dodaj wszystkie wartości powierzchni UP do notatnika+000
- trzykrotnie dodaj wszystkie wartości powierzchni UP do notatnika@6
- wydrukuj nieistniejącą twarz (pamięć) z 6. indeksem jako znak%4
- wydrukuj sumę wszystkich wartości na BACK face jako liczbę całkowitą
Pełna lista poleceń i składni jest dostępna w repozytorium .
Wyzwanie
Weźmiesz tekst ASCII jako dane wejściowe i wydrukujesz program Cubic jako dane wyjściowe.
Przykłady (skradzione tutaj i tutaj ):
Input -> Output
Hello, World! -> +53@6+1F2L2+0@6L2F2U3R3F1L1+2@66L3F3R1U1B3+0@6:4U1R1+00@6-000@6*0-4+000@6-00@6+2-000000@6-5+4000@6-00@6/0+00@6:0+0/0+00@6
1$2$3$4$5$6$7$8$9$10$ -> B1+2/2%6@4+00/0%6@4+00/1%6@4+21/1%6@4+30/0%6@4+22/1%6@4+22/1%6@4+40/1%6@4+52/1%6@4+42/1%6@4
Zasady
- Twój program nie może zawierać słownika zawierającego tłumaczenia dla 100 przypadków testowych.
- Twój program musi zakończyć się w mniej niż 180 sekund (bez programów typu brute force, które zajmują tygodnie).
- Twój program musi wypisać prawidłowy kod sześcienny, który kończy się w mniej niż 180 sekund.
- Twój program pobierze dane przez standardowe wejście, chyba że chcesz zadziałać ze sterownikiem testowym.
- Twój program musi wypisywać kod sześcienny, który nie generuje nic oprócz danych wejściowych programu po uruchomieniu. ಠ_ಠ
Punktacja
Testujesz swój program za pomocą 100 pseudolosowych ciągów o długości pseudolosowej. (Dostępny jest skrypt bash, który zrobi to za Ciebie.) Oto, jak zdobędziesz punkty:
- Niech długość programu wyjściowego być o .
- Niech długość ciągu wejściowego będzie równa l .
- Niech zmienna r będzie wynikiem o / l .
- Znajdź średnią wszystkich r : (r 1 + r 2 + r ... + r 100 ) / 100 .
Przetestuj za pomocą tego skryptu. Będziesz musiał go zmodyfikować zgodnie z instrukcją. Zauważ, że program nie sprawdza, czy dane wyjściowe są poprawne Kod sześcienny. Jeśli nie możesz uruchomić skryptu, mogę pomóc. Zawołaj mnie do pokoju czatu Cubically .
źródło
@6
- wydrukowałby sumę nieistniejącej twarzy z 6 indeksami (notatnika) jako znak„ byłby dokładniejszy? Czy to%4
także suma? Czy+
polecenia sumują twarz, a następnie dodają to do wszystkich wartości czy ...?@6
/%6
po prostu drukuje wartość notatnika jako znak / liczbę całkowitą.@x
/%x
(gdzie x to dowolna istniejąca twarz) dodaje wszystkie wartości dox
twarzy -indexed i drukuje sumę jako znak / liczbę całkowitą.+
dodaje do rejestru wszystkie wartości z określonej twarzy.Odpowiedzi:
C ++ 11, wynik : 6,37
Wypróbuj online! (generuj kod Cubical z ASCII) i (uruchom kod Cubically)
Wyjaśnienie:
{0,9,18,27,36,45}
do{6, 15, 27, 26, 19, 42}
. Tym, co sprawia, że zestaw sum twarzy jest użyteczny, jest to, że gcd ma wartość 1, więc dzięki tożsamości Bézout istnieje sposób na skonstruowanie dowolnej liczbyd
z sumy (lub różnicy) tych liczb.ch
a bieżąca wartość notatnikan
, to pozwólmyd = ch - n
, możemy wykonać polecenia Cubically w formie+{digits from 0 to 5}-{digits from 0 to 5}
, w której staje się wartość notatnikach
. Następnie wystarczy wykonać,%6
aby wydrukować wartość notatnika.d
jako suma / różnica liczb w zestawie sumy twarzy, używam algorytmu Knapsack dla wszystkich liczb od 0 do 128. Np.d=1
Program pobiera27 - 26 = 1
, więc drukuje+2-3
, czyli jest27 - 26 = 1
. Co można zobaczyć po uruchomieniu programu z wejściemabc
, wyjściem programuźródło
@
niejawnie - w każdym przypadku@6
można go skrócić@
.Lua, wynik :
85,9113,5013,2012,709,419,329,839,669,129,068,03 (średnio)Wypróbuj online!
Ok, nie sądzę, żebym mógł to zoptymalizować.
Ta wersja wykonuje iterację po każdym znaku, dodając c% 9 (gdzie c jest wartością dziesiętną znaku)
:5+2/1
, a następnie dodaje części podzielne przez 9, dodając wartość tej twarzy. Na przykład::2/1+551@
aby wydrukować „e”, gdzie:2/1
dodaje 2,+551
dodaje 99 (9 * (5 + 5 + 1) lub 9 * 11) i@
drukuje wydruk. Wejście jest czytane za pomocąio.read()
.Optymalizacje obejmują bezpośrednie dodawanie / odejmowanie po wydrukowaniu, jeśli różnica między znakami jest wielokrotnością 9, dzielenie bieżącej wartości, jeśli to możliwe, zamiast ustawiania c% 9 od zera, i powtarzanie znaków poprzez ponowne wydrukowanie bieżącej wartości zamiast jej ponownego obliczenia. Dodatkowo wdrożyłem metodę Kamila do natychmiastowego drukowania dowolnej twarzy, która już zawiera wartość docelową, oraz sugestię MD XF, aby nie używać
:
na początku, ale zamiast tego po prostu zacznij od+
.źródło
local inp = io.read()
nalocal inp = io.read("*all")
. To rozwiązuje problem.:5+124
Możesz po prostu pisać+5124
, co prawdopodobnie nieco obniży wynik, jeśli poprawisz go poprawnie.Sześciennie , wynik : 86,98
Wypróbuj online!
Okazuje się, że wszystko, czego potrzebujesz, to pętle warunkowe, twarz równa 1 i spójne zachowanie na końcu wejścia.
Dodawanie / odejmowanie LEWEJ powierzchni powoduje, że pętla kończy się po odczytaniu EOF.
źródło
@
niejawnie - w każdym przypadku@6
można go skrócić@
.C # (.NET Core) , wynik:
129,9811,7310,829,6210,3310,3210,20-1.2 punktu od sugestii MD XF, aby użyć
@6666...
zamiast@6@6@6@6...
do powtarzania znaków i lepszej sekwencji inicjalizacjiWypróbuj online!
Moja najnowsza wersja faktycznie manipuluje kostką! Tak!
Po pierwsze,
Console.Write
opracowano naprawioną manipulację MD XF, która tworzy tę kostkę:Znaczenie tego sześcianu polega na tym, że jedna z jego boków ma sumę 1, co pozwala na manipulowanie Notatnikiem na mniejszą skalę niż wielokrotność dziewięciu, a w szczególności upraszcza względny ruch, zamiast konieczności rozpoczynania od zera każdego znaku; w tym algorytmie zarówno dodawanie, jak i odejmowanie są używane w celu uzyskania najkrótszej ścieżki między znakami.
Wersja inicjalizacji MD XF powoduje, że strona 2 ma sumę 14, co oszczędza wiele bajtów danych wyjściowych dla odległości ASCII między 14 a 20.
Teraz Console.Read () obsługuje teraz dane wejściowe z wewnętrznymi znakami nowej linii, aż do końca pliku; zobacz link TIO, który powinien mieć wejście
Ogoliłem kilka ułamków punktu, natychmiast wypisując znak, jeśli jego wartość ASCII akurat istnieje po stronie.
Skrypt testowy dzięki uprzejmości MDXF
Poprzednie zgłoszenie tutaj i wyjaśnienie:
To trochę nudne, ale o ile mogę powiedzieć, że działa. Wprawdzie tylko próbowałem,
Hello, World!
ale uruchomiłem dane wyjściowe w interpreterie sześciennym TIO i wyszło „Witaj, świecie!” więc założyłem, że to działa.Zamiast faktycznie manipulować kostką, notatnik jest po prostu wielokrotnie zwiększany o sumę 1 powierzchni (9), aż będzie miała odpowiednią wartość dla każdego znaku, a następnie drukuje go.
źródło