Golf Kode Keluar

55

Terinspirasi oleh default ini untuk IO .

Tugas

Tulis program yang, diberi bilangan bulat input xantara 0 dan 255, macet dengan kode keluar x.

Batasan

  • Anda tidak boleh memanggil apa pun yang dimaksudkan langsung untuk keluaran kode keluar ( System.exit(x), kembali dari main, dll.). Sebaliknya, program Anda harus menyebabkan kesalahan atau kerusakan yang akan menyebabkan, dengan probabilitas 1, program untuk keluar dengan integer input.
    • Dalam hal ini, kata-kata "kesalahan" dan "macet" berarti bahwa program menyebabkan beberapa pengecualian fatal yang tidak diinginkan, di mana suatu metode, operasi atau sebaliknya digunakan secara tidak benar yang menyebabkan kegagalan yang tidak dapat dipulihkan.
    • Anda mungkin tidak secara langsung menyebabkan kesalahan dengan melemparkannya secara langsung. Anda harus membuatnya dengan menggunakan metode, fungsi, atau yang tujuannya melayani fungsi yang berbeda (yaitu mencoba untuk mengeksekusi file menulis ke direktori read-only).
  • Anda harus memiliki setidaknya dua kode keluar yang dicatat dalam program Anda.
  • Penghentian proses dengan penggunaan sinyal dilarang. (Penalaran dapat ditemukan dalam diskusi ini )

Mencetak gol

Skor program Anda ditentukan oleh jumlah kode keluar yang didukung, di mana keputusan kode adalah tiebreak. Jumlah terbesar dari kode keluar yang didukung akan menang!

Addison Crump
sumber
Sekedar klarifikasi, jika saya mengajukan kesalahan, itu ilegal ya?
Anthony Pham
@AnthonyPham Jika Anda langsung menaikkannya ( throw new Exception()gaya), itu ilegal. Jika itu adalah produk sampingan dari penyalahgunaan fungsi yang ada, maka itu tidak masalah.
Addison Crump
@VoteToTutup Saya kira saya tidak cukup jelas. Saya setuju dengan Anda, tetapi menyarankan, katakanlah persegi, bukan faktorial. Tapi apa pun, itu tidak terlalu penting, hanya saran
Maltysen
8
Apakah menerima input sebagai digit bahasa Inggris yang dieja (mis. one zero zeroUntuk 100) dapat diterima? Saya punya ide untuk tantangan ini, tetapi bahasa ini memiliki beberapa ide yang cukup tidak biasa tentang I / O, dan ini adalah format input yang paling alami.
5
Saya akan mempertimbangkan Golf Kode Keluar judul clickbait, meskipun itu akurat. <(° _ ° <)
RaisingAgent

Jawaban:

48

Unix Shell (+ ncurses + utilitas BSD), 36, 26 byte, 256 kode keluar

Golf

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

Jika opsi -S digunakan, tput memeriksa kesalahan dari setiap baris, dan jika ada kesalahan ditemukan, akan menetapkan kode keluar menjadi 4 ditambah jumlah baris dengan kesalahan. Jika tidak ada kesalahan ditemukan, kode keluar adalah 0. Tidak ada indikasi yang gagal baris dapat diberikan sehingga kode keluar 1 tidak akan pernah muncul. Kode keluar 2, 3, dan 4 mempertahankan interpretasi mereka yang biasa.

Setelah kode keluar tput melewati 255, kode itu hanya meluap, jadi 253 (kesalahan input) akan menghasilkan kode keluar 1 dll, sehingga menghasilkan status keluar yang diinginkan untuk seluruh jajaran input.

Catatan : apakah tput akan gagal saat tidak, saat mengatur / mendapatkan kemampuan tertentu, tergantung pada jenis terminal, saya telah menggunakan:xterm with 256 colors

jot adalah utilitas BSD , yang mencetak data sekuensial atau acak, dan (AFAIK) juga tersedia di luar kotak pada sistem OSX.

