Terinspirasi oleh default ini untuk IO .
Tugas
Tulis program yang, diberi bilangan bulat input x
antara 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 darimain
, 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!
code-challenge
restricted-source
Addison Crump
sumber
sumber
throw new Exception()
gaya), itu ilegal. Jika itu adalah produk sampingan dari penyalahgunaan fungsi yang ada, maka itu tidak masalah.one zero zero
Untuk 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.Jawaban:
Unix Shell (+ ncurses + utilitas BSD),
36, 26 byte, 256 kode keluarGolf
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
jot
tersedia, Anda dapat menggunakan versi yang sedikit lebih panjang (29 byte):Cobalah secara Online! (versi 29 byte)
sumber
Ekstra Bash 4.2 +, 24 kode keluar
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.
sumber
http_proxy=fafa curl http://example.org
INTERCAL (C-INTERCAL), 15 kode, 313 + 2 = 315 byte
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-b
diperlukan agar kompiler menjadi deterministik).Seperti biasa untuk INTERCAL, ini membutuhkan input numerik dalam format, misalnya
ONE TWO THREE
untuk123
.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 menggunakanCREATE
pernyataan yang dikomputasi untuk membuat sintaks baru (di sini,A
); tetapi karena itu dihitung, definisi sintaks bervariasi berdasarkan nilai.1
. Akhirnya, dalam kebanyakan kasus kami menjalankanA
pernyataan 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 menginputZERO
, kami melompat dari baris kedua (bernomor(8)
) ke baris keempat dengan menggunakanCOME FROM
pernyataan yang dihitung . Ini kemudian jatuh ke dalam kesalahan sintaksDO X
, yang menghasilkan kesalahanICL000I
. (Dalam INTERCAL, kesalahan sintaksis terjadi saat runtime, karena kecenderungan perintah untuk dinonaktifkan, sintaks yang akan didefinisikan ulang di bawah Anda, dll.). TheCOME FROM
pernyataan juga memiliki efek samping, bahkan jika tidak ada yang sebenarnyaCOME FROM
terjadi, menciptakan kelebihan beban operan dari.1
ke#1
setiap 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, yaituICL129I
. Jadi saya tidak perlu menulis kode apa pun untuk membahas kasus itu sama sekali.Berikut adalah kesalahan lainnya, dan apa yang menyebabkannya:
NEXT
stack overflow (DO (123) NEXT
). TheNEXT
Pernyataan perlu pengubah lainnya (FORGET
atauRESUME
) untuk surut menentukan apa jenis pernyataan kontrol itu. Tidak ada yang menyebabkan kesalahan ICL123I setelah ada 80 pernyataan `NEXT yang belum terselesaikan.DO STASH .2
dalam satuCOME FROM
lingkaran). Stash dibatasi hanya oleh memori yang tersedia, tetapi itu akan habis pada akhirnya, menyebabkan kesalahan ICL222I.DO ,1 <- #0
artinya, dan itu menyebabkan kesalahan ICL240I.,1
belum dialokasikan (,
digunakan untuk variabel tipe array di INTERCAL), jadi pengindeksan ini menyebabkan kesalahan ICL241I.#256 $ #0
) ke variabel 16-bit.2
. Itu tidak cocok, menyebabkan kesalahan ICL275I.#2
untuk.1
. Itu mungkin terlihat seperti tugas yang cukup sederhana, tetapi kami kelebihan beban.1
berarti#1
sebelumnya, dan berusaha untuk mengubah nilai 1 tanpa-v
opsi pada baris perintah menyebabkan kesalahan ICL277I.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.RETRIEVE .2
dari simpanan yang tidak ada (karena kami tidak menyembunyikan apa pun di cabang program ini), menyebabkan kesalahan ICL436I.WRITE IN
) selamanya dalam satuCOME FROM
lingkaran. Akhirnya kita akan membaca EOF terakhir, menyebabkan kesalahan ICL562I.DO RESUME #0
, yang tidak berarti dan secara khusus didokumentasikan sebagai penyebab kesalahan (ICL621I).DO RESUME #9
. Kami belum menjalankan banyakNEXT
pernyataan, 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.)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):
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:
sumber
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]%255
diperlukan untuk mendapatkan kode keluar 255.sumber
perl -MTest::More -e'plan tests,$%%255if$%=<>;ok 0for 1..$%'
51 bytes (38 bytes + 13 bytes untuk-MTest::More<space>
). Mengambil input pada stdin.C90 (gcc), 256 kode keluar,
282718 byteSaya tidak yakin apakah ini pintar atau cheaty, tapi saya tidak berpikir itu melanggar aturan seperti yang tertulis: secara teknis tidak menggunakan
exit
,return
atau 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
getchar
untuk membaca satu byte dari STDIN. Dengan sendirinya, ini tidak melakukan apa-apa.Namun, program C90 yang patuh harus diakhiri dengan
return
pernyataan atau sesuatu yang setara; yang lainnya adalah perilaku yang tidak terdefinisi. gcc mengakhiri rakitan yang dihasilkan dengan cararet
apa pun, sehingga nilai apa pun yang biasa saja dalam register EAX akan dikembalikan oleh program. Untungnya, glibcgetchar
menyimpan byte yang dibaca dari STDIN di EAX, jadi nilai byte itu adalah kode keluar dari program kami.sumber
set -o fullexitcode
.return
atauexit
merupakan kesalahan sejauh standar C90 berjalan, dan itu menghasilkan kode keluar yang menunjukkan kegagalan. Itu saja yang terjadi pada tabrakan.C (gcc) di bawah shell bash pada x86, 230 byte, 8 kode keluar
Baris baru ditambahkan untuk membantu keterbacaan. Komentar diabaikan dalam skor.
Fitur bash shell:
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.
sumber
__asm("UD2")
jalankan "instruksi tidak terdefinisi" x86 yang akan menyebabkan pengecualian CPU yang akan diteruskan oleh kernel ke program dalam bentuk sinyal SIGILL. Sebagaisocketpair
contoh, SIGPIPE akan dikirim oleh kernel atau glibc ketika kita mencobawrite()
untuk sebuah pipa yangclose()
d di ujung lainnya.int3
dan tidakint $3
dan 2) satu karakter jika Anda menyatakanv
sebagaiint**
, mengingat bahwa Anda tidak secara mendasar bergantung padachar
-ness dari tipe data dalam aritmatika pointer Anda, ditambah 3) dua karakter jika Anda menggunakan*p
alih-alihp[0]
, atau 4) enam karakter, jika Anda mau mengandalkanfd
angka yang dapat diprediksi yang dikembalikan oleh semua syscall yang membuatnya, dan gantip[0]
danp[1]
dengan nilainya yang hampir pasti. Terakhir,pipe(fd)
jauh lebih pendek daripadasocketpair(...)
dan menghasilkan kesalahan yang sama saat menutupfd[0]
dan menulis.fd[1]
.&63
sebagai ganti-128
. 2) Gantisleep(2)
denganfor(;;)
. 3) Gantic=*(int*)c
denganatoi(0)
. 4) Gantic/=c-2
denganc/=0
.Python 2, 13 Bytes, 2 kode keluar
Jika Anda memasukkan 0, ia mencoba untuk mencetak
1/-1
yang -1 yang baik-baik saja sehingga keluar kode 0. Jika Anda memasukkan 1, Anda mendapatkan1/0
yang menimbulkan aZeroDivisionError
di mana ada kode keluar dari 1. Dengan IDE saya, hanya ada 0 dan 1 untuk kode keluar ...Output:
sumber
PHP, 15 byte, 2 kode keluar
Tanpa
die
/exit
, PHP tidak dapat mengembalikan apa pun kecuali0
atau255
(afaik; mungkin~1
), jadi ...Jika argumen baris perintah salah, ia mengevaluasi ke
1
dan keluar dengan0
. Jika tidak, ia mencoba memanggil fungsi dan keluar dengan<b>Fatal error</b>: Uncaught Error: Call to undefined function p()
.Jalankan dengan
-r
.sumber
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 2551
. Saya mencari daftar kode keluar, tetapi tidak dapat menemukannya.Excel VBA,
414514 533 + 3 Bytes, 14 kode keluarMengambil input sebagai
Conditional Compilation Argument
,n=[input value]
dan menghasilkan kode kesalahan terkait nomor itu.+3 untuk
n=[Value]
panggilan kompilasi bersyaratMenangani Input di mana
n=
Catatan: VBA tidak memiliki kode keluar
0
atau1
. Saya telah memasukkan solusi untuk3
dan5
, yang merupakan dua kode keluar bernomor terendah yang tersedia untuk VBA di tempat merekasumber
#
dilakukan di sini?#if
dan#ElseIf
merupakan pernyataan kompilasi bersyarat berarti bahwa pernyataan yang mengikutinya hanya disusun jika kondisi benar#
, di mana mereka dikompilasi apakah pernyataan itu benar atau tidak? Saya tahu caraIf
kerja pernyataan, tetapi saya baru mengenal apa yang sebenarnya dikompilasi , sangat menyesal untuk pertanyaan sederhana.#if
digunakan sebagai penggantiIf
atauSelect Case
hanyatruthy
pernyataan bersyarat yang benar-benar dikompilasi. Dalam kasus ini secara khusus, ini membuat program tidak keluar dengan kode kesalahan3
,Return without GoSub
pada setiap eksekusi, tetapi hanya keluar dengan kode ini ketikan=3
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!
Cobalah online!
Cobalah online!
Bagaimana ini bekerja:
di juru bahasa saya, ada fitur
bugyang 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 terjaditanda 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 selesaimemiliki 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.
sumber
Javascript (simpul), 19 byte, 2 kode keluar
Program lengkap:
Fungsi:
process.argv
adalah 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.sumber
+process.argv[2]&&a
.ReferenceError.prototype.name=process.argv[2]?a:0
akan valid?Perl 6 , 57 byte, 256 kode keluar
Cobalah
Ini adalah terjemahan dari contoh Perl 5.
Diperluas
sumber
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/0
jika argumen pertama adalah1
, 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 menghitung1/-1
dan keluar.sumber
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 ...Input akan berupa string
0
atau1
- jika 1, kondisi dievaluasi menjadi 0 (false), yang menghasilkan upaya untuk menghitung1 / 0
yang 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.
sumber
Java,
7166 byte, 2 kode keluar4 byte disimpan berkat Holger
Program lengkap:
Fungsi mengambil int sebagai argumen:
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 denganArrayIndexOutOfBoundsException
, karena array argumen hanya memiliki satu elemen pada posisi 0 (diindeks nol).sumber
a[a[0].equals("1")?1/0:1]="";
, yang setara denganint x=a[0].equals("1")?1/0:1;
. Tetapi mengubah program lebih lanjut untuk memprovokasiArrayIndexOutOfBoundsException
bukannyaArithmeticException
menghemat beberapa byte:interface I{static void main(String[]a){a[a[0].charAt(0)-'0']="";}}
Python 2, 11 byte, 2 kode keluar
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.
Pada input 1, berikan "ValueError: hitung shift negatif". Pada input 0, hitungan shift nol berhasil dan memberikan 1.
Pada input 1, berikan "ZeroDivisionError: integer division atau modulo by zero" karena
~-input()
, aliasinput()-1
0. Di input 1,1/-1
beri -1.0**-input()
juga akan bekerja.Pada input 1, berikan "NameError: nama 'x' tidak didefinisikan". Pada input 0, ketidaksetaraan pertama
0<0
ini dievaluasi menjadi False, sehingga sisanya tidak dievaluasi dan hasilnya hanya False.sumber
Node.js (ES6), 77 byte, 2 kode keluar
sumber
Jelly , 4 kode keluar, 18 byte
Mendukung kode keluar 0 , 1 , 137 (terbunuh), dan 139 (kesalahan segmentasi).
Cobalah online!
Bagaimana itu bekerja
sumber
SmileBASIC, 640 byte, 39 kode keluar (dari 52)
Ini pasti bisa dibuat lebih pendek. SB hanya memiliki kode kesalahan dari 0 hingga 51, dan beberapa tidak mungkin dipicu.
sumber
ZX81 BASIC> 255 kode keluar - 52 byte (daftar)
Secara teknis,
N
bisa berupa angka titik apung 24 bit dalam rentang, tetapi kami akan menganggap bilangan bulat di sini. Baris 2 setara denganIF N>0 AND N <=255 THEN GOTO 3: ELSE GOTO 1
jika ZX81 BASIC memilikiIF/ELSE
instruksi simbolisnya.sumber
the program caused some fatal unintended exception
? Ini hanya mencetak beberapa teks dan menyelesaikan eksekusi.RAND USR N
akan menyebabkan efek yang tidak diinginkan karena memanggil bagian dari ROM dari tempat yang tidak terduga bukanlah ide yang baik, karena ituRAND USR 0
telah dikecualikan karena terlalu anggun.LD BC, 0000 RST 10 RET
pada 0x1000 tetapi dipanggilRAND USR 4097
maka 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.