W ramach jego odpowiedzi na Make an Error Quine! @Falko zaproponował następujący algorytm:
Jak stworzyć własne rozwiązanie w 2 minuty?
- Otwórz nowy plik w wybranym przez siebie środowisku IDE.
- Uderz głową w klawiaturę przed sobą.
- Skompilować.
- Zastąp kod komunikatem o błędzie kompilatora.
- Powtarzaj kroki 3 i 4, aż kod się zbiegnie.
Założę się, że taka procedura kończy się dość szybko w większości przypadków!
Zadanie
Twoim zadaniem jest udowodnienie, że się myli.
Napisz pełny program, który spełnia następujące wymagania:
Podczas kompilacji lub interpretacji generuje komunikat o błędzie, który po kompilacji lub interpretacji z kolei powoduje również komunikat o błędzie.
Powtarzanie kroku 1 raz za razem w końcu napotka stały punkt, tj. Błąd quine.
Dodatkowe zasady
Ostateczny komunikat o błędzie musi mieć długość dodatnią. Jednak poprzednie komunikaty o błędach i oryginalny kod źródłowy mogą być puste.
Długość oryginalnego kodu źródłowego nie może przekraczać 1024 bajtów.
Ani oryginalny kod, ani kod wygenerowany w którymkolwiek z etapów nie może generować błędów.
Dane wyjściowe muszą być jednoznacznie identyfikowalne jako komunikat o błędzie, który musi zostać wygenerowany przez kompilator / interpreter z powodu błędu składniowego, błędu czasu wykonywania, niezdefiniowanego odwołania itp.
Twój program może nie otrzymywać żadnych danych wejściowych ani wymagać żadnych flag do wygenerowania pętli.
Twój program może polegać na konkretnej implementacji swojego języka lub jego wersji.
Punktacja
Twój wynik to skończona liczba kroków wymaganych przez kod źródłowy przed wygenerowaniem quinu błędu. Zgłoszenie z najwyższym wynikiem wygrywa.
Długość oryginalnego kodu źródłowego zostanie wykorzystana jako przerywnik remisu. Krótszy jest lepszy.
Przykład
W Chicken program
generuje następujący komunikat o błędzie:
TypeError: Cannot read property 'NaN' of undefined
Jeśli ten komunikat o błędzie jest z kolei interpretowany, generuje komunikat o błędzie
Error on line 1: expected 'chicken'
który, jeśli zinterpretowany z kolei, sam się wytwarza.
Tak więc wynik pustego programu Chicken wynosi 2.
Kontrprzykład
Kod PHP
ab<?=c
generuje komunikat o błędzie
PHP Parse error: syntax error, unexpected '?' in Command line code on line 1
który wytwarza się, gdy jest interpretowany.
Jednak drugi kod źródłowy wypisuje komunikat do STDOUT, co powoduje, że ta sekwencja jest nieprawidłowa.
Segmentation fault (core dumped)
.Odpowiedzi:
Bash, 9223372036854775810
Zainspirowany odpowiedzią Doorknob.
Należy go uruchomić z
bash < file.sh
tą samą nazwą pliku dla każdego programu lub użyć tej samej nazwy pliku, aby pozbyć się różnych nazw plików w komunikatach o błędach.Pierwsze kilka błędów to (z
LANG=C
):I w końcu:
który jest quine błędu.
źródło
bc
lub piszę własny kod do dekrementacji.Pip 0,15.05.29 , ponad 10 100 000
Technicznie niepoprawny, ponieważ wymaga
-w
flagi dla wyjścia ostrzegawczego. Biorąc to pod uwagę, Pip zgodnie z projektem nie wyświetla żadnych błędów środowiska wykonawczego, chyba że faktycznie powodują awarię programu (nieskończona rekurencja, np.); problemy z tym kodem to rzeczy, na które na pewno narzekaliby inne języki.Dokładna liczba kroków zależy tylko od przypisanej wartości
i
, więc może być dowolnie duża (dopóki interpreterowi języka Python nie zabraknie pamięci). Ponadto ukończenie powyższej sekwencji zajęłoby więcej niż wiek wszechświata. (Pytanie było określić „zwolnić”!)Wyjaśnienie:
Musiałem przeczesać interpreter, zanim znalazłem błąd, który pozwoliłby mi wstawić dowolny kod do komunikatu ostrzegawczego. Następnie zasadniczo modyfikował standardowe techniki quine. Przykładem tutaj używa
i
-value w5
celach wyjaśnienia.Po ustawieniu
i
zapisz ciąg znaków,d
a następnie spróbuj wykonać instrukcjęS
wap. Zamiana oczekuje dwóch zmiennych (dokładniej wartości lv).s
jest w porządku, ale drugie wyrażenie jesti?dRo--iRsRPda
. Jeślii
jest to prawda (niezerowe, dla naszych celów), trójka ocenia nadRo--iRsRPd
, który używad
z wcześniej do utworzenia prawie quine - tylko zi
obniżeniem. To wyrażenie nie jest wartością, więc Pip narzeka:... który następnie zaczyna wszystko od nowa. (
Attempting to swap non-lvalue
to kilka no-ops:At
oblicza wartość ASCIIt = 10
,n-l
odejmuje znak nowej linii minus każdą wartość pustej listy, a wszystkie małe litery są tylko zmiennymi.)Proces przebiega podobnie, aż do:
Po uruchomieniu
i
jest teraz fałszem. Wyrażeniea
trójkowe ocenia na gałąź else - która jest wartością. W ten sposób swap już nie narzeka. Zamiast tego otrzymujemy:I po uruchomieniu tego w końcu mamy rzeczywisty błąd składniowy:
... w tym momencie, odkąd „program” zaczyna się od
R
, Pip będzie dalej narzekał, żeR
nie jest to jednorazowy operator na zawsze.Najlepszym rozwiązaniem, które nie używa,
-w
jest długość 3:źródło
-w
liczy się jako język programowania zgodnie z meta konsensusemJulia, 3
Prosty, aby piłka się toczyła ...
Program początkowy:
Błąd 1:
Nie można go zdefiniować, ale jeśli jest hiszpański , jest również nieoczekiwany. Nikt nie spodziewa się hiszpańskiej inkwizycji.
Błąd 2:
Błąd 3:
Trzeci komunikat o błędzie, przesłany jako program, powoduje ten sam błąd, stąd wynik 3.
Praca w toku! Z pewnością dam radę lepiej niż 3.
źródło
R 5
Program początkowy:
Błąd 1:
Błąd 2:
Błąd 3:
Błąd 4:
Błąd 5 (Quine):
źródło
Bash, 3
Bardzo podstawowy skrypt powłoki, aby go przetestować:
źródło
stdout
. Jeśli istniejestdout
istderr
nie będzie działać poprawnie.Ruby, 5
Program początkowy
1
2)
3)
4
5 (Quine)
źródło
Java, 5
Są bardzo długie ... więc sprawdziłem równość ciągów za pomocą skryptu Python i wygenerowałem ten sformatowany post, więc nie musiałbym ręcznie wstawiać tabulatorów w 400 liniach.
Program początkowy
1
2)
3)
4
5 (Quine) - pominięty ze względu na długość postu.
źródło
javac -version
)?JavaScript, 3 poziomy błędów
To nie jest ten „tasak” ani nic takiego, ale uznałem to za dość dziwne…
Błąd 0 (oryginalny):
Błąd 1:
Błąd 2:
Błąd 3 (quine):
Wszystko to zostało zwrócone w przeglądarce Internet Explorer 11.0.9600.17416, ponieważ błędy zostały przetłumaczone na angielski.
Zrzut ekranu:
* Komunikaty o błędach są wyświetlane w języku portugalskim i można je łatwo przetłumaczyć na angielski
źródło
JS w przeglądarce Firefox 66.0; 3 poziomy błędów
Wkład:
6?4;
Błąd nr 1 = Wejście nr 2:
missing : in conditional expression
Błąd nr 2 = Wejście nr 3:
expected expression, got keyword 'in'
Błąd nr 3 = Wejście nr 4 = Błąd nr 4:
unexpected token: identifier
To najwyższy wynik.
źródło