Jika sistem Anda tidak jottersedia, Anda dapat menggunakan versi yang sedikit lebih panjang (29 byte):

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

Cobalah secara Online! (versi 29 byte)

zeppelin
sumber
Wow, itu cukup bagus. +1
Addison Crump
45

Ekstra Bash 4.2 +, 24 kode keluar

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

Terima kasih kepada @ KenY-N untuk 3 kode keluar. Terima kasih kepada @ el.pescado untuk 1 kode keluar.

Verifikasi

Semua tes telah dilakukan pada 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
Dennis
sumber
1
Keluar kode 5:http_proxy=fafa curl http://example.org
el.pescado
1
@ el.pescado Butuh waktu lebih dari setahun, tapi akhirnya saya menerapkan saran Anda. Terima kasih!
Dennis
30

INTERCAL (C-INTERCAL), 15 kode, 313 + 2 = 315 byte

        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

Cobalah online!

Semua spasi putih di sini tidak relevan. (Program asli berisi tab, tapi saya mengonversinya ke spasi sehingga berbaris dengan benar di SE; itu konvensional untuk menggunakan lebar tab 8 untuk INTERCAL. Saya telah menguji versi program dengan semua tab, spasi , dan baris baru dihapus, dan berfungsi dengan baik.)

Kompilasi dengan -abm(penalti 2 byte, karena -bdiperlukan agar kompiler menjadi deterministik).

Seperti biasa untuk INTERCAL, ini membutuhkan input numerik dalam format, misalnya ONE TWO THREEuntuk 123.

Penjelasan

Ketika sebuah program C-INTERCAL kesalahan keluar, status keluar adalah kode kesalahan modulo 256. Sebagai hasilnya, kita dapat bertujuan untuk menulis sebuah program yang mampu menghasilkan kesalahan runtime sebanyak mungkin. Program ini hanya menghilangkan dua kesalahan runtime yang tidak menunjukkan masalah kompiler internal: ICL200I, karena mereproduksinya memerlukan penggunaan pustaka eksternal yang hanya kompatibel dengan program berulir tunggal (dan program multithreaded memiliki lebih banyak kesalahan yang tersedia); dan ICL533I, karena 533 memiliki nilai modulo 256 yang sama dengan 277, dan program ini mampu menghasilkan ICL277I.

Program selalu memulai dengan cara yang sama. Pertama, kami memasukkan ( WRITE IN) nilai untuk variabel .1. Kemudian, kami menggunakan CREATEpernyataan yang dikomputasi untuk membuat sintaks baru (di sini, A); tetapi karena itu dihitung, definisi sintaks bervariasi berdasarkan nilai .1. Akhirnya, dalam kebanyakan kasus kami menjalankan Apernyataan baru kami , yang telah didefinisikan untuk menghasilkan kesalahan; tabel kemungkinan definisi yang kami miliki berisi definisi untuk setiap kemungkinan kesalahan runtime (selain dari pengecualian yang tercantum di atas).

Pertama, ada dua pengecualian untuk skema umum ini. (0)bukan nomor baris yang valid, jadi jika pengguna menginput ZERO, kami melompat dari baris kedua (bernomor (8)) ke baris keempat dengan menggunakan COME FROMpernyataan yang dihitung . Ini kemudian jatuh ke dalam kesalahan sintaks DO X, yang menghasilkan kesalahan ICL000I. (Dalam INTERCAL, kesalahan sintaksis terjadi saat runtime, karena kecenderungan perintah untuk dinonaktifkan, sintaks yang akan didefinisikan ulang di bawah Anda, dll.). The COME FROMpernyataan juga memiliki efek samping, bahkan jika tidak ada yang sebenarnya COME FROMterjadi, menciptakan kelebihan beban operan dari .1ke #1setiap kali baris dengan nomor baris dijalankan; ini digunakan nanti ketika menghasilkan output 21. (Efek samping global acak cukup idiomatis dalam INTERCAL.)

