^"
>#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 \n
jest 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 expected
kró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 p
polecenie (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 p
polecenie zużywa trzy argumenty (dlatego wypchnęliśmy 3 liczby, w przeciwnym razie zjedzilibyśmy tutaj część łańcucha), a :
& i 1
znaki wypychają łącznie 4 wartości na stos, które przeciwdziałamy z instrukcją p
a $
(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ę.