Wymyśliłem ezoteryczny skoczek. Później zobaczysz dlaczego.
- Działa z pamięcią o swobodnym dostępie z bajtami jako komórkami. Pamięć RAM jest indeksowana zerem i początkowo wypełniona zerami.
- Podczas próby uzyskania dostępu do komórek z indeksami ujemnymi powinien zostać wyświetlony błąd i program zakończony.
- Podczas próby odczytu z większym indeksem niż ostatni, należy zwrócić zero.
- Gdy próbujesz pisać z większym indeksem niż poprzednio, pamięć RAM powinna zostać zwiększona do wielokrotności 1024, a nowe komórki wypełnione zerami (technicznie możesz zwiększyć pamięć RAM nie do wielokrotności 1024, powodem było zwiększenie wydajności, więc jeśli kosztuje to dużo znaków, może to zrobić nie do wielokrotności 1024).
- Program ma również wskaźnik do komórki w pamięci RAM, która początkowo wynosi zero
- Kiedy program rozpocznie wykonywanie monitu o wyświetlenie ciągu wejściowego, powinien zostać wyświetlony (lub weź dane wejściowe z argumentów wiersza poleceń, to zależy od ciebie). Łańcuch wejściowy nie powinien zawierać znaku zerowego (bajt zerowy). Następnie ciąg wejściowy jest zapisywany w pamięci RAM, zaczynając od zera indeksu.
- Po zakończeniu wykonywania programu wyświetla się okno z wyjściem programu - z wyłączeniem zawartości pamięci RAM od indeksu zerowego do pierwszego bajtu zerowego.
Teraz najciekawsza część, składnia.
Program składa się z poleceń (jednoargumentowych operatorów-prefiksów) i ich argumentów. Polecenia i argumenty mogą być rozdzielane spacjami lub nowymi wierszami, ale nie są konieczne. Jednak spacje wewnątrz argumentów są niepoprawne, na przykład # 2 = 4
są poprawne, ale # 2 = 4 4
nie są.
Program może zawierać komentarze między ()
. Komentarze nie mogą być zagnieżdżone - na przykład w (abc(def)ghi)
komentarzu jest (abc(def)
. Komentarze można umieszczać w dowolnym miejscu.
#123
ustawia wskaźnik RAM na 123 (dowolna dodatnia liczba całkowita dziesiętna lub zero).>123
zwiększa wskaźnik pamięci RAM o 123 (dowolna dodatnia liczba całkowita dziesiętna).<123
zmniejsza wskaźnik RAM o 123 (dowolna dodatnia liczba całkowita dziesiętna).=123
zapisuje 123 (dowolna 8-bitowa liczba całkowita dziesiętna bez znaku) w bieżącej komórce.+123
dodaje 123 (dowolna 8-bitowa liczba całkowita dziesiętna bez znaku) do bieżącej komórki (modulo 256).-123
odejmuje 123 (dowolna 8-bitowa liczba całkowita dziesiętna bez znaku) od bieżącej komórki (modulo 256).:123
- „goto” - przechodzi na numer polecenia 123 (pierwszy to 0). Możesz kontrolować przepływ swojego programu tylko za pomocą goto - musi skakać - dlatego postanowiłem nazwać ten język Jumper.
Jeśli brakuje argumentu - pomyśl o 1 dla ><+-
poleceń lub 0 dla #=:
poleceń.
Istnieje również modyfikator polecenia - ?
(prefiks do polecenia), wykonuje następne polecenie tylko wtedy, gdy bieżąca komórka nie jest równa zero, w przeciwnym razie pominie to polecenie. Można zastosować do dowolnego polecenia.
Na przykład ?:17
- przechodzi do polecenia 17, jeśli bieżąca komórka nie jest równa zero.
Jeśli program jest nieprawidłowy lub wystąpi błąd podczas działania, może zostać wyświetlony komunikat „Błąd”. Z tego powodu jest CodeGolf, taka krótka wiadomość będzie w porządku.
Twoje zadanie
Napisz najkrótszy tłumacz dla tego języka.
Niektóre programy testowe
(prints "Hello world!" regardless of input)
=72>=101>=108>=108>=111>=32>=119>=111>=114>=108>=100>=33>=
(appends "!" to the end of input string)
?:2 :4 >1 :0 =33 >1 =0
źródło
Odpowiedzi:
Rubinowy, 447 bajtów
Pobiera zarówno program, jak i dane wejściowe za pomocą argumentów wiersza poleceń.
EDYCJA: Naprawiono kilka błędów i dodano obsługę nieprawidłowej składni kosztem 40 bajtów (przy jednoczesnym dodaniu kilku innych optymalizacji).
źródło
Python (729)
Jeśli chodzi o uruchomienie programu:
Przykład:
Prawdopodobnie jest kilka rzeczy, które przeoczyłem, więc zostaw komentarz, jeśli spróbujesz czegoś, co powinno działać, ale nie działa. Zauważ, że jest to zapisane w kodzie Python 2.x.
źródło
Ruby 2 -
540447420 znakówUruchom jako „instrukcje jumper.rb ruby2.0” „instrukcje” „dane inicjalizacji” ”. 1.x Ruby nie będzie działać (brak metody String.bytes).
Dodano wieloliniowe polecenia i komentarze oraz ulepszyłem wprowadzanie.
Oto zestaw testów z kilkoma testami rozrzutu. Najłatwiejszym sposobem jest włożenie kodu do t / jumper.t i uruchomienie „perl t / jumper.t”.
Wersja bez golfa.
Szybki asembler.
źródło
Clojure -
585577 bajtówNie użyto specjalnych sztuczek golfowych, ponieważ nie znam żadnych dla Clojure. Tłumacz jest wyłącznie funkcjonalny. Jest dostarczany z ładnym komunikatem o błędzie w przypadku ujemnego adresu RAM (błąd jest generowany, ale nie są zgłaszane żadne wyjątki lub błędy).
Przykłady:
Oryginalnynieco nie golfisty kod:źródło
-
na końcu klasy postaci wyrażenia regularnego, nie musisz przed nią uciekać. -1 znak.CoffeeScript (465)
Pierwsze okno zachęty dotyczy programu, a drugie pole zachęty jest wprowadzane. Przetestuj na http://coffeescript.org .
Oryginał :
To wciąż gra w golfa, ale skomentował:
Edycja : Dodawanie spacji zajęło więcej bajtów, niż myślałem. Ten interpreter zgłosi błąd w przypadku niepoprawnej składni, drugi ma nieokreślone zachowanie w przypadku nieprawidłowej składni.
źródło
?:2 :4 >1 :0 = 33 <10 =0
(program append-! Z dodatkową spacją)<1
nie<10
.JavaScript, 519
Spowoduje to pobranie programu i danych wejściowych za pomocą pól zachęty. Wklejenie tego w konsoli Javascript przeglądarki będzie działać, a także wrzucenie tego do pliku, wklejenie przed kodem
<!DOCTYPE html>
, znakiem nowej linii,<html><head><script>
i po kodzie</script></head><body></body></html>
oraz zapisanie wynikowego pliku jako „swagger.html”.To moja pierwsza próba w tej sprawie i już podoba mi się ten język. Trochę Jednak naprawdę potrzebuje etykiet tekstowych, zamiast opisywania indeksów instrukcji w stylu BASIC.
Wersja bez golfa (trochę):
źródło
clojure.string/replace
?:2 :4 >1 :0 = 33 <10 =0
tym poradzić (dodatek -! Z dodatkową spacją) Nie testowałem.C 687 GCC 4.9.0 i Visual C ++ 2013 (jeśli zakończenia linii liczą się jako 1)
Edycja: Dzięki Dennisowi jest teraz znacznie krótszy (i uruchamia się w GCC)
Wersja golfowa
Wersja nieco mniej golfowa:
źródło
R[z]=x
wP(x)
z(R[z]=x)
. 2. GCC nie wymaga żadnych instrukcji dołączania. 3.char C
->U C
.Groovy 582
wersja bez golfa:
Myślę, że jest błąd w komentarzach, które nie są poprawnie rozpoznawane, co może być spowodowane głupim wyrażeniem regularnym, którego użyłem, ale 2 programy działają tak, jak powinny:
źródło
Haskell: bezbożna liczba postaci
W porządku, teraz jest to coś, co może, ale nie musi, zostać wkrótce zagrane w golfa. Jest dziwnie ogromny, z tym, czym jest, z mnóstwem niechlujnie napisanego kodu (minęło sporo czasu, odkąd ostatni raz dotknąłem Haskella). Ale fajnie było pisać.
źródło
Haskell, 584
Program wprowadzania i zworek są dostarczane jako pierwsze dwa wiersze wejścia ze standardowego wejścia.
Później opublikuję wersję bez golfa, ale tymczasem chciałem pozostawić to jako zagadkę dla czytelnika:
Baw się dobrze!
źródło