Biorąc pod uwagę dowolny poprawny program Glypho , wypisz jego odpowiednik „czytelny dla człowieka”.
Glif to ciekawy pomysł na esolang:
Odniesienie do instrukcji znajduje się tutaj. Dla każdej instrukcji znaki abcd reprezentują symbole tworzące każdą instrukcję. a odnosi się do pierwszego unikalnego symbolu, b odnosi się do drugiego unikalnego symbolu itp.
aaaa ..... n NOP - no operation; do nothing aaab ..... i Input - push input onto top of stack aaba ..... > Rot - pops top stack element and pushes to bottom of stack aabb ..... \ Swap - swaps top two stack elements aabc ..... 1 Push - pushes a 1 onto the top of stack (creates new element) abaa ..... < RRot - pops bottom element and pushes to top of stack abab ..... d Dup - Duplicates top stack element abac ..... + Add - pops top two elements and pushes their sum abba ..... [ L-brace - skip to matching ] if top stack element is 0 abbb ..... o Output - pops and outputs top stack element abbc ..... * Multiply - pops top two elements and pushes their product abca ..... e Execute - Pops four elements and interprets them as an instruction abcb ..... - Negate - pops value from stack, pushes -(value) abcc ..... ! Pop - pops and discards top stack element abcd ..... ] R-brace - skip back to matching [
(kredyt: Brian Thompson alias Wildhalcyon)
Na przykład PPCG
reprezentowałby instrukcję Push -PPCG
odpowiada wzorowi aabc
, w którym a
reprezentuje P
, b
reprezentuje C
i c
reprezentuje G
.
Dane wejściowe będą stanowić pojedynczy ciąg składający się wyłącznie z drukowalnych znaków ASCII. Zawsze będzie miał długość podzielną przez cztery (duh).
Dane wyjściowe to każda grupa czterech znaków w ciągu wejściowym zastępowana przez wskazaną instrukcję. Użyj jednoliterowych nazw instrukcji (tych zaraz po pięciu kropkach w tabeli cytowanej powyżej).
Ponieważ jest to code-golf , wygra najkrótszy kod w bajtach.
Przypadki testowe:
In Out
------------------------------------------------
Programming Puzzles & Code Golof ]!]!]]]+
nananananananana batman! dddd]]
;;;;;;;:;;:;;;:: ni>\
llamas sleep 1-*
8488133190003453 <[oe
<empty string> <empty string>
Odpowiedzi:
Pyth,
373534 bajtówKod zawiera znaki niedrukowalne, więc oto
xxd
zrzut heksowy:Oto wersja do wydruku o wielkości 36 bajtów:
Wypróbuj online. Zestaw testowy.
Wyjaśnienie
źródło
CJam,
423935 bajtówZaoszczędzono 4 bajty pożyczając pomysł użytkownika 81655 na użycie podstawy 3 zamiast podstawy 4.
Uruchom wszystkie przypadki testowe.
Musi być lepszy sposób na skompresowanie tabeli odnośników ...
źródło
JavaScript (ES6), 97
Dla każdego bloku 4 znaków zastępuję każdy symbol jego pozycją w bloku, otrzymując podstawową liczbę 4. Na przykład
'aabc' -> '0023'
. Możliwe liczby są w zakresie 0..0123, czyli 0..27 w systemie dziesiętnym. Używam tej liczby jako indeksu, aby znaleźć właściwy znak instrukcji z ciągu 28 znaków.Test
źródło
MATLAB, 291 bajtów
Długo się wahałem, czy powinienem udzielić odpowiedzi. Po prostu bawiłem się z MATLABEM. Wiem, że tak naprawdę nie jest możliwe wygenerowanie gęstego kodu (niska liczba instrukcji / bajtów; około 3 razy większa niż twoje ~ 100 bajtowe rozwiązania) i że MATLAB może nie być zbyt odpowiedni do golfa kodowego i jestem nowy w golfa kodowego . Ale po prostu chciałem spróbować, a kod działa (znaki nowego wiersza są zachowane). Wszelkie wskazówki są mile widziane. : P
źródło
JavaScript (ES6),
115101 bajtówZaoszczędź 14 bajtów dzięki @ edc65 !
Wyjaśnienie
Przechowuje listę instrukcji w ciągu z każdym znakiem pod indeksem base-3. Na przykład
+
odpowiada,abac
które mogą być reprezentowane w bazie-3 jako0102
lub11
w systemie dziesiętnym. Jedyną instrukcją, której nie można przedstawić w bazie 3, jest]
jednak, ale z algorytmem stosowanym do obliczenia liczby bazy 3, wygodnie kończy się na pozycji 18 na końcu łańcucha.Test
Pokaż fragment kodu
źródło
parseInt
i nie obliczają liczby z powtarzaną sumą i mnożeniem. Pozwala to uniknąć problemu z „0123”, który jest nieprawidłowy w bazie 3, ale daje 1 * 9 + 2 * 6 + 3 == 18, która jest dobrą pozycją. Wynik:F=s=>s.replace(/..../g,g=>"ni]>\\1 <d+[o*e-!]"[[...g].map(c=>r=r*3+(m[c]=m[c]||++i)-1,r=i=0,m={})|r])
Python 2, 158 bajtów
Przyjmuje dane wejściowe jak
"test"
. Dane wyjściowe to lista znaków.Wypróbuj online
Nie golfowany:
źródło