Wyjdź z gry w golfa


55

Zainspirowany tym domyślnym dla IO .

Zadanie

Napisz program, który przy wejściowej liczbie całkowitej xod 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 z mainitp.). 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!


Żeby wyjaśnić, jeśli zgłoszę błąd, jest to nielegalne tak?
Anthony Pham

@AnthonyPham Jeśli podbijesz go bezpośrednio ( 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.
Addison Crump

@VoteToClose Chyba nie byłem wystarczająco jasny. Zgadzam się z tobą, ale sugerowałem, powiedzmy kwadrat, zamiast silni. Ale cokolwiek, to tak naprawdę nie ma znaczenia, było tylko sugestią
Maltysen

8
Czy akceptowanie danych wejściowych jako literowych cyfr angielskich (np. one zero zeroDla 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.

5
Uważam Exit Code Golfing za tytuł przynęty na kliknięcie, choć jest on dokładny. <(° _ ° <)
RaisingAgent

Odpowiedzi:


48

Unix Shell (+ ncurses + narzędzia BSD), 36, 26 bajtów, 256 kodów wyjścia

Grał w golfa

jot -bu0 $[252+$1]|tput -S

Jeśli użyto opcji -S, tput sprawdza błędy z każdej linii, a jeśli zostaną znalezione jakiekolwiek błędy, ustawi kod wyjścia na 4 plus liczbę linii z błędami. Jeśli nie zostaną znalezione żadne błędy, kod wyjścia wynosi 0. Nie można podać, która linia uległa awarii, więc kod wyjścia 1 nigdy się nie pojawi. Kody wyjścia 2, 3 i 4 zachowują swoją zwykłą interpretację.

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 jotdostępny, możesz użyć nieco dłuższej (29 bajtów) wersji:

yes u0|sed $[252+$1]q|tput -S

Wypróbuj online! (wersja 29 bajtów)


Wow, to całkiem nieźle. +1
Addison Crump

45

Bash 4.2 + dodatki, 24 kody wyjścia

grep \#$1$ $0|sed 's:#.*::;s:T:tcc -run -<<<main=:;s:C:curl -L x.org/! :'|sh;exit
man#1
C-#2
C/#3
sed#4
C-x/#5
C_#6
C0#7
man /#16
C-f#22
C-o/#23
C-L3#35
C--capath /#60
C--max-filesize 1#63
C--cacert /#77
timeout 1e-9 w#124
/#126
-#127
T6\;#132
T204\;#133
$[2**63%-1]#136
{0..1000000000}#137
T0\;#139
exit _#255

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.

$ for n in {0..255}; do bash exit.sh $n; (($? == $n)) && echo $n >&0; done &> /dev/null
0
1
2
3
4
6
7
16
22
23
35
60
63
77
124
126
127
132
133
136
137
139
255

1
Kod wyjścia 5:http_proxy=fafa curl http://example.org
el.pescado

1
@ el.pescado Zajęło mi to ponad rok, ale w końcu zrealizowałem twoją sugestię. Dziękuję Ci!
Dennis

30

INTERCAL (C-INTERCAL), 15 kodów, 313 + 2 = 315 bajtów

        PLEASE WRITE IN .1
(8)     PLEASE CREATE .1 A
        PLEASE A
        PLEASE COME FROM #2$!1/#1'

        DO X
(123)   DO (123) NEXT
        DO COME FROM (222)
(222)   DO STASH .2
(240)   DO ,1 <- #0
(241)   DO ,1 SUB #0 <- #1
(19)    DO .2 <- #256 $ #0
(21)    DO .1 <- #2
(148)   DO GO BACK
(180)   DO RETRIEVE .2
        DO COME FROM (50)
(50)    DO WRITE IN .2
(109)   DO RESUME #0
(120)   DO RESUME #9
        MAYBE COME FROM (223)
(223)   DO COME FROM (223)
(121)   PLEASE NOT X

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ż -bjest wymagana, aby kompilator był deterministyczny).

Jak zwykle w przypadku INTERCAL, wymaga to wprowadzania danych liczbowych w formacie, np . ONE TWO THREEDla 123.

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żywamy CREATEinstrukcji 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ą Ainstrukcję, 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 dane ZERO, przeskakujemy z drugiego wiersza (numerowanego (8)) do czwartego wiersza za pomocą COME FROMinstrukcji obliczeniowej . To następnie przechodzi w błąd składniowy DO X, który powoduje błąd ICL000I. (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 FROMStwierdzenie ma również efekt uboczny, nawet jeśli nie rzeczywiste COME FROMdzieje, tworząc przeciążenie operandu od .1celu #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, czyli ICL129I. Nie musiałem więc pisać żadnego kodu, by w ogóle opisać tę sprawę.

Oto inne błędy i ich przyczyny:

  • 123 jest NEXTprzepełnieniem stosu ( DO (123) NEXT). NEXTOświadczenie potrzebuje innych modyfikatorów ( FORGETlub RESUME), 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.
  • 222 jest przepełnieniem skrytki ( DO STASH .2w COME FROMpętli). Skrytki są ograniczone tylko dostępną pamięcią, ale ostatecznie się skończy, powodując błąd ICL222I.
  • 240 to wymiary tablicy do rozmiaru zero. Dokładnie to DO ,1 <- #0oznacza i powoduje błąd ICL240I.
  • 241 jest spowodowane przez przypisywanie poza granicami tablicy. W tym przypadku ,1nie został przydzielony ( ,służy do zmiennych typu tablicowego w INTERCAL), więc indeksowanie powoduje błąd ICL241I.
  • 19 przypisuje 65536 ( #256 $ #0) zmiennej 16-bitowej .2. Nie pasuje, powodując błąd ICL275I.
  • 21 przypisuje #2do .1. Może to wyglądać na dość proste przypisanie, ale przeciążaliśmy .1to, co #1wcześniej, i próba zmiany wartości 1 bez -vopcji w wierszu poleceń powoduje błąd ICL277I.
  • 148 próbuje wrócić do górnego wpisu stosu wyboru punktów ( 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.
  • 180 prób RETRIEVE .2z nieistniejącej skrytki (ponieważ nie ukryliśmy niczego w tej gałęzi programu), powodując błąd ICL436I.
  • 50 żądań input ( WRITE IN) na zawsze w COME FROMpętli. W końcu skończymy czytać poza EOF, powodując błąd ICL562I.
  • 109 uruchamia instrukcję DO RESUME #0, która jest pozbawiona znaczenia i szczegółowo udokumentowana jako powodująca błąd (ICL621I).
  • 120 uruchamia instrukcję DO RESUME #9. Nie uruchomiliśmy jeszcze tak wielu NEXTinstrukcji, 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.)
  • 223 jest w zasadzie złożoną plątaniną prymitywów wielowątkowych, które wszystkie wskazują z powrotem na linię 223, powodując nieskończoną pętlę, która wysadza pamięć. Ostatecznie wyczerpuje się pamięć w podsystemie wielowątkowym, co prowadzi do błędu ICL991I.
  • 121 jest w rzeczywistości prawidłową instrukcją (jest to komentarz), ale pojawia się na końcu programu. W związku z tym wykonanie spada z końca programu natychmiast po jego uruchomieniu, powodując błąd ICL633I.

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):

for x in "ZERO" "ONE NINE" "TWO ONE" "FIVE ZERO" "ONE ZERO NINE"
         "ONE TWO ZERO" "ONE TWO ONE" "ONE TWO THREE" "ONE TWO NINE"
         "ONE FOUR EIGHT" "ONE EIGHT ZERO" "TWO TWO TWO"
         "TWO TWO THREE" "TWO FOUR ZERO" "TWO FOUR ONE";
do  echo;
    echo $x;
    echo $x | (ulimit -Sd 40000; ulimit -Sv 40000; ulimit -Ss 40000;
               ./errors; echo $?);
done

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:

ZERO
ICL000I PLEASEWRITEIN.1(8)PLEASECREATE.1APLEASEAPLEASECOMEFROM#2$!1/#1'DOX(123)DO(123)NEXTDOCOMEFROM(222)(222)DOSTASH.2(240)DO,1<-#0(241)DO,1SUB#0<-#1(19)DO.2<-#256$#0(21)DO.1<-#2(148)DOGOBACK(180)DORETRIEVE.2DOCOMEFROM(50)(50)DOWRITEIN.2(109)DORESUME#0(120)DORESUME#9MAYBECOMEFROM(223)(223)DOCOMEFROM(223)(121)PLEASENOTX
0

ONE NINE
ICL275I DON'T BYTE OFF MORE THAN YOU CAN CHEW
19

TWO ONE
ICL277I YOU CAN ONLY DISTORT THE LAWS OF MATHEMATICS SO FAR
21

FIVE ZERO
ICL562I I DO NOT COMPUTE
50

ONE ZERO NINE
ICL621I ERROR TYPE 621 ENCOUNTERED
109

ONE TWO ZERO
ICL632I THE NEXT STACK RUPTURES.  ALL DIE.  OH, THE EMBARRASSMENT!
120

ONE TWO ONE
ICL633I PROGRAM FELL OFF THE EDGE
121

ONE TWO THREE
ICL123I PROGRAM HAS DISAPPEARED INTO THE BLACK LAGOON
123

ONE TWO NINE
ICL129I PROGRAM HAS GOTTEN LOST
129

ONE FOUR EIGHT
ICL404I I'M ALL OUT OF CHOICES!
148

ONE EIGHT ZERO
ICL436I THROW STICK BEFORE RETRIEVING!
180

TWO TWO TWO
ICL222I BUMMER, DUDE!
222

TWO TWO THREE
ICL991I YOU HAVE TOO MUCH ROPE TO HANG YOURSELF
223

TWO FOUR ZERO
ICL240I ERROR HANDLER PRINTED SNIDE REMARK
240

TWO FOUR ONE
ICL241I VARIABLES MAY NOT BE STORED IN WEST HYPERSPACE
241

4
To prawdopodobnie największy program INTERCAL, jaki kiedykolwiek widziałem.
Skyler

27

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]%255jest potrzebny, aby uzyskać kod wyjścia 255.

#!/usr/bin/perl
use Test::More;
plan tests => $ARGV[0]%255 if($ARGV[0]>0);
ok(open(F,"")) for (1..$ARGV[0])

Gra w golfa: 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.
ThisSuitIsBlackNot

27

C90 (gcc), 256 kodów wyjścia, 28 27 18 bajtów

main(){getchar();}

Nie jestem pewien, czy to jest mądry lub cheaty, ale nie sądzę, że narusza zasady jak napisano: to technicznie nie używa exit, returnalbo 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 getcharodczytaniu jednego bajtu ze STDIN. Samo to nic nie robi.

Jednak zgodny program C90 musi kończyć się returninstrukcją lub czymś równoważnym; wszystko inne jest nieokreślonym zachowaniem. gcc i tak kończy wygenerowany zestaw ret, więc niezależnie od tego, jaka wartość była przypadkowo w rejestrze, EAX zwróci program. Na szczęście glibc getcharprzechowuje bajt, który odczytuje ze STDIN w EAX, więc wartość tego bajtu jest kodem wyjścia naszego programu.


Ciekawie byłoby sprawdzić, czy można to zmodyfikować, aby przełamać 8-bitową barierę, używając powłoki takiej jak jsh , która obsługuje set -o fullexitcode.
zeppelin

1
To sprytne. Ale program tak naprawdę nie ulega awarii. Zwraca normalnie, czy specyfikacja ma „spowodować śmiertelny wyjątek / nieodwracalną awarię / awarię”
dim

Tak czy inaczej, to jest niesamowite.
Quentin,

4
@dim Myślę, że to zależy od twojej definicji awarii. Nie kończenie głównego na returnlub exitjest 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.
Dennis

Awaria to program, który przestaje działać poprawnie. Twój program wykonuje wszystko, co powiedziałeś, aby zrobić poprawnie, odczytuje jeden znak z wejścia, a następnie zatrzymuje się. Więc nawet jeśli kod zakończenia wskazuje błąd, nie zawiesił się.
findusl

19

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.

main(int c, char **v){
int p[2];
switch(atoi(v[1])-128){
case 2:__asm("UD2");        /* SIGILL: x86 undefined instruction */
case 5:__asm("int $3");     /* SIGTRAP: x86 breakpoint instruction */
case 6:abort();             /* SIGABRT: raise() is called under the covers */
case 8:c/=c-2;              /* SIGFPE: divide by 0 (c-2) */
case 11:c=*(int *)c;        /* SIGSEGV: dereference of invalid pointer */
                            /* SIGPIPE: write() to a pipe closed at the other end */
case 13:socketpair(1,1,0,p);close(p[1]);write(p[0],v,1);
case 14:alarm(1);sleep(2);  /* SIGALRM: kernel will send alarm signal after 1 sec */
}
}

Cechą powłoki bash:

Kiedy polecenie kończy się na fatalnym sygnale N, bash używa wartości 128 + N jako statusu wyjścia.

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.


Czy słusznie byłoby założyć, że sygnały są powodowane poza twoim kodem przez wcześniej istniejące funkcje lub operacje?
Addison Crump

1
@VoteToClose tak, zgadza się. Na przykład __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. Na socketpairprzykł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.
Cyfrowy uraz

1
Więc nie mam z tym problemu. : P
Addison Crump

1
Możesz zagrać w golfa 1) dwa znaki, jeśli używasz int3i nie int $3i 2) jeden znak, jeśli zadeklarujesz vjako int**, biorąc pod uwagę, że zasadniczo nie polegasz na char-ości typu danych w arytmetyce wskaźnika, plus 3) dwa znaki, jeśli używasz *pzamiast p[0], lub 4) sześciu znaków, jeśli jesteś gotów polegać na przewidywalnych fdliczb zwracanych przez wszystkie syscalli które je tworzą, i zastąpić p[0]i p[1]ich bliskich pewnych wartości. Wreszcie pipe(fd)jest znacznie krótszy niż socketpair(...)i generuje ten sam błąd podczas zamykania fd[0]i pisania do. fd[1].
Nie będę istniał Idonotexist

