Zainspirowany tym domyślnym dla IO .
Zadanie
Napisz program, który przy wejściowej liczbie całkowitej x
od 0 do 255 ulega awarii z kodem wyjścia x
.
Ograniczenia
- Nie możesz wywoływać niczego, co jest przeznaczone bezpośrednio do wyjścia kodu wyjścia (
System.exit(x)
powrotu zmain
itp.). Zamiast tego, twój program musi spowodować błąd lub awarię, która spowoduje, że z prawdopodobieństwem 1, program zakończy działanie z wejściową liczbą całkowitą.- W takim przypadku słowa „błąd” i „awaria” oznaczają, że program spowodował fatalny niezamierzony wyjątek, w którym metoda, operacja lub w inny sposób została użyta niepoprawnie, co spowodowało nieodwracalną awarię.
- Nie możesz bezpośrednio spowodować błędu, rzucając go bezpośrednio. Musisz to zrobić za pomocą metody, funkcji lub w inny sposób, którego przeznaczenie służy innej funkcji (tj. Próba wykonania zapisu pliku do katalogu tylko do odczytu).
- Musisz mieć w swoim programie co najmniej dwa kody wyjścia.
- Zakończenie procesu za pomocą sygnałów jest zabronione. ( W tej dyskusji można znaleźć uzasadnienie )
Punktacja
Wynik Twojego programu jest określany przez liczbę obsługiwanych kodów wyjścia, gdzie zwartość kodu jest rozstrzygająca. Największa liczba obsługiwanych kodów wyjścia wygrywa!
code-challenge
restricted-source
Addison Crump
źródło
źródło
throw new Exception()
styl), jest to nielegalne. Jeśli jest to produkt uboczny niewłaściwego użycia istniejącej funkcji, to w porządku.one zero zero
Dla 100) jest dopuszczalne? Mam pomysł na to wyzwanie, ale język ma dość niezwykłe pomysły na temat I / O, i jest to najbardziej naturalny format wejściowy.Odpowiedzi:
Unix Shell (+ ncurses + narzędzia BSD),
36, 26 bajtów, 256 kodów wyjściaGrał w golfa
Gdy kod wyjścia tput przekroczy 255, po prostu przepełnia się, więc 253 (błędy na wejściu) spowoduje kod wyjścia 1 itd., Dając w ten sposób pożądany status wyjścia dla całego zakresu danych wejściowych.
Uwaga : czy tput nie powiedzie się, kiedy ustawiasz / uzyskujesz określoną możliwość, zależy od typu terminala, którego użyłem:
xterm with 256 colors
jot to narzędzie BSD , które drukuje dane sekwencyjne lub losowe, a (AFAIK) jest również dostępny od razu po zainstalowaniu w systemach OSX.
Jeśli twój system nie jest
jot
dostępny, możesz użyć nieco dłuższej (29 bajtów) wersji:Wypróbuj online! (wersja 29 bajtów)
źródło
Bash 4.2 + dodatki, 24 kody wyjścia
Dzięki @ KenY-N za 3 kody wyjścia. Dzięki @ el.pescado za 1 kod wyjścia.
Weryfikacja
Wszystkie testy zostały przeprowadzone na openSUSE 13.2.
źródło
http_proxy=fafa curl http://example.org
INTERCAL (C-INTERCAL), 15 kodów, 313 + 2 = 315 bajtów
Wypróbuj online!
Cała biała spacja tutaj nie ma znaczenia. (Oryginalny program zawierał tabulatory, ale przekonwertowałem je na spacje, aby poprawnie wyrównały się w SE; w INTERCAL zwykle używa się tabulacji o szerokości 8. Testowałem wersję programu ze wszystkimi tabulatorami, spacjami , i nowe wiersze zostały jednak usunięte i działa dobrze).
Kompiluj z
-abm
(kara 2 bajty, ponieważ-b
jest wymagana, aby kompilator był deterministyczny).Jak zwykle w przypadku INTERCAL, wymaga to wprowadzania danych liczbowych w formacie, np .
ONE TWO THREE
Dla123
.Wyjaśnienie
W przypadku błędu programu C-INTERCAL stanem wyjścia jest kod błędu modulo 256. W rezultacie możemy dążyć do napisania programu, który jest w stanie wygenerować jak najwięcej błędów w czasie wykonywania. Ten program pomija tylko dwa błędy środowiska wykonawczego, które nie wskazują na wewnętrzne problemy z kompilatorem: ICL200I, ponieważ jego odtworzenie wymaga użycia bibliotek zewnętrznych, które są kompatybilne tylko z programem jednowątkowym (a programy wielowątkowe mają więcej dostępnych błędów); i ICL533I, ponieważ 533 ma taką samą wartość modulo 256 jak 277, a program jest w stanie wygenerować ICL277I.
Program zawsze zaczyna się w ten sam sposób. Najpierw wprowadzamy (
WRITE IN
) wartość zmiennej.1
. Następnie używamyCREATE
instrukcji obliczeniowej do utworzenia nowej składni (tutaj,A
); ale ponieważ jest obliczona, definicja składni różni się w zależności od wartości.1
. Wreszcie, w większości przypadków uruchamiamy naszą nowąA
instrukcję, która została zdefiniowana w celu generowania błędu; tabela możliwych definicji zawiera definicję każdego możliwego błędu środowiska wykonawczego (oprócz wyjątków wymienionych powyżej).Po pierwsze, istnieją dwa wyjątki od tego ogólnego schematu.
(0)
nie jest poprawnym numerem wiersza, więc jeśli użytkownik wprowadzi daneZERO
, przeskakujemy z drugiego wiersza (numerowanego(8)
) do czwartego wiersza za pomocąCOME FROM
instrukcji obliczeniowej . To następnie przechodzi w błąd składniowyDO X
, który powoduje błądICL000I
. (W INTERCAL błędy w składni zdarzają się w czasie wykonywania, ze względu na tendencję do wyłączania poleceń, zmiany składni pod tobą itp.).COME FROM
Stwierdzenie ma również efekt uboczny, nawet jeśli nie rzeczywisteCOME FROM
dzieje, tworząc przeciążenie operandu od.1
celu#1
, gdy linia z numerem linii jest wykonywana; jest to wykorzystywane później przy tworzeniu wyniku 21. (Losowe globalne skutki uboczne są dość idiomatyczne w INTERCAL).Innym wyjątkiem jest wejście
ONE TWO NINE
. W programie nie ma numeru linii(129)
, więc otrzymujemy błąd dotyczący brakującego numeru linii, czyliICL129I
. Nie musiałem więc pisać żadnego kodu, by w ogóle opisać tę sprawę.Oto inne błędy i ich przyczyny:
NEXT
przepełnieniem stosu (DO (123) NEXT
).NEXT
Oświadczenie potrzebuje innych modyfikatorów (FORGET
lubRESUME
), aby z mocą wsteczną ustalenia, jakiego rodzaju instrukcji sterującej było. Brak tych przyczyn powoduje błąd ICL123I, gdy pojawi się 80 nierozwiązanych instrukcji `NEXT.DO STASH .2
wCOME FROM
pętli). Skrytki są ograniczone tylko dostępną pamięcią, ale ostatecznie się skończy, powodując błąd ICL222I.DO ,1 <- #0
oznacza i powoduje błąd ICL240I.,1
nie został przydzielony (,
służy do zmiennych typu tablicowego w INTERCAL), więc indeksowanie powoduje błąd ICL241I.#256 $ #0
) zmiennej 16-bitowej.2
. Nie pasuje, powodując błąd ICL275I.#2
do.1
. Może to wyglądać na dość proste przypisanie, ale przeciążaliśmy.1
to, co#1
wcześniej, i próba zmiany wartości 1 bez-v
opcji w wierszu poleceń powoduje błąd ICL277I.GO BACK
), który nie istnieje w tym momencie w programie (nie uruchomiliśmy żadnych poleceń w celu manipulowania stosem wyboru punktów, więc nadal jest pusty). To powoduje błąd ICL404I.RETRIEVE .2
z nieistniejącej skrytki (ponieważ nie ukryliśmy niczego w tej gałęzi programu), powodując błąd ICL436I.WRITE IN
) na zawsze wCOME FROM
pętli. W końcu skończymy czytać poza EOF, powodując błąd ICL562I.DO RESUME #0
, która jest pozbawiona znaczenia i szczegółowo udokumentowana jako powodująca błąd (ICL621I).DO RESUME #9
. Nie uruchomiliśmy jeszcze tak wieluNEXT
instrukcji, dlatego otrzymujemy błąd ICL120I. (Intrygujące jest to, że ten konkretny błąd jest zdefiniowany w dokumentacji INTERCAL jako normalne wyjście z programu, a następnie spowodowanie błędu, zamiast wyjścia z programu z błędem. Nie sądzę jednak, aby te dwa przypadki były zauważalnie różne.)Weryfikacja
Niektóre błędy obejmują celowe uruchamianie programu z pamięci, dlatego sugeruję ustawienie dość małych limitów pamięci. Oto polecenie powłoki, którego użyłem do przetestowania programu (z nowymi wierszami dodanymi dla czytelności; usuń je, jeśli sam go uruchomisz):
A oto wynik (z numerami wierszy i komunikatami „PROSZĘ PRAWIDŁOWE ŹRÓDŁO” usunięty, aby zaoszczędzić miejsce), który dodałem częściowo, aby zademonstrować działanie programu, ale głównie, aby pokazać głupie komunikaty o błędach INTERCAL:
źródło
Perl, 108 bajtów, 256 kodów wyjścia
Ten program (ab) używa modułu Test :: More . Próbuje otworzyć plik o nazwie
""
n razy, gdzie n podano jako argument wiersza poleceń. Nie udaje się za każdym razem, a każde wywołanie jest traktowane jako test. Test :: Więcej zwracana liczba nieudanych testów jako kod wyjścia.plan tests => $ARGV[0]%255
jest potrzebny, aby uzyskać kod wyjścia 255.źródło
perl -MTest::More -e'plan tests,$%%255if$%=<>;ok 0for 1..$%'
51 bajtów (38 bajtów + 13 bajtów na-MTest::More<space>
). Pobiera dane wejściowe na standardowe wejście.C90 (gcc), 256 kodów wyjścia,
282718 bajtówNie jestem pewien, czy to jest mądry lub cheaty, ale nie sądzę, że narusza zasady jak napisano: to technicznie nie używa
exit
,return
albo jakiś błąd mechanizmu rzucanie, ale po prostu opiera się na zachowanie niezdefiniowane i fakt, że gcc robi coś raczej wygodnego, jeśli chodzi o to wyzwanie.Wypróbuj online!
Jak to działa
Służy to po prostu
getchar
odczytaniu jednego bajtu ze STDIN. Samo to nic nie robi.Jednak zgodny program C90 musi kończyć się
return
instrukcją lub czymś równoważnym; wszystko inne jest nieokreślonym zachowaniem. gcc i tak kończy wygenerowany zestawret
, więc niezależnie od tego, jaka wartość była przypadkowo w rejestrze, EAX zwróci program. Na szczęście glibcgetchar
przechowuje bajt, który odczytuje ze STDIN w EAX, więc wartość tego bajtu jest kodem wyjścia naszego programu.źródło
set -o fullexitcode
.return
lubexit
jest błędem w zakresie, w jakim idzie standard C90, i powoduje kod wyjścia, który wskazuje na awarię. To wszystko, co krach robi na sercu.C (gcc) pod powłoką bash na x86, 230 bajtów, 8 kodów wyjścia
Dodano nowe linie, aby poprawić czytelność. Komentarze zignorowane w wyniku.
Cechą powłoki bash:
Więc wszystko, co musimy zrobić, to uruchomić różne sygnały z programu AC. W tym momencie zakładam, że po prostu robienie
kill(n-128);
jest zabronione. Zamiast tego wykonujemy kod, który wyzwala różne sygnały, co powoduje udostępnienie odpowiednich kodów błędów w powłoce wywołującej.Kody wyjścia to 0, 130, 133, 134, 136, 139, 141, 142.
Wypróbuj online . Rozwiń sekcję „Debugowanie”, aby wyświetlić kod powrotu.
Z pewnością można pograć w golfa głębiej. Ale bardziej chciałbym dodać więcej sygnałów.
źródło
__asm("UD2")
uruchamia „niezdefiniowaną instrukcję” x86, która spowoduje wyjątek CPU, który zostanie przekazany przez jądro do programu w postaci sygnału SIGILL. Nasocketpair
przykład, SIGPIPE zostanie wysłany przez jądro lub glibc, gdy próbujemy dostać sięwrite()
do potoku, który byłclose()
d na drugim końcu.int3
i nieint $3
i 2) jeden znak, jeśli zadeklarujeszv
jakoint**
, biorąc pod uwagę, że zasadniczo nie polegasz nachar
-ości typu danych w arytmetyce wskaźnika, plus 3) dwa znaki, jeśli używasz*p
zamiastp[0]
, lub 4) sześciu znaków, jeśli jesteś gotów polegać na przewidywalnychfd
liczb zwracanych przez wszystkie syscalli które je tworzą, i zastąpićp[0]
ip[1]
ich bliskich pewnych wartości. Wreszciepipe(fd)
jest znacznie krótszy niżsocketpair(...)
i generuje ten sam błąd podczas zamykaniafd[0]
i pisania do.fd[1]
.&63
zamiast-128
. 2) Wymienićsleep(2)
zfor(;;)
. 3) Wymienićc=*(int*)c
zatoi(0)
. 4) Wymienićc/=c-2
zc/=0
.Python 2, 13 bajtów, 2 kody wyjścia
Jeśli wpiszesz 0, spróbuje wydrukować wartość
1/-1
-1, co jest w porządku, więc wyjdź z kodu 0. Jeśli wpiszesz 1, dostaniesz to,1/0
co podnosiZeroDivisionError
kod, w którym znajduje się kod wyjścia 1. W moim IDE jest tylko 0 i 1 dla kodów wyjścia ...Wyjścia:
źródło
PHP, 15 bajtów, 2 kody wyjścia
Bez
die
/exit
PHP nie może zwrócić niczego oprócz0
lub255
(afaik; prawdopodobnie~1
), więc ...Jeśli argument wiersza poleceń jest fałszywy, ocenia
1
i kończy działanie za pomocą0
. Jeśli nie, próbuje wywołać funkcję i kończy działanie przy pomocy<b>Fatal error</b>: Uncaught Error: Call to undefined function p()
.Uruchom z
-r
.źródło
exit()
ustawia status wyjścia ... którego nie można użyć do tego wyzwania, przyznane. Ale twój kod jest również nieprawidłowy. Ustawia status wyjścia na 2551
. Szukałem listy kodów wyjścia, ale nie mogłem jej znaleźć.Excel VBA,
414514 533 + 3 bajty, 14 kodów wyjściaStaje jako wejście
Conditional Compilation Argument
,n=[input value]
a produkuje kod błędu związanego ta liczba jest.+3 za
n=[Value]
warunkowe wywołanie kompilacjiObsługuje dane wejściowe gdzie
n=
Uwaga: VBA nie ma kodów wyjścia
0
ani1
. Włączyłem rozwiązania dla3
i5
, które są dwoma kodami wyjścia o najniższym numerze dostępnymi dla VBA na ich miejscuźródło
#
tu robi?#if
I#ElseIf
są uzależnione kompilacji oświadczenia oznacza, że oświadczenia, które po nim następują dopiero opracowywane, jeżeli warunek jest spełniony#
, gdzie byłyby one kompilowane niezależnie od tego, czy instrukcje są prawdziwe? Wiem, jakIf
działają oświadczenia, ale jestem nowy w tym, co naprawdę kompiluje , więc przepraszam za tak proste pytanie.#if
stosuje się zamiastIf
lubSelect Case
ponieważ wtruthy
rzeczywistości kompilowane są tylko instrukcje warunkowe. W tym przypadku konkretnie, to powstrzymuje program od wychodzenia z kodem błędu3
,Return without GoSub
na każdym wykonaniu, ale raczej tylko wychodzenia z tego kodu, kiedyn=3
Turtlèd, 4 bajty, 2 kody wyjścia
Nie wiem, czy są jakieś sposoby, aby uzyskać więcej kodów wyjściowych ... czy są jeszcze inne sposoby w języku tłumacza
Znalazłem kilka czterech długich odpowiedzi
Wypróbuj online!
Wypróbuj online!
Wypróbuj online!
Jak te działają:
w moim tłumaczu jest funkcja
błędu,która powoduje błędy, gdy siatka w pamięci ma więcej niż jedną linię i nie ma w niej znaków spacji. ten program usuwa * z komórki początkowej'[space]
, przyjmuje nieujemną liczbę całkowitą?
(naprawdę 0 lub 1) i przesuwa się w dół o tyle;
, jeśli jest zero, siatka będzie miała tylko jedną linię i nie będzie błędu, w przeciwnym razie przesunie się w dół i wystąpi błądnawiasy i inne elementy nie są analizowane, po prostu są wykonywane w czasie wykonywania, co oznacza: „przejdź do pasujących paren, jeśli symbol komórki jest nieprawidłowy”. w tym programie wpisanie (
!
) powoduje, że program zapisze go w komórce (.
), uruchom paren, który sprawdzi, czy symbol komórki to 0, spróbuj przejść do pasujących paren, ale zamiast tego wyrzuć błąd, ponieważ nie ma żadnego . jeśli wynosi zero, zapisuje to, sprawdza nawiasy, znajduje się na 0, a następnie ignoruje i program kończyzawiera elementy poprzedniej odpowiedzi i pierwszej. pobiera nieujemną liczbę całkowitą, przesuwa się w dół o tyle i sprawdza, czy komórka to „*”, szukając nieistniejących dodatkowych paren, jeśli tak nie jest. jeśli dane wejściowe to 1, odejdzie od miejsca początkowego i znajdzie komórkę jako spację, a błąd, jeśli wynosi zero, pozostanie na polu początkowym i zignoruje paren.
źródło
JavaScript (węzeł), 19 bajtów, 2 kody wyjścia
Pełny program:
Funkcjonować:
process.argv
to tablica zawierająca ścieżkę do pliku wykonywalnego węzła, ścieżkę do pliku javascript i argumenty wiersza poleceń. W tym przypadku będzie to albo"1"
albo"0"
. Ciąg jest konwertowany na liczbę za pomocą jednoargumentowego+
operatora. Jeśli liczba jest równa zero, leniwy&&
operator nie oceni prawej strony, jeśli liczba jest prawdziwa (nie zero), prawa strona&&
jest oceniana i zgłaszany jest błąd, ponieważ odwołuje się do niezdefiniowanej zmiennej, a program istnieje z kodem wyjścia 1.Funkcja oczekuje danych wejściowych jako liczby. Jeśli dane wejściowe są zgodne z prawdą, funkcja wywołuje się sama i powoduje awarię środowiska wykonawczego węzła z przepełnieniem stosu. Jeśli wartością wejściową jest 0, leniwy
&&
operator zwraca 0 bez oceny prawej strony.źródło
+process.argv[2]&&a
.ReferenceError.prototype.name=process.argv[2]?a:0
ważne?Perl 6 , 57 bajtów, 256 kodów wyjścia
Spróbuj
To jest tłumaczenie przykładu Perla 5.
Rozszerzony
źródło
Scala, 19 bajtów, 2 kody wyjścia
if(args(0)=="1")1/0
1/(args(0).toInt-1)
JVM obsługuje tylko 1 i 0 jako kody wyjścia, jeśli nie dzwonisz
System.exit
.Pierwszy program próbuje obliczyć,
1/0
czy pierwszym argumentem jest1
, co spowoduje awarię JVM z kodem wyjścia 1. Jeśli argument ma wartość 0, zakończy się powodzeniem.Drugi program konwertujący argument na liczbę całkowitą odejmuje jeden i próbuje podzielić 1 przez tę liczbę. Jeśli argument jeśli 1, to oblicza
1/0
, więc JVM ulegnie awarii; jeśli argument wynosi 0, oblicza1/-1
i kończy działanie.źródło
Python 3 , 15 bajtów, 2 kody wyjścia
Oczywiście jest to dłuższe niż rozwiązanie Python 2 , ponieważ w Python 3 nie możemy brać dosłownego wejścia bez wywołania
eval
. Możemy jednak ciekawie zastosować techniki porównywania strun ...Dane wejściowe będą ciągiem znaków
0
lub1
- jeśli jest to 1, warunek jest oceniany na 0 (fałsz), co powoduje próbę obliczenia,1 / 0
która w oczywisty sposób ulega awarii (kod wyjścia 1). W przeciwnym razie nic się nie dzieje, a Python kończy działanie ze zwykłym kodem wyjścia 0.O ile mi wiadomo, Python nie jest w stanie zawiesić się z innymi kodami wyjścia.
źródło
Java,
7166 bajtów, 2 kody wyjścia4 bajty zapisane dzięki Holger
Pełny program:
Funkcja przyjmująca int jako argument:
Program pobiera pierwszy znak pierwszego argumentu (albo
'0'
albo'1'
i odejmuje 48 (wartość ascii'0'
), aby uzyskać liczbę całkowitą (0 lub 1). Następnie próbuje ustawić argument w miejscu tej liczby całkowitej na pusty ciąg znaków. dane wejściowe to 1, program ulega awarii zArrayIndexOutOfBoundsException
, ponieważ tablica argumentów ma tylko jeden element na pozycji 0 (indeksowany od zera).źródło
a[a[0].equals("1")?1/0:1]="";
, który jest na równi zint x=a[0].equals("1")?1/0:1;
. Ale dalsza zmiana programu, aby sprowokowaćArrayIndexOutOfBoundsException
zamiastArithmeticException
oszczędzić kilka bajtów:interface I{static void main(String[]a){a[a[0].charAt(0)-'0']="";}}
Python 2, 11 bajtów, 2 kody wyjścia
Trzy różne 11-bajtowe rozwiązania dla trzech różnych błędów! (Dla zabawy, nie daje to punktów.) Domyślnie Python ma tylko kody wyjścia 0 dla pomyślnego wyjścia i 1 dla błędu. Pomyślne przebiegi niczego nie generują.
Na wejściu 1 podaje „ValueError: ujemna liczba przesunięć”. Na wejściu 0 liczenie przesunięcia zera kończy się powodzeniem i daje 1.
Na wejściu 1 podaje „ZeroDivisionError: dzielenie liczb całkowitych lub modulo przez zero”, ponieważ
~-input()
akainput()-1
wynosi 0. Na wejściu 11/-1
daje -1.0**-input()
też by działał.Na wejściu 1 podaje „NameError: nazwa„ x ”nie jest zdefiniowana”. Na wejściu 0 te pierwsze nierówności
0<0
są oceniane na Fałsz, więc reszta nie jest oceniana, a wynik jest po prostu Fałsz.źródło
Node.js (ES6), 77 bajtów, 2 kody wyjścia
źródło
Galaretka , 4 kody wyjścia, 18 bajtów
Obsługuje kody wyjścia 0 , 1 , 137 (zabity) i 139 (błąd segmentacji).
Wypróbuj online!
Jak to działa
źródło
SmileBASIC, 640 bajtów, 39 kodów wyjścia (spośród 52)
Można to zdecydowanie skrócić. SB ma tylko kody błędów od 0 do 51, a niektóre są niemożliwe do wyzwolenia.
źródło
ZX81 BASIC> 255 kodów wyjścia - 52 bajty (lista)
Technicznie rzecz biorąc,
N
może być dowolną 24-bitową liczbą zmiennoprzecinkową w zakresie, ale przyjmiemy tutaj liczby całkowite. Wiersz 2 jest równoważny,IF N>0 AND N <=255 THEN GOTO 3: ELSE GOTO 1
jeśli ZX81 BASIC miałIF/ELSE
w swoich symbolicznych instrukcjach.źródło
the program caused some fatal unintended exception
? To po prostu drukuje trochę tekstu i kończy wykonywanie.RAND USR N
spowoduje niezamierzone efekty, ponieważ wywołanie części pamięci ROM z nieoczekiwanego miejsca nie jest dobrym pomysłem, dlategoRAND USR 0
zostało wykluczone, ponieważ jest to zbyt wdzięczne.LD BC, 0000 RST 10 RET
przy 0x1000, ale wywoływanąRAND USR 4097
, przegapisz operand LD, a zatem kod maszynowy zostanie wypaczony. Nie pamiętam wszystkich wywołań ROM, ale opracuję wszystkie legalne / pełne wdzięku cele i wykluczę je później.