Istnieje wiele wyzwań, które mówią „interpretować X”, gdzie X jest prostym językiem. Moim zdaniem jest to zbyt nudne. Aby dać wszystkim zwlekającym ludziom w Internecie coś ciekawego do zrobienia, możesz spróbować wykonać to wyzwanie:
Wyzwanie
Wybierz język $LANG
. $LANG
może być dowolnym kompletnym językiem programowania Turinga lub kompletnym podzbiorem języka programowania Turinga. Pamiętaj, że jeśli pominiesz funkcję swojego języka w $LANG
tłumaczeniu, nie możesz używać go również w swoim własnym programie, ponieważ twoje zgłoszenie musi być również zapisane $LANG
.
Napisz kompilator / tłumacz dla $LANG
napisanych w $LANG
. Możesz użyć wszystkich udogodnień (w tym eval
i znajomych) swojego języka, które są dostępne do napisania tego kompilatora. Aby zadanie było trudniejsze, istnieje jedno ograniczenie: Twój program powinien być w stanie interpretować / kompilować wszystkie prawidłowe programy z $LANG
wyjątkiem samego interpretera / kompilatora. Jeśli okaże się, że program do interpretacji / kompilacji jest twoim interpreterem lub kompilatorem (niezależnie od nazwy pliku), twój program powinien zrobić coś zupełnie niezwiązanego z funkcjonalnością interpretera lub kompilatora (np. Wygładzanie lub drukowanie Hello, world!
).
Aby uczynić to zadanie jeszcze bardziej złożonym, twój program nie może czytać własnego źródła podczas kompilacji lub interpretacji.
Dane techniczne
- To zadanie polega na kodowaniu w golfa. Zgłoszenie zawierające najmniej poprawnych znaków wygrywa. W przypadku remisu rozwiązanie, które zostało przesłane jako pierwsze, wygrywa.
- Twój program / skrypt powinien odczytać program do interpretacji z pliku. Możesz na stałe zakodować jego ścieżkę i nazwę. Po odczytaniu pliku możesz go skompilować do innego pliku (który musi być wykonywalny w systemie) lub uruchomić go bezpośrednio. Jeśli
$LANG
brakuje możliwości odczytu plików, możesz wybrać inny sposób odczytu w odpowiednim kodzie$LANG
. Nie możesz wybrać$LANG
podzbioru innego języka, ale z usuniętymi możliwościami odczytu plików. - Obowiązują zwykłe zasady gry w golfa. To znaczy: Twój osobisty język dla zwierząt domowych, który wymyśliłeś tylko po to, aby rozwiązać to wyzwanie, jest zabroniony, jeśli rozwiązanie stanie się trywialne przy jego użyciu (np. Zdefiniowanie programu jednoznakowego, który dokładnie implementuje rozwiązanie). Zachęca się do nadużywania zasad.
źródło
Odpowiedzi:
Ruby, 63
źródło
Perl, 89 znaków, bez oszukiwania
Zauważ, że ten kod jest bardzo wybredny w kwestii tego, co liczy się jako „samo”. W szczególności nie rozpoznaje siebie, jeśli na wejściu znajdują się znaki nowej linii lub inne dodatkowe białe znaki. Aby to przetestować, zapisz go w pliku o nazwie (na przykład)
unquine.pl
i wykonaj następujące czynności:Pamiętaj, że
unquine.pl
plik powinien mieć dokładnie 89 bajtów, nie więcej, nie mniej. Uruchomienie go z innym skryptem Perla jako wejściem powoduje wykonanie innego skryptu, tak jak powinien:Jak sama nazwa może sugerować, implementacja oparta jest na quine - a konkretnie na tej:
Ten kod ustawia się na
$_
równi; reszta programu (która oczywiście musi być zduplikowana w środku$_
) po prostu porównuje$_
dane wejściowe, umiera, jeśli pasują, i ocenia dane wejściowe inaczej.źródło
&&
/;
parę z potrójnego (jeden char off, podwojona przez quining). Świetny pomysł i wdrożenie!GolfScript, 30 znaków
Ten program odczytuje zawartość pliku o nazwie podanej w wierszu poleceń i, jeśli nie jest dokładnie równy powyższemu kodowi, interpretuje go jako GolfScript. Jeśli dane wejściowe są dokładnie równe powyższemu kodowi, zostaną po prostu wydrukowane w niezmienionej formie (z wyjątkiem nowej linii dołączonej na końcu).
Jest to dość prosta adaptacja tego programu umożliwiającego identyfikację . Konkretnie:
{ }
to dosłowny blok kodu w GolfScript..~
, zastosowane do bloku kodu, duplikuje blok i wykonuje kopię.Wewnątrz bloku kodu:
`
uszeregowuje kopię bloku kodu.".~"+
dołącza do niego znaki.~
, uzyskując ciąg zawierający kod źródłowy programu."#{$<.read}"
to udokumentowany hack, który pozwala na wykonanie kodu Ruby w GolfScript. W takim przypadku wykonuje instrukcję Ruby$<.read
(bezwstydnie skradzioną z rozwiązania Ruby Lowjackera ), która odczytuje i zwraca zawartość wszystkich plików określonych w wierszu poleceń. Ten hack jest potrzebny, ponieważ sam GolfScript nie zapewnia jawnych możliwości we / wy pliku..@
duplikuje i tasuje elementy na górze stosu, tak że stos zawiera dwie kopie zawartości pliku, a następnie kod źródłowy tego programu.=!
porównuje dwa górne elementy na stosie (tj. zawartość pliku i źródło), zwracając 1, jeśli są różne i 0, jeśli są takie same.{~}*
ocenia pozostałą kopię zawartości pliku jako kod GolfScript, ale tylko wtedy, gdy wynikiem porównania jest 1. (Technicznie wykonuje blok kodu{~}
tyle razy , ile wynika z liczby na stosie, tj. 0 lub 1 razy. blok,~
jest operatorem ewaluacji GolfScript).Ps. Jeśli dozwolone jest czytanie kodu do wykonania ze standardowego wejścia, to wyzwanie można rozwiązać 21 znakami bez konieczności wysyłania wiadomości do Ruby:
Ten program odczyta ciąg wejściowy ze standardowego wejścia i jeśli nie pasuje do własnego źródła, wykonuje go (z pustym wejściem). Podobnie jak w powyższym programie, wejście pasujące do źródła jest po prostu powtarzane.
źródło
Python,
167130118 bajtówTo moja pierwsza próba gry w golfa, więc proszę! Interpretuje każdy program oprócz siebie
Poprawiona wersja:
Jeśli się to dostanie, oznacza to, że:
Myślę, że to rozwiązanie działa prawie tak samo jak Ilmari Karonen, podstawową ideą jest coś takiego:
Quine, którego użyłem, było oparte na tym:
Ale od tamtej pory zdałem sobie sprawę, że znacznie krótszy quine to:
Może to być nawet krótsze, jeśli zezwolisz na interaktywną powłokę python, w którym to przypadku możesz:
Ponieważ python nie ma krótkiego sposobu na uzyskanie argumentów wiersza poleceń, poszedłem z raw_input () (która wciąż jest dość długa, ale nie tak długa jak
Zastosowanie to:
lub
Znalazłem krótszy quine do użycia, ale oto moja stara wersja (dla potomności):
źródło
Nie mogę dokładnie odczytać z pliku przy użyciu Javascript (ok, mógłbym, używając HTMLR FileReader, ale to sprawia, że jest to o wiele bardziej skomplikowane niż potrzebuję). Jest to funkcja, która akceptuje program JavaScript jako ciąg znaków i uruchamia go.
To prawdopodobnie nie jest tak golfowe, jak mogłoby być, ale i tak jest:
JavaScript, 252
Daj mi znać, jeśli ktoś zna lepszą technikę tworzenia quinu w Javascript.
źródło
45 znaków sh (powłoka POSIX). Kod do uruchomienia musi znajdować się w pliku
./c
.Kod samego interpretera musi znajdować się w pliku
./p
, więc chyba trochę mnie oszukałem, chociaż wyzwanie nie wydaje się, aby go zabrać. Czy może to zdyskwalifikuje mój „język” z bycia „kompletnym językiem programowania”?Za pomocą narzędzia, które zwykle jest zewnętrznym plikiem wykonywalnym, ale teoretycznie może być wbudowane w powłokę, kod można skrócić:
To 18 znaków, a
-s
bit ma na celu jedynie pomijanie wiersza, który w innym przypadku zawsze byłby drukowany dla prawidłowych programów (innych niż ja).I wtedy zawsze możesz zbudować wersję języka powłoki, która robi powyższe, z bardziej zwięzłą składnią.
I wtedy zawsze możesz zbudować program, który, gdy dane wejściowe składają się z pojedynczego „.” - lub do diabła, pusty ciąg - ocenia zawartość innego pliku jako normalny kod i nazywa to językiem programowania. Tak więc pusty ciąg znaków będzie Twoim rozwiązaniem dla wyzwania w języku, który zbudowałeś. Oto tłumacz dla takiego języka:
Używając języka, który interpretuje powyższy skrypt, rozwiązaniem jest pusty ciąg znaków. Lokalizacja kodu nie musi być już zakodowana.
Problem?
źródło
./othercode
) i robi nic, gdy kod jest pustym ciągiem. Nie powinienem był nazywać pliku ./othercode, to wprowadza w błąd; to tylko kod, który interpretuje interpreter napisany w pustym języku łańcuchowym.JavaScript, 135 znaków
Rozwiązanie JavaScript Petera Olsona zainspirowało mnie do przeniesienia mojego rozwiązania Perla do JS. Podobnie jak jego rozwiązanie, ten kod definiuje funkcję,
c
która akceptuje ciąg znaków i sprawdza go, jeśli nie jest on równy powyższemu kodowi.Zajęło mi trochę czasu, aby dowiedzieć się dobrym sposobem radzenia sobie z brakiem zrównoważonych ograniczników smyczkowych w JavaScript, aż znalazłem to, co z perspektywy czasu jest oczywiste rozwiązanie:
unescape()
.Dogodnie, mój kod nie zawiera żadnych ukośników odwrotnych ani podwójnych cudzysłowów, więc można go bezpiecznie przechowywać w ciągach podwójnych cudzysłowów. Ułatwia to testowanie:
źródło
alert()
ze0
aby nie zrobić niczego zamiast ostrzeganiaundefined
i zapisz 13 znaków.p=>...
zamiastfunction c(p)
Common Lisp, 59
sbcl --load
)L
, która może kompilować pliki Common Lisp(L <your file>)
, podczas odczytu pliku sygnalizowany jest błąd .Czemu?
Ponieważ po raz pierwszy włożyłeś
:~
słowo kluczowe do*features*
. Teraz twoje środowisko wie o tej~
funkcji, a makro czytnika#+
, po ocenie~
wyrażenia cechy , odniesie sukces i przeczyta następujący formularz, zamiast pomijać go tak jak za pierwszym razem. W twoim pliku jest następujący formularz#.(#:a)
, który prosi o ocenę(#:a)
w czasie odczytu i użycie wynikowej wartości jako odczytywanego kodu. Ale(#:a)
wywołuje funkcję powiązaną z niewewnętrznym symbolem#:a
. Ponieważ#:a
jest niewzruszony, jest świeżym symbolem, który nie jest związany z żadną funkcją (tj. Niefboundp
). Błąd.źródło
Schemat, 48 lub 51 znaków
Schemat to język z wieloma różnymi implementacjami. Mimo że implementacje muszą być zgodne z najnowszym RnRS, najnowszy działający standard (R6RS) był niepopularny ze względu na brak minimalizmu. R7RS zostanie wkrótce wydany jako remedium, przy jednoczesnym podzieleniu języka na 2. Pierwszy język jest potężny i minimalistyczny, a drugi, nadzbiór pierwszego, który ma na celu zapewnienie rozszerzeń funkcji dla interoperacyjności między implementacjami. Do tego czasu polegamy na SRFI (Scheme Requests Implementation), które zapewniają (jeśli są implementowane w implementacji hosta lub ręcznie (jak to jest powszechne w schemacie)) środki do przenośnego wykonywania typowych zadań. Wszystko po to, by powiedzieć, że pierwszy fragment kodu (51 znaków), choć jest tak przenośny, jak to tylko możliwe, opiera się na SRFI-22 (wykonywanie skryptów schematu w systemie UNIX) w celu uzyskania dostępu do argumentów wiersza poleceń:
lub bardziej czytelnie:
Drugi (48 znaków) oznacza plik bez interpretacji, który nie może się ocenić (w środowisku zerowym):
lub bardziej czytelnie:
źródło
Groovy, 13 bajtów
To powinno interpretować podzbiór Groovy.
przypadki testowe:
Niestety, choć na pewno barfs, robi to w sposób całkowicie podobny do interpretera i robi to dla całkiem sporego wkładu.
źródło
JavaScript ES6, 45 bajtów
Nadal konkurencyjny! (dzięki @Downgoat)
źródło