2
Kilka dodatkowych propozycji gry w golfa: 1) Użyj &63zamiast -128. 2) Wymienić sleep(2)z for(;;). 3) Wymienić c=*(int*)cz atoi(0). 4) Wymienić c/=c-2z c/=0.
nwellnhof

10

Python 2, 13 bajtów, 2 kody wyjścia

1/(input()-1)

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/0co podnosi ZeroDivisionErrorkod, w którym znajduje się kod wyjścia 1. W moim IDE jest tylko 0 i 1 dla kodów wyjścia ...

Wyjścia:


wprowadź opis zdjęcia tutaj


wprowadź opis zdjęcia tutaj


10

PHP, 15 bajtów, 2 kody wyjścia

Bez die/ exitPHP nie może zwrócić niczego oprócz 0lub 255(afaik; prawdopodobnie ~1), więc ...

!$argv[1]?:p();

Jeśli argument wiersza poleceń jest fałszywy, ocenia 1i 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.


5
To nieprawda. 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 255
aross

@aross: Hmm Zawsze zakładałem, że błąd zniknie 1. Szukałem listy kodów wyjścia, ale nie mogłem jej znaleźć.
Tytus

10

Excel VBA, 414 514 533 + 3 bajty, 14 kodów wyjścia

Staje jako wejście Conditional Compilation Argument, n=[input value]a produkuje kod błędu związanego ta liczba jest.

