99 (wymawiane jako „dziewięćdziesiąt dziewięć”) to nowy ezoteryczny język programowania (nie mylić z 99 , zwróć uwagę kursywą). Twoim zadaniem w tym wyzwaniu jest napisanie możliwie najkrótszego tłumacza na 99 . Zgłoszenie z najmniejszą liczbą bajtów wygrywa. Tiebreaker przechodzi do przesłanego posta jako pierwszego.
Ponieważ to pytanie jest nieco bardziej dogłębne niż zwykle i nie mogę się doczekać dobrych odpowiedzi, przyznam nagrodę w wysokości 250 powtórzeń za moją ulubioną odpowiedź (niekoniecznie zwycięzcę).
99 Spec
99 jest językiem imperatywnym . Każda linia w programie 99 jest pojedynczą instrukcją , a podczas wykonywania wskaźnik instrukcji rozpoczyna się w górnym wierszu i przechodzi kolejno przez kolejne wiersze, wykonując je po drodze. Program kończy się po wykonaniu ostatniego wiersza. Instrukcje Goto mogą przekierowywać ścieżkę wskaźnika instrukcji.
Nowa linia, spacja i 9
to jedyne trzy znaki, które mają znaczenie w programie 99 . Wszystkie pozostałe postacie są całkowicie ignorowane. Ponadto końcowe spacje w każdej linii są ignorowane, a wiele spacji w rzędzie jest odczytywanych jako jedna spacja. („Newline” odnosi się do każdego typowego kodowania podziału linii . Nie ma znaczenia, którego używa Twój tłumacz.)
Więc ten program:
9 BLAH 99 9a9bb9c9
9 this line and the next have 6 trailing spaces 9
Jest identyczny z tym programem:
9 99 9999
9 9
Zmienne
Wszystkie zmienne w 99 mają nazwy, które są jednym lub więcej 9
ciągiem razem ( 9+
w wyrażeniu regularnym). Na przykład 9
, 99
i 9999999999
są różne zmienne. Oczywiście istnieje nieskończenie wiele (z wyjątkiem ograniczeń pamięci).
Wartość każdej zmiennej jest liczbą całkowitą z dowolną precyzją ze znakiem . Domyślnie każda zmienna jest przypisana do własnej reprezentacji numerycznej. Więc jeśli nie zostało to ponownie przypisane, wartością zmiennej 9
jest liczba 9, a wartością zmiennej 99
jest liczba 99 i tak dalej. Możesz myśleć o tym jako o traktowaniu zmiennych jako liczb zwykłych, dopóki nie zostaną one wyraźnie przypisane.
Będę używał, V
aby odnieść się do dowolnej nazwy zmiennej poniżej.
Każda instancja V
może zostać zastąpiony 9
, 99
, 999
, 9999
, itd.
Sprawozdania
Istnieje pięć różnych typów instrukcji w 99 . Każda linia w programie 99 zawiera dokładnie jedną instrukcję.
Opisana tutaj składnia zakłada, że wszystkie obce znaki zostały usunięte, wszystkie końcowe spacje zostały usunięte, a wszystkie sekwencje wielu spacji zostały zastąpione pojedynczymi spacjami.
1. Brak operacji
Pusta linia to brak operacji . Nie robi nic (oprócz zwiększania wskaźnika instrukcji).
2. Wyjście
V
Pojedyncza zmienna V
w linii drukuje tę zmienną na standardowe wyjście.
Jeśli V
ma nieparzystą liczbę 9
( 9
, 999
itp.), V
To zostanie wydrukowana wartość całkowita podzielona przez 9 (w systemie dziesiętnym).
Jeżeli V
ma parzystą liczbę 9
( 99
, 9999
itd.) , To zostanie wydrukowany znak ASCII z kodem V
podzielonym przez 9, mod 128. (To jest (V / 9) % 128
wartość od 0 do 127.)
Przykład : program
9
9999
wydrukuje 1W
. Pierwszy wiersz jest drukowany, 1
ponieważ 9/9 to 1. Drugi wiersz jest drukowany, W
ponieważ 9999/9 to 1111, a 1111 mod 128 to 87, a 87 to kod znaku W
.
Zauważ, że podziały wierszy nie są drukowane między tokenami wyjściowymi. \n
należy jawnie wydrukować w celu podziału linii.
3. Wejście
V
Pojedyncza zmienna V
w linii z wiodącą spacją pobiera dane wejściowe ze standardowego wejścia i przechowuje je w tej zmiennej.
Jeśli V
ma nieparzystą liczbę 9
, to użytkownik może wpisać dowolną liczbę całkowitą ze znakiem i V
będzie ustawiony na 9-krotność tej wartości.
Jeśli V
ma parzystą liczbę 9
, wówczas użytkownik może wpisać dowolny znak ASCII i V
będzie ustawiony na 9-krotność jego kodu znakowego.
Przykład : Biorąc pod uwagę -57
i A
jako dane wejściowe, ten program
9
9
99
99
wyszedłby -57A
. Wewnętrznie zmienna 9
miałaby wartość -513 i 99
miałaby wartość 585.
Twój tłumacz może założyć, że dane wejściowe są zawsze poprawne pod względem składniowym.
4. Przydział
To oświadczenie może być dowolnie długie. To dwie lub więcej zmiennych w linii, oddzielone spacjami:
V1 V2 V3 V4 V5 ...
Przypisuje to sumę wszystkich indeksów parzystych, minus suma indeksów nieparzystych (wyłączając ). Przypisania są wartościowe, a nie referencyjne.V1
V
V
V1
Można to przetłumaczyć na większość języków jako .V1 = V2 - V3 + V4 - V5 + ...
Jeśli więc są tylko dwie zmienne, jest to normalne przypisanie:
V1 V2
→ V1 = V2
Jeśli są trzy, to odejmuje:
V1 V2 V3
→ V1 = V2 - V3
A znak +
/ -
ciągle przełącza się z każdą dodatkową zmienną:
V1 V2 V3 V4
→ V1 = V2 - V3 + V4
Przykład : ten program wyświetli 1110123
:
999 Prints triple-nine divided by nine (111).
999 9 9 Assigns triple-nine to zero (nine minus nine).
999 Prints triple-nine divided by nine (0)
9 999 9 Assigns single-nine to negative nine (zero minus nine).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (1).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (2).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (3).
5. Idź do (skok, jeśli wszystkie zero)
To oświadczenie może być również dowolnie długie. To dwie lub więcej zmiennych w linii, oddzielone spacjami, z odstępem wiodącym :
V1 V2 V3 V4 V5 ...
Jeśli niektóre z wartości oprócz tego są niezerowe, zachowuje się to tak, jak brak operacji. Wskaźnik instrukcji jest jak zwykle przenoszony do następnego wiersza.V1
Jeśli wszystkie wartości poza tym są równe zero, wskaźnik instrukcji zostaje przesunięty na numer wiersza . Linie są indeksowane od zera, więc jeśli wynosi zero, wskaźnik przesuwa się do górnej linii. Program kończy się (zwykle bez błędów), jeśli jest ujemny lub jest większy niż najwyższy możliwy indeks (liczba linii minus jeden).V1
V1
V1
V1
Pamiętaj, że tutaj nie podzielono przez 9. A ponieważ niemożliwe jest, aby zmienna była wartością, która nie jest wielokrotnością 9, można przeskakiwać tylko numery linii, które są wielokrotnościami 9.V1
Przykłady:
Ten program wydrukuje na 1
zawsze:
9 Prints single-nine divided by nine (always 1).
99 9 9 Assigns double-nine to zero.
99 99 Jumps to line zero (top line) if double-nine is zero.
Ten program
99999999 Print G.
999 99 Set triple-nine to ninety-nine.
9999999999 9999999999 9999999999 99 99 9 9 999 999 Set 10-nine to zero.
99999999999 9999999999 Set 11-nine to zero.
999 Print triple-nine's value divided by nine. (This is the ninth line.)
99999999 Print G.
999 999 9 Subtract nine from triple-nine.
99999 999 Jump to line 5-nines if triple-nine is zero (ends program).
9 99999999999 9999999999 Jump to line nine if 10-nine and 11-nine are zero (always jumps).
wyświetli liczby od 11 do 1, w malejącej kolejności, otoczone przez G
:
G11G10G9G8G7G6G5G4G3G2G1G
Dodatkowe Szczegóły
Idealny interpreter będzie działał z wiersza poleceń z nazwą pliku programu 99 jako argumentem. We / wy będzie również wykonywane w locie w wierszu poleceń.
Możesz jednak napisać funkcję interpretera, która pobierze program jako ciąg znaków, a także listę tokenów wejściowych (np ["-57", "A"]
.). Funkcja powinna wydrukować lub zwrócić ciąg wyjściowy.
Nieco inne sposoby uruchamiania interpretera i obsługi We / Wy są w porządku, jeśli te opcje są niemożliwe w Twoim języku.
Bonus: Napisz coś fajnego w 99, a chętnie zamieszczę to w tym poście jako przykład.
- Oto Pastebin zgrabnego programu „99 butelek piwa” z odpowiedzi Maca .
Mam nadzieję, że podobało Ci się moje 99. wyzwanie! :RE