Pengecualian lainnya adalah dengan input ONE TWO NINE. Tidak ada nomor baris (129)dalam program ini, jadi kami mendapatkan kesalahan untuk nomor baris yang hilang, yaitu ICL129I. Jadi saya tidak perlu menulis kode apa pun untuk membahas kasus itu sama sekali.

Berikut adalah kesalahan lainnya, dan apa yang menyebabkannya:

  • 123 adalah NEXTstack overflow ( DO (123) NEXT). The NEXTPernyataan perlu pengubah lainnya ( FORGETatau RESUME) untuk surut menentukan apa jenis pernyataan kontrol itu. Tidak ada yang menyebabkan kesalahan ICL123I setelah ada 80 pernyataan `NEXT yang belum terselesaikan.
  • 222 adalah simpanan simpanan ( DO STASH .2dalam satu COME FROMlingkaran). Stash dibatasi hanya oleh memori yang tersedia, tetapi itu akan habis pada akhirnya, menyebabkan kesalahan ICL222I.
  • 240 adalah dimensi array untuk ukuran nol. Itu persis apa DO ,1 <- #0artinya, dan itu menyebabkan kesalahan ICL240I.
  • 241 disebabkan oleh menetapkan di luar batas array. Dalam hal ini, ,1belum dialokasikan ( ,digunakan untuk variabel tipe array di INTERCAL), jadi pengindeksan ini menyebabkan kesalahan ICL241I.
  • 19 menetapkan 65536 ( #256 $ #0) ke variabel 16-bit .2. Itu tidak cocok, menyebabkan kesalahan ICL275I.
  • 21 ditugaskan #2untuk .1. Itu mungkin terlihat seperti tugas yang cukup sederhana, tetapi kami kelebihan beban .1berarti #1sebelumnya, dan berusaha untuk mengubah nilai 1 tanpa -vopsi pada baris perintah menyebabkan kesalahan ICL277I.
  • 148 upaya untuk kembali ke entri teratas stack choicepoint ( GO BACK), yang tidak ada pada titik ini dalam program (kami belum menjalankan perintah apa pun untuk memanipulasi stack choicepoint, jadi masih kosong). Itu menyebabkan kesalahan ICL404I.
  • 180 upaya untuk RETRIEVE .2dari simpanan yang tidak ada (karena kami tidak menyembunyikan apa pun di cabang program ini), menyebabkan kesalahan ICL436I.
  • 50 permintaan input ( WRITE IN) selamanya dalam satu COME FROMlingkaran. Akhirnya kita akan membaca EOF terakhir, menyebabkan kesalahan ICL562I.
  • 109 menjalankan pernyataan DO RESUME #0, yang tidak berarti dan secara khusus didokumentasikan sebagai penyebab kesalahan (ICL621I).
  • 120 menjalankan pernyataan DO RESUME #9. Kami belum menjalankan banyak NEXTpernyataan, dan karenanya kami mendapatkan kesalahan ICL120I. (Yang menarik, kesalahan khusus ini didefinisikan dalam dokumentasi INTERCAL sebagai keluar dari program secara normal dan kemudian menyebabkan kesalahan, alih-alih keluar dari program dengan kesalahan. Namun, saya tidak percaya kedua kasus ini berbeda secara nyata.)
  • 223 pada dasarnya adalah jalinan kompleks dari multithreading primitif yang semuanya menunjuk kembali ke garis 223, menyebabkan loop tak terbatas yang meledakkan memori. Akhirnya, ada kehabisan memori di subsistem multithreading, yang mengarah ke kesalahan ICL991I.
  • 121 sebenarnya adalah pernyataan yang valid (ini adalah komentar), tetapi muncul di akhir program. Dengan demikian, eksekusi jatuh dari akhir program segera setelah dijalankan, menyebabkan kesalahan ICL633I.

Verifikasi

Beberapa kesalahan melibatkan sengaja menjalankan program kehabisan memori, jadi saya sarankan pengaturan batas memori yang cukup kecil. Inilah perintah shell yang saya gunakan untuk menguji program (dengan baris baru ditambahkan agar mudah dibaca; hapus jika Anda menjalankannya sendiri):

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

Dan inilah hasilnya (dengan nomor baris dan pesan "PLEASE CORRECT SOURCE" dihapus untuk menghemat ruang), yang saya tambahkan sebagian untuk menunjukkan program berfungsi tetapi sebagian besar untuk memamerkan pesan kesalahan konyol 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

sumber
4
Ini mungkin program INTERCAL terhebat yang pernah saya lihat.
Skyler
27

Perl, 108 byte, 256 kode keluar

Program ini (ab) menggunakan modul Test :: More . Mencoba untuk membuka file bernama "" n kali di mana n diberikan sebagai argumen baris perintah. Itu gagal setiap waktu, dan setiap doa diperlakukan sebagai ujian. Test :: Semakin banyak jumlah tes gagal sebagai kode keluar. plan tests => $ARGV[0]%255diperlukan untuk mendapatkan kode keluar 255.

#!/usr/bin/perl
use Test::More;
plan tests => $ARGV[0]%255 if($ARGV[0]>0);
ok(open(F,"")) for (1..$ARGV[0])
el.pescado
sumber
Golfed:, perl -MTest::More -e'plan tests,$%%255if$%=<>;ok 0for 1..$%'51 bytes (38 bytes + 13 bytes untuk -MTest::More<space>). Mengambil input pada stdin.
ThisSuitIsBlackNot
27

C90 (gcc), 256 kode keluar, 28 27 18 byte

main(){getchar();}

Saya tidak yakin apakah ini pintar atau cheaty, tapi saya tidak berpikir itu melanggar aturan seperti yang tertulis: secara teknis tidak menggunakan exit, returnatau kesalahan mekanisme melempar, tetapi hanya bergantung pada perilaku undefined dan fakta bahwa gcc melakukan sesuatu yang agak nyaman sejauh tantangan ini berlangsung.

Cobalah online!

Bagaimana itu bekerja

Ini hanya digunakan getcharuntuk membaca satu byte dari STDIN. Dengan sendirinya, ini tidak melakukan apa-apa.

Namun, program C90 yang patuh harus diakhiri dengan returnpernyataan atau sesuatu yang setara; yang lainnya adalah perilaku yang tidak terdefinisi. gcc mengakhiri rakitan yang dihasilkan dengan cara retapa pun, sehingga nilai apa pun yang biasa saja dalam register EAX akan dikembalikan oleh program. Untungnya, glibc getcharmenyimpan byte yang dibaca dari STDIN di EAX, jadi nilai byte itu adalah kode keluar dari program kami.

Dennis
sumber
Akan menarik untuk melihat apakah ini dapat dimodifikasi untuk menerobos penghalang 8 bit, menggunakan shell seperti jsh , yang mendukung set -o fullexitcode.
zeppelin
1
Itu pintar. Tapi programnya tidak benar-benar macet. Ia kembali secara normal, apakah spek itu adalah untuk "menyebabkan pengecualian fatal / kegagalan / kerusakan permanen"
redup
Either way, ini luar biasa.
Quentin
4
@dim saya kira itu tergantung pada definisi Anda tentang crash. Tidak mengakhiri main dengan returnatau exitmerupakan kesalahan sejauh standar C90 berjalan, dan itu menghasilkan kode keluar yang menunjukkan kegagalan. Itu saja yang terjadi pada tabrakan.
Dennis
Kecelakaan adalah program yang berhenti berfungsi dengan benar. Program Anda melakukan semua yang Anda suruh agar dilakukan dengan benar, ia membaca satu karakter dari input lalu berhenti. Jadi, meskipun kode keluar menunjukkan kesalahan, ia tidak mogok.
findusl
19

C (gcc) di bawah shell bash pada x86, 230 byte, 8 kode keluar

Baris baru ditambahkan untuk membantu keterbacaan. Komentar diabaikan dalam skor.

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 */
}
}

Fitur bash shell:

Ketika sebuah perintah berakhir pada sinyal fatal N, bash menggunakan nilai 128 + N sebagai status keluar.

Jadi yang perlu kita lakukan hanyalah memicu berbagai sinyal dari dalam program ac. Pada titik ini, saya menganggap hanya melakukan kill(n-128);dilarang. Jadi alih-alih kami mengeksekusi kode yang memicu berbagai sinyal, yang menyebabkan kode kesalahan yang sesuai tersedia di shell panggilan.

Kode keluar adalah 0, 130, 133, 134, 136, 139, 141, 142.

Cobalah online . Luaskan bagian "Debug" untuk melihat kode pengembalian.

Ini tentunya bisa bermain golf lebih dalam. Tetapi saya akan lebih tertarik untuk menambahkan lebih banyak sinyal.

Trauma Digital
sumber
Apakah saya akan benar berasumsi bahwa sinyal disebabkan di luar kode Anda oleh fungsi atau operasi yang sudah ada?
Addison Crump
1
@VoteToTutup ya, itu benar. Sebagai contoh, __asm("UD2")jalankan "instruksi tidak terdefinisi" x86 yang akan menyebabkan pengecualian CPU yang akan diteruskan oleh kernel ke program dalam bentuk sinyal SIGILL. Sebagai socketpaircontoh, SIGPIPE akan dikirim oleh kernel atau glibc ketika kita mencoba write()untuk sebuah pipa yang close()d di ujung lainnya.
Trauma Digital
1
Maka saya tidak punya masalah dengan itu. : P
Addison Crump
1
Anda dapat bermain golf 1) dua karakter jika Anda menggunakan int3dan tidak int $3dan 2) satu karakter jika Anda menyatakan vsebagai int**, mengingat bahwa Anda tidak secara mendasar bergantung pada char-ness dari tipe data dalam aritmatika pointer Anda, ditambah 3) dua karakter jika Anda menggunakan *palih-alih p[0], atau 4) enam karakter, jika Anda mau mengandalkan fdangka yang dapat diprediksi yang dikembalikan oleh semua syscall yang membuatnya, dan ganti p[0]dan p[1]dengan nilainya yang hampir pasti. Terakhir, pipe(fd)jauh lebih pendek daripada socketpair(...)dan menghasilkan kesalahan yang sama saat menutup fd[0]dan menulis. fd[1].
Iwillnotexist Idonotexist
2
Beberapa saran tambahan untuk bermain golf: 1) Gunakan &63sebagai ganti -128. 2) Ganti sleep(2)dengan for(;;). 3) Ganti c=*(int*)cdengan atoi(0). 4) Ganti c/=c-2dengan c/=0.
nwellnhof
10

Python 2, 13 Bytes, 2 kode keluar

1/(input()-1)

Jika Anda memasukkan 0, ia mencoba untuk mencetak 1/-1yang -1 yang baik-baik saja sehingga keluar kode 0. Jika Anda memasukkan 1, Anda mendapatkan 1/0yang menimbulkan a ZeroDivisionErrordi mana ada kode keluar dari 1. Dengan IDE saya, hanya ada 0 dan 1 untuk kode keluar ...

Output:


masukkan deskripsi gambar di sini


masukkan deskripsi gambar di sini

Anthony Pham
sumber
10

PHP, 15 byte, 2 kode keluar

Tanpa die/ exit, PHP tidak dapat mengembalikan apa pun kecuali 0atau 255(afaik; mungkin ~1), jadi ...

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

Jika argumen baris perintah salah, ia mengevaluasi ke 1dan keluar dengan 0. Jika tidak, ia mencoba memanggil fungsi dan keluar dengan <b>Fatal error</b>: Uncaught Error: Call to undefined function p().

Jalankan dengan -r.

Titus
sumber
5
Itu tidak benar. exit()menetapkan status keluar ... yang tidak dapat Anda gunakan untuk tantangan ini, sudah pasti. Tetapi kode Anda juga tidak valid. Ini menetapkan status keluar ke 255
aross
@aross: Hmm saya selalu berasumsi kesalahan akan keluar bersama 1. Saya mencari daftar kode keluar, tetapi tidak dapat menemukannya.
Titus
10

Excel VBA, 414 514 533 + 3 Bytes, 14 kode keluar

Mengambil input sebagai Conditional Compilation Argument, n=[input value]dan menghasilkan kode kesalahan terkait nomor itu.

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 untuk n=[Value]panggilan kompilasi bersyarat

Menangani Input di mana n=

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

Catatan: VBA tidak memiliki kode keluar 0atau 1. Saya telah memasukkan solusi untuk 3dan 5, yang merupakan dua kode keluar bernomor terendah yang tersedia untuk VBA di tempat mereka

Taylor Scott
sumber
1
Saya tidak akan melarang jawaban ini, karena ini sama artinya bagi saya untuk tidak diperbolehkan karena kemampuan bahasa untuk tipe output.
Addison Crump
1
Apa yang #dilakukan di sini?
BruceWayne
The #ifdan #ElseIfmerupakan pernyataan kompilasi bersyarat berarti bahwa pernyataan yang mengikutinya hanya disusun jika kondisi benar
Taylor Scott
1
Jadi, jika itu tidak benar, pernyataan itu tidak dikompilasi ... itu berbeda daripada tidak digunakan #, di mana mereka dikompilasi apakah pernyataan itu benar atau tidak? Saya tahu cara Ifkerja pernyataan, tetapi saya baru mengenal apa yang sebenarnya dikompilasi , sangat menyesal untuk pertanyaan sederhana.
BruceWayne
1
@RuceWayne, ya, itulah yang terjadi. Karena baris-baris ini dirancang untuk melempar kesalahan spesifik , maka perlu hanya baris-baris yang menghasilkan kode kesalahan yang diinginkan dikompilasi pada waktu tertentu. Untuk melakukan ini #ifdigunakan sebagai pengganti Ifatau Select Casehanya truthypernyataan bersyarat yang benar-benar dikompilasi. Dalam kasus ini secara khusus, ini membuat program tidak keluar dengan kode kesalahan 3, Return without GoSubpada setiap eksekusi, tetapi hanya keluar dengan kode ini ketikan=3
Taylor Scott
7

Turtlèd, 4 byte, 2 kode keluar

Saya tidak tahu apakah ada cara untuk mendapatkan lebih banyak kode keluar ... apakah ada cara lain dalam bahasa juru bahasa

Saya menemukan beberapa jawaban panjang empat

' ?;

Cobalah online!

!.(0

Cobalah online!

?;(*

Cobalah online!

Bagaimana ini bekerja:

' ?;

di juru bahasa saya, ada fitur bug yang menyebabkan kesalahan ketika grid di memori memiliki lebih dari satu baris, dan tidak memiliki karakter non-spasi di dalamnya. program ini menghapus * pada sel asal '[space], mengambil input integer non-negatif ?(0 atau 1 benar-benar), dan bergerak turun sebanyak itu ;, jika nol, kisi hanya akan memiliki satu baris dan bukan kesalahan, jika tidak maka akan bergerak ke bawah dan kesalahan akan terjadi

!.(0

tanda kurung dan hal-hal tidak dapat diuraikan, mereka hanya dieksekusi pada saat run time yang berarti: "lompat ke paren yang cocok, jika simbol sel tidak benar". dalam program ini, memasukkan ( !) seseorang menyebabkan program menulisnya ke sel ( .), menjalankan paren, yang memeriksa apakah simbol sel adalah 0, cobalah untuk melompat ke paren yang cocok, tetapi alih-alih lemparkan kesalahan karena tidak ada . jika nol, ia menuliskannya, memeriksa tanda kurung, menemukan dirinya pada 0, dan kemudian mengabaikannya, dan program selesai

?;(*

memiliki elemen dari jawaban sebelumnya, dan yang pertama. dibutuhkan input integer non-negatif, bergerak turun sebanyak itu, dan memeriksa apakah sel '*', mencari paren tambahan yang tidak ada jika tidak. jika inputnya 1, ia akan pindah dari ruang awal, dan menemukan sel adalah spasi, dan kesalahan, jika nol, itu akan tetap di ruang awal dan mengabaikan paren.

Lemon dirusak
sumber
7

Javascript (simpul), 19 byte, 2 kode keluar

Program lengkap:

+process.argv[2]&&a

Fungsi:

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

process.argvadalah array yang berisi path ke node executable, path ke file javascript dieksekusi dan argumen baris perintah. Dalam hal ini, ini akan menjadi "1"atau "0". String dikonversi ke nomor dengan +operator unary . Jika angka nol, &&operator yang malas tidak akan mengevaluasi sisi kanan, jika jumlahnya benar (bukan nol), sisi kanan &&dievaluasi dan kesalahan dilemparkan karena merujuk pada variabel yang tidak ditentukan, dan program ada dengan kode keluar 1.

Fungsi mengharapkan input sebagai angka. Jika input benar, fungsi memanggil dirinya sendiri, dan crash runtime node dengan stack overflow. Jika inputnya 0, &&operator yang malas mengembalikan 0 tanpa mengevaluasi sisi kanan.

corvus_192
sumber
@VoteToClose Mengubahnya menjadi variabel yang tidak ditentukan
corvus_192
Itu bekerja. : P
Addison Crump
Program lengkap dapat disingkat menjadi +process.argv[2]&&a.
user2428118
@ user2428118 Anda benar
corvus_192
Hanya karena penasaran, apakah ReferenceError.prototype.name=process.argv[2]?a:0akan valid?
Patrick Roberts
6

Perl 6 , 57 byte, 256 kode keluar

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

Cobalah
Ini adalah terjemahan dari contoh Perl 5.

Diperluas

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
  )
Brad Gilbert b2gills
sumber
5

Scala, 19 byte, 2 kode keluar

if(args(0)=="1")1/0

1/(args(0).toInt-1)

JVM hanya mendukung 1 dan 0 sebagai kode keluar jika Anda tidak menelepon System.exit.

Program pertama mencoba menghitung 1/0jika argumen pertama adalah 1, yang akan membuat crash JVM dengan kode keluar dari 1. Jika argumennya adalah 0, ia akan berhasil keluar.

Program kedua untuk mengubah argumen menjadi integer, kurangi satu dan coba bagi 1 dengan angka itu. Jika argumen jika 1, ia menghitung 1/0, maka JVM akan macet; jika argumennya 0, ia menghitung 1/-1dan keluar.

corvus_192
sumber
5

Python 3 , 15 byte, 2 kode keluar

Jelas, ini lebih panjang dari solusi Python 2 , karena dalam Python 3 kita tidak bisa mengambil input literal tanpa memanggil eval. Namun, kita dapat menggunakan teknik perbandingan string yang menarik ...

1/(input()<'1')

Input akan berupa string 0atau 1- jika 1, kondisi dievaluasi menjadi 0 (false), yang menghasilkan upaya untuk menghitung 1 / 0yang jelas macet (kode keluar 1). Kalau tidak, tidak ada yang terjadi, dan Python keluar dengan kode keluar biasa 0.

Sejauh yang saya ketahui, Python tidak dapat menabrak kode keluar lainnya.

FlipTack
sumber
5

Java, 71 66 byte, 2 kode keluar

4 byte disimpan berkat Holger

Program lengkap:

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

Fungsi mengambil int sebagai argumen:

i->1/(i-1)

Program ini mengambil karakter pertama dari argumant pertama (baik '0'atau '1'dan mengurangi 48 (nilai ascii dari '0') untuk mendapatkan integer (0 atau 1). Kemudian mencoba untuk mengatur argumen pada posisi integer ke string kosong. inputnya 1, program crash dengan ArrayIndexOutOfBoundsException, karena array argumen hanya memiliki satu elemen pada posisi 0 (diindeks nol).

corvus_192
sumber
Anda dapat menetapkan nilai atau menggunakannya dengan cara lain, misalnya sebagai indeks array a[a[0].equals("1")?1/0:1]="";, yang setara dengan int x=a[0].equals("1")?1/0:1;. Tetapi mengubah program lebih lanjut untuk memprovokasi ArrayIndexOutOfBoundsExceptionbukannya ArithmeticExceptionmenghemat beberapa byte:interface I{static void main(String[]a){a[a[0].charAt(0)-'0']="";}}
Holger
4

Python 2, 11 byte, 2 kode keluar

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

Tiga solusi 11-byte yang berbeda untuk tiga kesalahan berbeda! (Hanya untuk bersenang-senang, ini tidak memberikan poin.) Secara default, Python hanya memiliki kode keluar 0 untuk keluar berhasil dan 1 untuk kesalahan. Upaya yang berhasil tidak menghasilkan apa pun.

 1>>-input()

Pada input 1, berikan "ValueError: hitung shift negatif". Pada input 0, hitungan shift nol berhasil dan memberikan 1.

1/~-input()

Pada input 1, berikan "ZeroDivisionError: integer division atau modulo by zero" karena ~-input(), alias input()-10. Di input 1, 1/-1beri -1. 0**-input()juga akan bekerja.

0<input()<x

Pada input 1, berikan "NameError: nama 'x' tidak didefinisikan". Pada input 0, ketidaksetaraan pertama 0<0ini dievaluasi menjadi False, sehingga sisanya tidak dievaluasi dan hasilnya hanya False.

Tidak
sumber
2

Node.js (ES6), 77 byte, 2 kode keluar

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

Jelly , 4 kode keluar, 18 byte

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

Mendukung kode keluar 0 , 1 , 137 (terbunuh), dan 139 (kesalahan segmentasi).

Cobalah online!

Bagaimana itu bekerja

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.
Dennis
sumber
2

SmileBASIC, 640 byte, 39 kode keluar (dari 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

Ini pasti bisa dibuat lebih pendek. SB hanya memiliki kode kesalahan dari 0 hingga 51, dan beberapa tidak mungkin dipicu.

12Me21
sumber
0

ZX81 BASIC> 255 kode keluar - 52 byte (daftar)

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

Secara teknis, Nbisa berupa angka titik apung 24 bit dalam rentang, tetapi kami akan menganggap bilangan bulat di sini. Baris 2 setara dengan IF N>0 AND N <=255 THEN GOTO 3: ELSE GOTO 1jika ZX81 BASIC memiliki IF/ELSEinstruksi simbolisnya.

Shaun Bebbers
sumber
3
Bagaimana ini memuaskan the program caused some fatal unintended exception? Ini hanya mencetak beberapa teks dan menyelesaikan eksekusi.
AdmBorkBork
Anda benar - saya harus lebih terjaga di pagi hari.
Shaun Bebbers
RAND USR Nakan menyebabkan efek yang tidak diinginkan karena memanggil bagian dari ROM dari tempat yang tidak terduga bukanlah ide yang baik, karena itu RAND USR 0telah dikecualikan karena terlalu anggun.
Shaun Bebbers
Bisakah Anda menguraikan sedikit lebih banyak tentang bagaimana itu sebenarnya menyebabkan program crash? Saya tidak akrab dengan ZX81 BASIC.
AdmBorkBork
ROM berada dari 0x0000 - 0x1fff; memanggil rutinitas ROM akan bekerja jika Anda mulai di tempat yang tepat. Memulai satu atau lebih byte ke rutin kode mesin apa pun di Z80 akan menyebabkan efek yang tidak terduga. Jika Anda memiliki angka sederhana LD BC, 0000 RST 10 RETpada 0x1000 tetapi dipanggil RAND USR 4097maka Anda akan kehilangan operan LD dan karena itu kode mesin akan miring. Saya tidak ingat semua panggilan ROM, tetapi saya akan menyelesaikan semua tujuan hukum / anggun dan mengecualikan mereka nanti.
Shaun Bebbers