Quine / Error Quine Polyglot


14

Twoje zadanie jest proste: Napisz program, który można uruchomić w dwóch językach. Powinien to być normalny quine (drukuje własny kod źródłowy) w języku 1, i powinien być quine błędu (generuje komunikat o błędzie identyczny z własnym kodem źródłowym) w języku 2.

To jest , więc wygrywa najkrótsze prawidłowe przesłanie (w bajtach).

Zasady:

  • Języki mogą być dowolnie podobne. Supersety / podobne wersje / podobne dialekty nie są niedozwolone.
  • Reguły wyszukiwania błędów są takie same, jak te w sekcji Tworzenie zapytania o błędzie! .


Czy dozwolone są dwa różne dialekty języka BASIC?
MD XF

@MDXF Jeśli zachowują się dokładnie tak samo, z tym wyjątkiem, że jedno wyjście do STDERR zamiast tego, to nie. W przeciwnym razie tak.
Esolanging Fruit

Zatem moja odpowiedź jest ważna.
MD XF

@MDXF Jest poprawny.
Esolanging Fruit

Odpowiedzi:


2

Befunge-93 (FBBI) / C (tcc) , 93 + 62 = 155 bajtów

^"
>#001p#"<>:#,_@#1-8*3:-1*57+55-1*79*57:-1:*77**278\-1:*57$p:1: error: declaration expected

Wypróbuj online !: Befunge-93 , C

Dzięki randomdude999 za zauważenie, że nazwa pliku wymaga pasujących cudzysłowów do działania.

Musi być zapisany pod nazwą pliku ^"\n>#001p#"<>:#,_@#1-8*3:-1*57+55-1*79*57:-1:*77**278\-1:*57$p, gdzie \njest nowa linia. Z tego powodu TIO dla C nie działa dokładnie tak, jak powinien. Testowany do pracy na Lubuntu.

Objaśnienie (C):

Program nie kompiluje się, a tcc z przyjemnością wyświetla nazwę pliku jako część komunikatu o błędzie. Istnieje wiele błędów kompilacji, które można uzyskać na podstawie początku kodu. ^na początku daje nam declaration expectedkrótki, który nie zawiera żadnych problematycznych znaków ". Z drugiej strony programiści gcc i clang są bardzo pesymistyczni i postanowili wypisać wiele błędów na raz, co nie jest zbyt przyjemne, więc nie używamy ich kompilatorów.

Objaśnienie (Befunge-93):

Befunge jest wygodny dla quinesów, ponieważ jego kod może być również wykorzystywany jako dane znakowe, dzięki "poleceniu, które przełącza tryb ciągów znaków. Na początku wykonujemy kilka bezużytecznych operacji na stosie, a następnie wydajemy ppolecenie (put), które umieszcza znak NUL na (0, 1). Następnie odbijamy wskaźnik instrukcji po lewej stronie i zaczynamy czytać wszystko jako ciąg znaków. Należy to zrobić po lewej stronie, ze względu na naturę stosu LIFO. Po owinięciu i "ponownym dotarciu do postaci sznurek się kończy. Zauważ, że znak NUL zastąpił znak$znak, tworząc separator w połowie ciągu. Następnie wciskamy 3 cyfry na stos i przeskakujemy przez NUL (ponieważ niestety zawiesza się interpreter podczas uruchamiania jako instrukcja). Tutaj należy wykonać część statyczną komunikatu o błędzie. Większość jego znaków to brak operacji, ale ppolecenie zużywa trzy argumenty (dlatego wypchnęliśmy 3 liczby, w przeciwnym razie zjedzilibyśmy tutaj część łańcucha), a :& i 1znaki wypychają łącznie 4 wartości na stos, które przeciwdziałamy z instrukcją pa $(pop i odrzuć). Następnie wykonywana jest pewna arytmetyka w celu wypchnięcia kodów ASCII, ^"\n>#001p#"a na końcu pętla wypisuje wszystkie wartości na stosie jako znaki, aż znajdzie znak NUL i zakończy się.


Musisz znaleźć system operacyjny obsługujący taką nazwę pliku i podać go. Wiem, że Windows tego nie obsługuje.
mbomb007

@ mbomb007 Podobno Linux zwykle akceptuje dowolny znak do wydrukowania w nazwie pliku, z wyjątkiem /. Nie mogę teraz tego przetestować.
minus siedem,

1
Z jakiej wersji TCC korzystałeś? Korzystam z wersji 0.9.27-3 prosto z repozytoriów Arch, a otrzymuję błąd <define>:1: error: missing terminating " character.
randomdude999

1
W porządku, znalazłem dokładną wersję tcc używaną w TIO i dostałem ten sam komunikat o błędzie, ale tylko wtedy, gdy cudzysłowy nazwy pliku pasują. Niezrównane cytaty wydają się konieczne, aby ta odpowiedź mogła działać. Oto coś, co może ci pomóc: Linux pozwala również na nowe wiersze w nazwach plików. To jest wynik tcc podczas dodawania nowego wiersza i cudzysłowu na końcu nazwy pliku: (długi link) . Oznacza to jednak, że musisz znaleźć sposób na wydrukowanie nowego wiersza i rzeczy w drugiej linii.
randomdude999

@ randomdude999 Thanks. Zaktualizowałem rozwiązanie, aby to uwzględnić. Rzeczywiście interesujące jest to, że nieporównywalny cytat powoduje taki problem ...
negatywne siedem

0

Applesoft BASIC / Commodore LCD BASIC , 13 bajtów

?SYNTAX ERROR

W emulatorze Apple] [naciśnij RESETklawisz, aby przejść do trybu BASIC.
W emulatorze Commodore LCD naciśnij, RightArrowEnteraby dostać się do aplikacji BASIC.
W obu przypadkach nie wpisuj ?SYNTAX ERRORwszystkich wielkich liter, ponieważ są one automatycznie pisane wielkimi literami.


2
status niekonkurujący jest zarezerwowany dla zgłoszeń w językach, które zostały złożone po konkursie. Jeśli jest niezgodny z zasadami, usuń go. Najpierw czekaj na potwierdzenie OP, ponieważ uważam, że powinno to być prawidłowe (zakładając, że działa).
HyperNeutrino

@HyperNeutrino Dzięki, edytowane.
MD XF

1
Więc też będę musiał podejrzewać to. To pytanie jest bardziej brutalne, niż się wydaje ...
Ørjan Johansen

1
@ ØrjanJohansen Cóż, nie jestem tego taki pewien. Technicznie rzecz biorąc, Commore LCD nie ma standardowego strumienia bajtów błędów, więc czy to naprawdę jest błąd?
MD XF

1
@ ØrjanJohansen to ? Myślę, że może to oznaczać, że nie można stwierdzić, czy jest to prawidłowe, czy nie. Czy możemy poczekać na potwierdzenie z PO?
MD XF
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.