(Zainspirowany tym komentarzem do starego pytania).
tło
Quine błąd (znany również jako „Kimian Quine'a”) to program, który po opracowaniu lub uruchomić, powoduje kompilator / interpreter / wykonawcze, aby wydrukować komunikat o błędzie, który ma identyczny tekst do samego programu i nic więcej. Na potrzeby tego wyzwania definiujemy szeroko „błąd”, aby uwzględnić także ostrzeżenia.
Zadanie
W tym wyzwaniu szukamy quinektóry jest również quine błędu. Po uruchomieniu program musi normalnie wydrukować własny kod źródłowy (tj. Nie jako komunikat błędu / ostrzeżenia); musi to być odpowiednia liczba (tzn. pewna część programu musi zakodować inną część wyniku). Dodatkowo, kompilacja i wykonanie programu musi również spowodować, że kod źródłowy programu - i nic więcej - zostanie wydrukowany jako komunikat błędu lub ostrzeżenia przez implementację. (Zauważ, że oznacza to, że nie będziesz w stanie używać błędów czasu kompilacji w językach, w których uniemożliwiają one normalne działanie programu.) Innymi słowy, kod źródłowy programu zostanie wydrukowany dwukrotnie, raz dla każdej metody.
Wyjaśnienia
- W większości przypadków oczywiste będzie, co oznacza komunikat o błędzie / ostrzeżeniu; nie rozróżniamy tych dwóch tutaj. W niejednoznacznych przypadkach zdefiniuj komunikat błędu / ostrzeżenia jako dowolny tekst, który jest generowany przez implementację: 1. w wyniku czegoś innego niż wykonanie polecenia (lub cokolwiek najbliższego odpowiednika w języku); lub 2. nie było to częścią danych wejściowych polecenia, które wygenerowało je jako dane wyjściowe.
- Część błędu / ostrzeżenia w quinie nie musi być poprawną quiną (chociaż w większości przypadków będzie to przypadek, ponieważ większość komunikatów o błędach i ostrzeżeniach zawiera znaczne ilości stałego tekstu).
- Dopuszczalne jest, aby program wyświetlał wiele błędów / ostrzeżeń, które tworzą źródło programu po połączeniu. Niedopuszczalne jest wyświetlanie błędów / ostrzeżeń, które nie pojawiają się w źródle.
- W przeciwieństwie do wielu wyzwań, przełączniki przekazane kompilatorowi i nazwa pliku programu mogą być bardzo istotne w tym wyzwaniu. Biorąc pod uwagę, że w przeciwnym razie wyzwanie może nie być możliwe, jestem chętny do elastyczności tutaj, chociaż jeśli uruchomisz implementację w nietypowy sposób, pamiętaj, że reguły PPCG nakładają za to karę bajtową (równą liczbie dodatkowych znaków, które musisz dodać w wierszu poleceń najkrótszy „normalny” sposób uruchomienia programu), a zatem musisz określić wielkość kary w swoim poście. (Na przykład, jeśli używany interpreter odczytuje program z pliku i nie ma szczególnych ograniczeń w nazwie pliku, najkrótszym normalnym sposobem uruchomienia programu byłby plik z 1-znakową nazwą pliku; w związku z tym
- Wersja kompilatora / tłumacza, której używasz, może być odpowiednia, dlatego w ramach zgłoszenia prosimy podać konkretny kompilator lub tłumacz, na którym działa Twój program i która wersja jest wymagana. (Na przykład przesłanie C może zawierać w nagłówku „C (gcc 6.2.0)”).
- Pamiętaj, że to zadanie może nie być możliwe we wszystkich językach. W językach, w których się znajduje, najłatwiejszą metodą będzie znalezienie komunikatu o błędzie lub ostrzeżenia, dla którego można dostosować część podzbioru tekstu (poprzez zmianę nazwy czegoś, co jest cytowane w wiadomości; nazwy plików są częstym wyborem tutaj, ale nie jedyny). Będę pod szczególnym wrażeniem (i zaskoczeniem), jeśli ktoś znajdzie sposób, aby to zrobić, używając tylko komunikatów o błędach i ostrzeżeń, których tekst jest naprawiony.
Warunek zwycięstwa
To jest golf-golfwyzwanie, więc wpis jest uważany za lepszy, jeśli ma mniejszą liczbę bajtów. W związku z tym, gdy w ogóle twój program działa, chcesz go zoptymalizować, aby maksymalnie zmniejszyć liczbę bajtów. (Jednak nie zniechęcaj się, jeśli jest już krótszy wpis, szczególnie jeśli jest on w innym języku; tak naprawdę szukamy tutaj skrócenia określonego algorytmu lub idei programu w jak największym stopniu, ale widząc wiele zawsze warto skorzystać z rozwiązań w różnych językach lub opartych na różnych zasadach.)
Odpowiedzi:
JavaScript (Firefox 50), 153 bajty
Wyjaśnienie
Pomysł polegał na tym, aby zacząć od najłatwiejszej do modyfikacji quinu JS , jaki do tej pory znalazłem:
Słowo
throw
kluczowe jest prostym sposobem, aby również rzucić własny kod:Istnieje jednak niewielki problem: Firefox poprzedza przekazaną wiadomość
Error:
. Na szczęścieError: mycode
jest w rzeczywistości poprawny JavaScript! (Aby dowiedzieć się więcej na ten temat, odwiedź MDN ).Ups, to ostrzega niewłaściwą rzecz:
Ponieważ znak cudzysłowu nie jest już na początku kodu,
uneval(x)+x
nie da nam poprawnego wyniku. Najlepszym sposobem, aby to naprawić, jest dodanie symbolu zastępczego zamiast zagnieżdżonego łańcucha:Uh-oh, teraz
Error:
w komunikacie o błędzie jest coś dodatkowego . Naprawmy to, odcinając ciąg:I na koniec, zarówno dane wyjściowe, jak i komunikat o błędzie są identyczne z kodem! Dodałbym fragment kodu, ale wydaje się, że nie działa on we fragmencie przeglądarki.
źródło
Python 2,
2178051 bajtówWymagane jest podawanie tylnego wiersza.
Wypróbuj online
Zacząłem od prostego quine:
Potem dodałem
raise
na końcu, żeby rzucićIOError
.Niestety, traceback powodował problemy (nie mogłem go całkowicie
IOError: <code here>
usunąć ), a nazwa wyjątku była zawsze drukowana z przodu jak , nawet jeśli usunąłem traceback.Potem znalazłem tę pomocną odpowiedź SO i zmodyfikowałem ją do moich celów.
Potem odkryłem, że mogę pominąć tworzenie własnej klasy i mogę z niej korzystać
sys.exit
, co znacznie skraca mój kod.źródło
exit
działa dobrze. Nie ma potrzebysys
.