Sub e()
Dim a As Application, b As Byte, s As String, v(), x
Set a=Application
#If n=3 Then
Return
#ElseIf n=5 Then
b=a.CommandBars("")
#ElseIf n=6 Then
b=2^8
#ElseIf n=7 Then
ReDim v(9^9)
#ElseIf n=9 Then
v=Sheets("")
#ElseIf n=10 Then
v=Array(1)
For Each x In v
ReDim v(9)
Next
#ElseIf n=11 Then
b=1/0
#ElseIf n=13 Then
Debug.?Int("X")
#ElseIf n=14 Then
Debug.?String(9E8,1)
#ElseIf n=20 Then
Resume
#ElseIf n=28 Then
f 256
#ElseIf n=35 Then
Call c
#ElseIf n=92 Then
For Each x In v
ReDim v(9)
Next
#ElseIf n=94 Then
b=Null
#End If
End Sub

Sub f(n):DoEvents:f n-1:End Sub

+3 za n=[Value]warunkowe wywołanie kompilacji

Obsługuje dane wejściowe gdzie n=

3
5
6
7
9
10
11
13
14
20
28
35
92
94    

Uwaga: VBA nie ma kodów wyjścia 0ani 1. Włączyłem rozwiązania dla 3i 5, które są dwoma kodami wyjścia o najniższym numerze dostępnymi dla VBA na ich miejscu


