Błąd (lub ostrzeżenie) quine, która jest również normalną quine [zamknięta]

9

(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 któ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 wyzwanie, 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.)

Społeczność
źródło
2
Jak powiedziałem na czacie, myślę, że pierwszy punkt kuli jest niejasny. W większości przypadków oczywiste będzie, czym jest komunikat o błędzie / ostrzeżeniu, a nie tylko punkt wyjścia do dyskusji i prawników językowych.
Dennis
@Dennis: Zasadniczo zgadzam się, że sytuacja nie jest świetna, ale z drugiej strony nie mogę wymyślić konkretnego sposobu jej poprawy; usunięcie wyjątku dla rzeczy, które są w oczywisty sposób komunikatami o błędach, może prowadzić do bardzo niezamierzonych sytuacji w niektórych językach, które mogą powodować więcej szkód niż leczy; jeśli uważasz, że możesz poprawić to pytanie, nie mam nic przeciwko temu, że zostanie ono edytowane (i nie sądzę, aby pytania dotyczące PPCG i tak powinny mieć „własność”, chociaż to inny problem)
Obecnie uważam, że pytanie jest niejasne i nie ma obiektywnego kryterium ważności. Zgadzam się, że moja proponowana zmiana może pogorszyć sprawę. Jednym z możliwych działań byłoby zawieszenie wyzwania i odłożenie go w piaskownicy.
Dennis
1
Na razie zawiesiłem wyzwanie. Mam nadzieję, że ponownie rozważysz umieszczenie go w piaskownicy. To bardzo interesujący pomysł i szkoda byłoby pozwolić mu zmarnować.
Dennis
1
Piaskownica jest tutaj . (Zastanawiałem się nad edytowaniem tego w pytaniu, ale umieszczałoby to post w kolejce do ponownego otwarcia, co byłoby wysoce przeciwne do zamierzonego, ponieważ utrudniłoby ponowne otwarcie, gdyby i kiedy problemy zostały rozwiązane.)

Odpowiedzi:

9

JavaScript (Firefox 50), 153 bajty

Error: "Error: 1.replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})".replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})

Wyjaśnienie

Pomysł polegał na tym, aby zacząć od najłatwiejszej do modyfikacji quinu JS , jaki do tej pory znalazłem:

".replace(/.+/,x=>alert(uneval(x)+x))".replace(/.+/,x=>alert(uneval(x)+x))

Słowo throwkluczowe jest prostym sposobem, aby również rzucić własny kod:

".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})

Istnieje jednak niewielki problem: Firefox poprzedza przekazaną wiadomość Error:. Na szczęście Error: mycodejest w rzeczywistości poprawny JavaScript! (Aby dowiedzieć się więcej na ten temat, odwiedź MDN ).

Error: ".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})Error: ".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})

Ups, to ostrzega niewłaściwą rzecz:

".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})Error: ".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})Error: 

Ponieważ znak cudzysłowu nie jest już na początku kodu, uneval(x)+xnie da nam poprawnego wyniku. Najlepszym sposobem, aby to naprawić, jest dodanie symbolu zastępczego zamiast zagnieżdżonego łańcucha:

Error: "Error: 1.replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x})".replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x})

Uh-oh, teraz Error:w komunikacie o błędzie jest coś dodatkowego . Naprawmy to, odcinając ciąg:

Error: "Error: 1.replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})".replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})

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.

ETHprodukcje
źródło
5

Python 2, 217 80 51 bajtów

Wymagane jest podawanie tylnego wiersza.

s='s=%r;print s%%s;exit(s%%s)';print s%s;exit(s%s)

Wypróbuj online

Zacząłem od prostego quine:

s='s=%r;print s%%s';print s%s

Potem dodałem raisena końcu, żeby rzucić IOError.

s='s=%r;print s%%s;raise IOError(s%%s)';print s%s;raise IOError(s%s)

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.

mbomb007
źródło
1
Nie sądzę, aby było to zgodne z definicją błędu w specyfikacji wyzwania, ponieważ nie jest to konsekwencja czegoś innego niż wykonanie polecenia ani nie było częścią danych wejściowych polecenia, które spowodowało, że zostało ono wygenerowane . To powiedziawszy, zwykły tutaj exitdziała dobrze. Nie ma potrzeby sys.
Dennis