1
Nie odmówię tej odpowiedzi, ponieważ jest to dla mnie równoznaczne z niedozwoleniem z powodu możliwości językowych dla typów danych wyjściowych.
Addison Crump

1
Co #tu robi?
BruceWayne,

#ifI #ElseIfsą uzależnione kompilacji oświadczenia oznacza, że oświadczenia, które po nim następują dopiero opracowywane, jeżeli warunek jest spełniony
Taylor Scott

1
Więc jeśli nie są prawdziwe, instrukcje nie są kompilowane ... to jest inne niż nieużywanie #, gdzie byłyby one kompilowane niezależnie od tego, czy instrukcje są prawdziwe? Wiem, jak Ifdziałają oświadczenia, ale jestem nowy w tym, co naprawdę kompiluje , więc przepraszam za tak proste pytanie.
BruceWayne

1
@BruceWayne, tak, dokładnie tak jest. Ponieważ wiersze te są zaprojektowane do generowania określonych błędów, konieczne jest, aby w danym momencie były kompilowane tylko wiersze, które generują pożądany kod błędu. W tym celu #ifstosuje się zamiast Iflub Select Caseponieważ w truthyrzeczywistości kompilowane są tylko instrukcje warunkowe. W tym przypadku konkretnie, to powstrzymuje program od wychodzenia z kodem błędu 3, Return without GoSubna każdym wykonaniu, ale raczej tylko wychodzenia z tego kodu, kiedyn=3
Taylor Scott

7

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!

!.(0

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łąd

!.(0

nawiasy 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ńczy

?;(*

zawiera 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.


7

JavaScript (węzeł), 19 bajtów, 2 kody wyjścia

Pełny program:

+process.argv[2]&&a

Funkcjonować:

f=i=>i&&f(i)

process.argvto 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.


@VoteToClose Zmieniono go na niezdefiniowaną zmienną
corvus_192

To działa. : P
Addison Crump

Pełny program można skrócić +process.argv[2]&&a.
user2428118

@ user2428118 Masz rację
corvus_192

Czy z ciekawości byłoby ReferenceError.prototype.name=process.argv[2]?a:0ważne?
Patrick Roberts,

6

Perl 6 , 57 bajtów, 256 kodów wyjścia

use Test;plan $_=@*ARGS[0];ok try {open ""} for ^($_%255)

Spróbuj
To jest tłumaczenie przykładu Perla 5.

Rozszerzony

use Test;  # bring in 「plan」 and 「ok」

plan $_ = @*ARGS[0]; # plan on having the input number of tests
                     # only actually needed for the 255 case
                     # if the plan is greater than the number of tests
                     # it fails with exitcode 255


  ok                 # increment the failure counter if the following is False
    try {            # don't let this kill the whole program
      open ""        # fails to open a file
    }

for                  # repeatedly do that

  ^(                 # upto Range
    $_ % 255         # either the input number of times, or 0 times for 255
  )

5

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/0czy pierwszym argumentem jest 1, 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, oblicza 1/-1i kończy działanie.


5

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 ...

1/(input()<'1')

Dane wejściowe będą ciągiem znaków 0lub 1- jeśli jest to 1, warunek jest oceniany na 0 (fałsz), co powoduje próbę obliczenia, 1 / 0któ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.


5

Java, 71 66 bajtów, 2 kody wyjścia

4 bajty zapisane dzięki Holger

Pełny program:

interface I{static void main(String[]a){a[a[0].charAt(0)-48]="";}}

Funkcja przyjmująca int jako argument:

i->1/(i-1)

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 z ArrayIndexOutOfBoundsException, ponieważ tablica argumentów ma tylko jeden element na pozycji 0 (indeksowany od zera).


Możesz przypisać wartość lub użyć jej w inny sposób, np. Jako indeks tablicy a[a[0].equals("1")?1/0:1]="";, który jest na równi z int x=a[0].equals("1")?1/0:1;. Ale dalsza zmiana programu, aby sprowokować ArrayIndexOutOfBoundsExceptionzamiast ArithmeticExceptionoszczędzić kilka bajtów:interface I{static void main(String[]a){a[a[0].charAt(0)-'0']="";}}
Holger

4

Python 2, 11 bajtów, 2 kody wyjścia

1>>-input()
1/~-input()
0<input()<x

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ą.

 1>>-input()

Na wejściu 1 podaje „ValueError: ujemna liczba przesunięć”. Na wejściu 0 liczenie przesunięcia zera kończy się powodzeniem i daje 1.

1/~-input()

Na wejściu 1 podaje „ZeroDivisionError: dzielenie liczb całkowitych lub modulo przez zero”, ponieważ ~-input()aka input()-1wynosi 0. Na wejściu 1 1/-1daje -1. 0**-input()też by działał.

0<input()<x

Na wejściu 1 podaje „NameError: nazwa„ x ”nie jest zdefiniowana”. Na wejściu 0 te pierwsze nierówności 0<0są oceniane na Fałsz, więc reszta nie jest oceniana, a wynik jest po prostu Fałsz.


2

Node.js (ES6), 77 bajtów, 2 kody wyjścia

require('readline').createInterface({input:process.stdin}).prompt("",i=>i&&x)

2

Galaretka , 4 kody wyjścia, 18 bajtów

߀
2*
Ṁ¹Ŀ
RÇĿỌḊ?R

Obsługuje kody wyjścia 0 , 1 , 137 (zabity) i 139 (błąd segmentacji).

Wypróbuj online!

Jak to działa

RÇĿỌḊ?R  Main link. Argument: n (integer)

R        Range; yield [1, ..., n] if n > 1 or [] if n = 0.
    Ḋ?   If the dequeued range, i.e., [2, ..., n] is non-empty:
 Ç         Call the third helper link.
  Ŀ        Execute the k-th helper link, where k is the the integer returned by Ç.
         Else, i.e., if n is 0 or 1:
   Ọ       Unordinal; yield [] for n = 0 and "\x01" for n = 1.
      R  Range. This maps [] to [] and causes and error (exit code 1) for "\x01".


Ṁ¹Ŀ      Third helper link. Argument: r (range)

Ṁ        Maximum; retrieve n from r = [1, ..., n].
 ¹Ŀ      Call the n-th helper link (modular).
         When n = 139, since 139 % 3 = 1, this calls the first helper link.
         When n = 137, since 137 % 3 = 2, this calls the second helper link.


2*       Second helper link. Argument: k

2*       Return 2**k.
         Since 2**137 % 3 = 174224571863520493293247799005065324265472 % 3 = 2,
         ÇĿ in the main link will once again call the second helper link.
         Trying to compute 2**2**137, a 174224571863520493293247799005065324265472-
         bit number, will get the program killed for excessive memory usage.


߀       First helper link. Argument: k

߀       Recursively map the first helper link over [1, ..., k].
         This creates infinite recursion. Due to Jelly's high recursion limit,
         a segmentation fault will be triggered.

2

SmileBASIC, 640 bajtów, 39 kodów wyjścia (spośród 52)

SPSET.,0INPUT C$GOTO"@"+C$@0
STOP@3
A
@4
CLS.@5@A
GOSUB@A@7?1/A@8
X$=3@9
A%=POW(2,31)@10
BEEP-1@11
DIM B[#ZL*#R]@13
READ A
@15
V"OPTION STRICT?X
@16
CALL@D@17
V@A*2
@18
V"VAR A,A
@19
V"DEF A:END:DEF A
@20
V"FOR I=0TO
@21
V"NEXT
@22
V"REPEAT
@23
V"UNTIL
@24
V"WHILE.
@25
V"WEND
@26
V"IF.THEN
@27
V"IF.THEN"+CHR$(10)+"ELSE
@28
V"ENDIF
@29
V"DEF X
@30
RETURN@31
DIM E[-1]@32
V"DEF A:DEF
@34
GOTO"|
@36
XOFF MIC
MICSTOP
@37
XOFF MOTION
GYROSYNC
@38
PRGDEL
@39
DIM F[66]SPANIM.,1,F
@40
DIM G[2]SPANIM.,1,G
@42
MPSTART 2,@A@L
MPSEND"A"GOTO@L@44
PROJECT
@46
USE"PRG1:A
@47
BGMPLAY"`
@48
X=
@51
DLCOPEN"
DEF V C
PRGEDIT 1PRGDEL-1PRGSET C
EXEC 1
END

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.


0

ZX81 BASIC> 255 kodów wyjścia - 52 bajty (lista)

1 INPUT N
2 GOTO 1+(2*(N>0 AND N <=255))
3 PRINT "EXIT CODE ";N
4 RAND USR N

Technicznie rzecz biorąc, Nmoż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 1jeśli ZX81 BASIC miał IF/ELSEw swoich symbolicznych instrukcjach.


3
Jak to spełnia the program caused some fatal unintended exception? To po prostu drukuje trochę tekstu i kończy wykonywanie.
AdmBorkBork

Masz rację - rano muszę być bardziej rozbudzony.
Shaun Bebbers

RAND USR Nspowoduje niezamierzone efekty, ponieważ wywołanie części pamięci ROM z nieoczekiwanego miejsca nie jest dobrym pomysłem, dlatego RAND USR 0zostało wykluczone, ponieważ jest to zbyt wdzięczne.
Shaun Bebbers

Czy możesz bardziej szczegółowo wyjaśnić, w jaki sposób powoduje to awarię programu? Nie jestem do końca zaznajomiony z ZX81 BASIC.
AdmBorkBork

Pamięć ROM mieści się w przedziale od 0x0000 do 0x1fff; wywoływanie procedur ROM będzie działać, jeśli zaczniesz od właściwego miejsca. Uruchomienie jednego lub więcej bajtów w dowolnej procedurze kodu maszynowego w Z80 spowoduje nieoczekiwane efekty. Jeśli masz prostą LD BC, 0000 RST 10 RETprzy 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.
Shaun Bebbers
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.