Kod Golfünden Çık


55

IO için bu varsayılan ayardan ilham alınmıştır .

Görev

x0 ile 255 arasında bir giriş tamsayısı verildiğinde çıkış koduyla kilitlenen bir program yazın x.

Kısıtlamalar

  • Doğrudan çıkış kodu çıkışı için amaçlanan hiçbir şeyi çağıramazsınız ( System.exit(x), geri dönüş main, vb.). Bunun yerine, programınız 1 olasılıkla programın giriş tamsayısıyla çıkmasına neden olacak bir hata veya çökmeye neden olmalıdır.
    • Bu durumda, "hata" ve "çökme" ifadeleri, programın bazı istenmeyen istenmeyen istisnalara yol açtığı anlamına gelir; burada geri dönüşü olmayan bir hataya neden olan bir yöntem, işlem veya başka bir şekilde yanlış kullanılmışsa.
    • Doğrudan hatayı fırlatarak doğrudan hataya neden olamazsınız. Bir yöntemi, işlevi veya bunun amacı farklı bir işleve hizmet eden (örneğin, salt okunur bir dizine bir dosya yazmayı denemek gibi) kullanarak buna neden olmalısınız.
  • Programınızda hesaba katılmış en az iki çıkış kodunuz olmalıdır.
  • Sinyal kullanımıyla işlemin sonlandırılması yasaklanmıştır. ( Bu tartışmada gerekçe bulunabilir )

puanlama

Programınızın puanı, kod kararının kilitlendiği desteklenen çıkış kodlarının sayısına göre belirlenir. En çok desteklenen çıkış kodu sayısı kazanır!


Açıklığa kavuşturmak için, eğer bir hata yaparsam, bu yasal değil mi?
Anthony Pham

@AnthonyPham Doğrudan yükseltmek ( throw new Exception()stil), bu yasaktır. Mevcut bir işlevin kötüye kullanılması yan ürünü ise, sorun değil.
Addison Crump,

@VoteToClose Sanırım yeterince açık değildim. Sizinle aynı fikirdeyim, ancak faktör yerine kare demek istiyordum. Ama ne olursa olsun, gerçekten önemli değil, sadece bir öneriydi
Maltysen

8
Girdiyi İngilizce yazılmış basamaklar olarak kabul etmek (örneğin one zero zero100 için) kabul edilebilir mi? Bu zorluk için bir fikrim var, ancak dilin G / Ç hakkında oldukça sıradışı fikirleri var ve bu en doğal girdi formatı.

5
Ben ele alacak Çık Kodu Golf doğru olduğundan, and a clickbait başlık. <(° _ ° <)
RaisingAgent

Yanıtlar:


48

Unix Shell (+ ncurses + BSD hizmet programları), 36, 26 bayt, 256 çıkış kodu

golfed

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

-S seçeneği kullanılırsa, tput her satırdaki hataları kontrol eder ve herhangi bir hata bulunursa, çıkış kodunu 4 olarak artı hatalı satır sayısını belirler. Herhangi bir hata bulunmazsa, çıkış kodu 0'dır. Hangi satırın başarısız olduğuna dair bir gösterge verilemez, bu nedenle çıkış kodu 1 asla görünmez. Çıkış kodları 2, 3 ve 4 normal yorumlarını korurlar.

Bir kez tput çıkış kodu 255 gider, sadece çok 253 (girişine hataları) dolayısıyla girişlerin tüm aralığı için istenen çıkış durumu hasıl 1'in vb çıkış kodu ile sonuçlanacaktır, taşıyor.

Not : tput'un başarısız olup olmayacağını, belirli bir yeteneği ayarlarken / alırken, kullandığım terminal tipine bağlıdır:xterm with 256 colors

not , sıralı veya rasgele veri basan bir BSD yardımcı programıdır ve (AFAIK) OSX sistemlerinde kutudan da temin edilebilir.

Sisteminizde mevcut değilse, jotbiraz daha uzun (29 bayt) bir sürüm kullanabilirsiniz:

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

Çevrimiçi Deneyin! (29 bayt sürümü)


Vay, bu oldukça iyi. +1
Addison Crump

45

Bash 4.2 + ekstralar, 24 çıkış kodu

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

3 çıkış kodu için @ KenY-N'ye teşekkürler. 1 çıkış kodu için @ el.pescado teşekkürler.

Doğrulama

Bütün testler openSUSE 13.2'de yapılmıştır.

$ 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
Çıkış kodu 5:http_proxy=fafa curl http://example.org
el.pescado

1
@ el.pescado Bir yıldan fazla sürdü, ancak önerinizi sonunda yerine getirdim. Teşekkür ederim!
Dennis

30

INTERCAL (C-INTERCAL), 15 kodlar, 313 + 2 = 315 bayt

        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

Çevrimiçi deneyin!

Buradaki tüm boşluklar önemsiz. (Orijinal program sekmeler içeriyordu, ancak onları SE'ye doğru şekilde hizalayacak şekilde boşluklara dönüştürdüm; INTERCAL için 8'lik bir sekme genişliği kullanmak geleneksel. Programın tüm sekmeler, boşluklarla bir sürümünü test ettim. , ve yeni satırlar silindi, ancak iyi çalışıyor.)

Derleme -abm(2 bayt ceza, çünkü -bderleyicinin deterministik olması gerekir).

INTERCAL için Her zamanki gibi, bu, örneğin formatında sayısal girdi alır ONE TWO THREEiçin 123.

açıklama

Bir C-INTERCAL programı hata verdiğinde, çıkış durumu modulo 256 hata kodudur. Sonuç olarak, mümkün olduğu kadar çok çalışma zamanı hatası üretebilecek bir program yazmayı hedefleyebiliriz. Bu program yalnızca dahili derleyici sorunlarını göstermeyen iki çalışma zamanı hatası çıkarır: ICL200I, çünkü çoğaltmak yalnızca tek iş parçacıklı bir programla uyumlu olan harici kitaplıkların kullanılmasını gerektirir (ve çok iş parçacıklı programlar daha fazla hata sunar); ve ICL533I, çünkü 533, 277 ile aynı modulo 256 değerine sahiptir ve program, ICL277I üretme kapasitesine sahiptir.

Program her zaman aynı şekilde başlar. İlk önce, WRITE INdeğişken için bir değer ( ) giriyoruz .1. Daha sonra, CREATEyeni bir sözdizimi oluşturmak için hesaplanmış bir ifade kullanırız (burada, A); ancak hesaplandığı için, sözdiziminin tanımı, değerine göre değişir .1. Son olarak, çoğu durumda A, bir hata üretmek için tanımlanmış olan yeni ifademizi çalıştırırız ; Sahip olduğumuz olası tanımların tablosu, her olası çalışma zamanı hatası için bir tanım içerir (yukarıda belirtilen istisnalar dışında).

İlk olarak, bu genel şema için iki istisna vardır. (0)geçerli bir satır numarası değildir, bu nedenle kullanıcı girerse, ZEROikinci bir satırdan (numaralı (8)) dördüncü satıra bir hesaplamalı COME FROMifade ile atlarız . Bu daha sonra hata DO Xüreten bir sözdizimi hatası içine düşer ICL000I. (INTERCAL'de, devre dışı bırakma komutları, sizin altınızda yeniden tanımlanacak sözdizimi vb. Nedeniyle çalışma zamanında sözdizimi hataları oluşur.) COME FROMAçıklamada ayrıca gerçek bir olsa bile, bir yan etkisi vardır COME FROMbir işlenen aşırı oluşturma olur .1için #1bir hat numarası ile bir çizgi yürütülen her; bu, daha sonra 21 çıktı üretilirken kullanılır. (Rastgele global yan etkiler INTERCAL'de oldukça deyimseldir.)

Diğer istisna da girdiyledir ONE TWO NINE. (129)Programda satır numarası yok , bu yüzden eksik olan bir satır numarası için bir hata alıyoruz ICL129I. Bu yüzden bu davayı ele almak için herhangi bir kod yazmak zorunda değildim.

İşte diğer hatalar ve bunlara sebep olan:

  • 123 bir NEXTyığın taşmasıdır ( DO (123) NEXT). NEXTBeyanı (diğer değiştiricileri ihtiyacı FORGETveya RESUMEgeriye dönük ne olduğunu kontrol ifadesinin tür belirlemek amacıyla). Bunlara sahip olmamak, ICL123I hatasında bir kez 80 çözülmemiş `NEXT ifadesi var.
  • 222 bir stash taşması ( DO STASH .2bir COME FROMdöngüde). Zımbalar sadece mevcut hafıza ile sınırlıdır, fakat sonuçta tükenir, bu da ICL222I hatasına neden olur.
  • 240 , sıfıra eşit bir dizidir. Bu tam olarak ne DO ,1 <- #0anlama geliyor ve ICL240I hatasına neden oluyor.
  • 241 , bir dizinin sınırları dışına atanmaktan kaynaklanır. Bu durumda ,1tahsis edilmedi ( ,INTERCAL'deki dizi tipi değişkenler için kullanılır), bu nedenle indeksleme ICL241I hatasına neden olur.
  • 19 , 65536 ( #256 $ #0) yöntemini 16 bitlik bir değişkene atar .2. Uygun değil, ICL275I hatasına neden oluyor.
  • 21 atar #2etmek .1. Bu, yeterince basit bir atamaya benzeyebilir, ancak daha önce .1kastetmek için aşırı yükledik ve komut satırında #1hiçbir -vseçenek olmadan 1 değerini değiştirmeye çalışmak ICL277I hatasına neden oluyor.
  • 148GO BACK , programın bu noktasında bulunmayan choicepoint yığınının ( ) üst girişine geri dönmeye çalışır (choicepoint yığını işlemek için herhangi bir komut çalıştırmadık, bu yüzden hala boştur). Bu ICL404I hatasına neden olur.
  • 180RETRIEVE .2 , varolmayan bir zulaya teşebbüs eder (çünkü programın bu bölümünde hiçbir şeyi saklayamadık), ICL436I hatasına neden oldu.
  • 50WRITE IN sonsuza kadar bir COME FROMdöngü içinde input ( ) ister . Sonunda EOF'yi okuduktan sonra ICL562I hatasına neden olacağız.
  • 109DO RESUME #0 , anlamsız ve özellikle bir hataya neden olduğu belgelenen ifadeyi çalıştırmaktadır (ICL621I).
  • 120 deyimi çalıştırır DO RESUME #9. NEXTHenüz bu kadar fazla ifade kullanmadık ve bu nedenle ICL120I hatası alıyoruz. (Şaşırtıcı bir şekilde, bu özel hata INTERCAL belgelerinde programdan normal bir şekilde çıkılması ve daha sonra bir hatayla programdan çıkılması yerine hataya neden olmasıyla tanımlanır.
  • 223 temel olarak hepsi hat 223'ü işaret eden ve hafızayı patlatan sonsuz bir döngüye neden olan çok iş parçacıklı ilkellerin karışıklığıdır. Sonunda, çok iş parçacıklı alt sistemde bellek tükenmesi var ve bu da ICL991I hatasına neden oluyor.
  • 121 aslında geçerli bir ifade (yorum), ancak programın sonunda beliriyor. Bu nedenle, yürütme yürütüldükten hemen sonra programın sonundan düşer ve bu da ICL633I hatasına neden olur.

Doğrulama

Bazı hatalar kasıtlı olarak programın belleğinin dışında çalışılmasını içerir, bu yüzden oldukça küçük bellek limitleri ayarlamayı öneririm. İşte programı test etmek için kullandığım shell komutu (okunabilirlik için yeni satırlar eklenmiş; kendiniz çalıştırıyorsanız silin):

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

Ve burada çıktı (alan numaralarını silmek için silinen satır satırları ve "LÜTFEN KAYNAK KAYNAKLARI" mesajları ile silinmiş), ki programın çalıştığını göstermek için kısmen ekledim, fakat INTERCAL'in saçma hata mesajlarını göstermek için:

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
Bu muhtemelen şimdiye kadar gördüğüm en büyük INTERCAL programı.
Skyler,

27

Perl, 108 bayt, 256 çıkış kodu

Bu program (ab) Test :: More modülünü kullanmaktadır. Bu dosya adında açmaya çalışırsa "" n kat n komut satırı argümanı olarak verilir. Her seferinde başarısız olur ve her çağrı bir test olarak kabul edilir. Test :: Çıkış kodu olarak başarısız testlerden daha fazla geri dönüş. plan tests => $ARGV[0]%255255 çıkış kodunu almak için gereklidir.

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

Golf: perl -MTest::More -e'plan tests,$%%255if$%=<>;ok 0for 1..$%'51 bayt (38 bayt + 13 bayt -MTest::More<space>). Stdin'de girdi alır.
ThisSuitIsBlackNo

27

C90 (gcc), 256 çıkış kodu, 28 27 18 bayt

main(){getchar();}

Bu zeki ya cheaty olup olmadığından emin değilim, ama yazıldığı gibi kurallarını ihlal sanmıyorum: Teknik olarak kullanmaz exit, returnveya herhangi bir hata mekanizması atma, ancak sadece tanımsız davranış ve aslında o gcc dayanır Bu zorluk kadarıyla oldukça uygun bir şey yapar.

Çevrimiçi deneyin!

Nasıl çalışır

Bu sadece getcharSTDIN'den bir byte okumak için kullanılır. Kendi başına, bu hiçbir şey yapmaz.

Ancak, uyumlu bir C90 programının bir returnifade veya eşdeğeri bir şeyle bitmesi gerekir ; her şey tanımsız davranış. gcc, üretilen düzeneği retyine de sona erdirir , böylece EAX yazmacında rasgele olan değer program tarafından döndürülür. Neyse ki, glibc's getcharEAX'de STDIN'den okur baytı depolar, bu yüzden bu baytın değeri programımızın çıkış kodudur.


Bunun , destekleyen jsh gibi bir kabuk kullanarak 8 bitlik bariyeri kırmak için değiştirilip değiştirilemeyeceğini görmek ilginç olacaktır set -o fullexitcode.
zeplin

1
Zekice. Fakat program aslında çökmedi. Spesifikasyonun “ölümcül istisna / geri dönüşü olmayan başarısızlık / çökmeye neden olmak” olup olmadığını normal şekilde döndürmesi
dim

Her iki durumda da, bu harika.
Quentin

4
@ dim Sanırım bu senin çöküş tanımına bağlı. Ana biten değil returnveya exitC90 standart gider kadarıyla bir hata olduğunu ve hata olduğunu gösteren bir çıkış kodu ile sonuçlanır. Hepsi de kalbin yaptığı bir kaza.
Dennis

Çarpışma düzgün çalışması için durmuş bir programdır. Programınız doğru şekilde yapması için elinizden geleni yapar, girişten bir karakter okur ve sonra durur. Bu yüzden çıkış kodu bir hata olduğunu gösterse de çökmedi.
17'de bulunan Marus 19

19

X86, 230 bayt, 8 çıkış kodunda bash kabuğu altında C (gcc)

Okunabilirliğe yardımcı olmak için yeni satırlar eklendi. Yorumlar puan olarak göz ardı edildi.

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

Bash kabuğunun bir özelliği:

Bir komut ölümcül bir sinyalde N sonlandığında, bash çıkış durumu olarak 128 + N değerini kullanır.

Tek yapmamız gereken ac programının içinden çeşitli sinyalleri tetiklemektir. Bu noktada, basitçe yapmanın kill(n-128);yasak olduğunu varsayıyorum . Bunun yerine, çeşitli sinyalleri tetikleyen ve ilgili hata kodlarının arama kabuğunda kullanılabilir olmasını sağlayan kodu çalıştırıyoruz.

Çıkış kodları 0, 130, 133, 134, 136, 139, 141, 142'dir.

Çevrimiçi deneyin . Dönüş kodunu görmek için "Hata ayıklama" bölümünü genişletin.

Bu kesinlikle daha derinden golf oynayabilir. Ama daha fazla sinyal eklemekle daha çok ilgilenirdim.


Önceden var olan işlevler veya işlemler nedeniyle bu sinyallerin sizin kodunuzun dışında olduğunu varsaymak doğru olur mu?
Addison Crump

1
@VoteToClose evet, doğru. Örneğin __asm("UD2"), çekirdek tarafından programa SIGILL sinyali şeklinde iletilecek olan bir CPU istisnasına neden olacak olan x86 "tanımsız komut" u çalıştırır. İçin socketpairbiz çalışıyoruz Örneğin, SIGPIPE kernel, glibc tarafından gönderilecek write()bir boruya close()diğer ucunda d.
Dijital Travma

1
O zaman onunla bir sorunum yok. : P
Addison Crump,

1
1) iki karakter kullanırsanız int3ve kullanmazsanız ve int $32) bir karakter volarak beyan ederseniz int**, temel olarak chargösterici aritmetiğindeki veri tipinin doğruluğuna güvenmediğiniz göz önüne alındığında , artı 3) iki karakter kullanırsanız *pyerine p[0], veya 4) altı karakter, eğer fdonları yaratan tüm sistemlerin döndürdüğü öngörülebilir sayılara güvenirseniz, yerine p[0]ve p[1]belirli değerlere yakın değerlere güveniyorsanız . Son olarak, kapanıp yazarken aynı hatadan pipe(fd)çok daha kısadır socketpair(...)ve aynı hatayı oluşturur fd[0]. fd[1].
Idonotexist,

2
Birkaç ek golf önerileri: 1) &63yerine kullanın -128. 2) yerine sleep(2)ile for(;;). 3) yerine c=*(int*)cile atoi(0). 4) yerine c/=c-2ile c/=0.
nwellnhof

10

Python 2, 13 Bayt, 2 çıkış kodu

1/(input()-1)

0 girerseniz 1/-1, -1 olanı mükemmel olan ve bu nedenle 0 kodundan çıkılan 0 çıktısını almaya çalışır. 1 girerseniz, 1/0hangisini yükseltirse , 1 ZeroDivisionErrorolan bir çıkış kodunu alırsınız. IDE ile, yalnızca 0 olur. ve 1 çıkış kodları için ...

Çıktılar:


görüntü tanımını buraya girin


görüntü tanımını buraya girin


10

PHP, 15 bayt, 2 çıkış kodu

die/ Olmadan exitPHP hiçbir şey döndüremez ama 0veya 255(afaik; muhtemelen ~1), bu yüzden ...

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

Komut satırı argümanı sahte ise, değerlendirir 1ve ile çıkar 0. Değilse, bir işlevi çağırmaya çalışır ve ile çıkar <b>Fatal error</b>: Uncaught Error: Call to undefined function p().

İle koş -r.


5
Bu doğru değil. exit()Bu meydan okuma için kullanamayacağınız bir çıkış durumu belirler. Ancak kodunuz da geçersiz. Çıkış durumunu 255'e ayarlar
saat

@ aross: Hmm Her zaman hatanın çıkacağını varsaydım 1. Çıkış kodlarının bir listesini aradım, ancak bir tane bulamadım.
Titus

10

Excel VBA, 414 514 533 + 3 Bayt, 14 çıkış kodu

Bir şekilde girdi Alır Conditional Compilation Argument, n=[input value]ve o Buradaki sayı ilişkili hata kodu üretir.

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

n=[Value]Koşullu derleme araması için +3

Girişleri nerede kullanır n=

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

Not: VBA'da çıkış kodları yoktur 0veya 1. VBA'nın kullanabileceği en düşük numaralı iki çıkış kodu olan 3ve bunların çözümlerini dahil ettim.5


1
Bu cevabı reddetmeyeceğim, çünkü çıktı türleri için dil yeterliliği nedeniyle izin vermeme izin vermiyor.
Addison Crump,

1
#Burada ne iş yapıyor ?
BruceWayne

#ifVe #ElseIfkoşul doğruysa onu takip tabloların tek derlenmektedir yani koşullu derleme ifadeler
Taylor Scott

1
Öyleyse, eğer doğru olmazlarsa, ifadeler derlenmez ... kullanılmamasından farklıdır #, ifadelerin doğru olup olmadıkları nerede derlenirler? Ifİfadelerin nasıl çalıştığını biliyorum , ama gerçekte neyin derlendiğine karar vermekte yeniyim , bu kadar basit bir soru için üzgünüm.
BruceWayne

1
@BruceWayne, evet, aynen böyle. Bu satırlar belirli hataları atmak için tasarlandığından , yalnızca istenen hata kodunu üreten satırların belirli bir zamanda derlenmesi gerekir. Bunu yapmak #ifiçin kullanılır Ifya Select Caseda sadece truthykoşullu ifadeler aslında derlenir. Özellikle bu durumda, bu hata kodu ile çıkmasını program tutar 3, Return without GoSubher yürütme değil, sadece bu kodla çıkarkenn=3
Taylor Scott

7

Turtlèd, 4 bayt, 2 çıkış kodu

Daha fazla çıkış kodu almanın bir yolu olup olmadığını bilmiyorum ... tercüman dilinde daha da fazla yol var mı

Birkaç dört uzunluklu cevap buldum

' ?;

Çevrimiçi deneyin!

!.(0

Çevrimiçi deneyin!

?;(*

Çevrimiçi deneyin!

Bu nasıl çalışır:

' ?;

tercümanımda, bellekteki ızgarada birden fazla satır olduğunda ve üzerinde boşluk olmayan karakterler bulunmadığında hatalara neden olan bir hata özelliği vardır. bu program başlangıç ​​hücresindeki * bilgisini siler, '[space]negatif olmayan tamsayı girişini alır ?(gerçekten 0 veya 1) ve ;sıfıra düşerse ızgara yalnızca bir satır alır ve hata yapmaz, aksi takdirde aşağı gider ve hata ortaya çıkacak

!.(0

Parantezler ve sayfalar ayrıştırılmaz, sadece çalışma zamanında çalıştırılırlar: "Hücre sembolü doğru değilse, eşleşen parola atla". Bu programda, input ( !) biri programın hücreye yazmasına neden olur ( .), hücre sembolünün 0 olup olmadığını kontrol eden paren'i çalıştırır, eşleşen parene atlamayı dener, fakat hiçbiri olmadığı için hata atar. . eğer sıfırsa, onu yazar, parantezleri kontrol eder, kendini 0'da bulur ve sonra yok sayar ve program biter

?;(*

önceki cevabın unsurları ve birincisi vardır. negatif olmayan tamsayı girişi alır, o kadar aşağı hareket eder ve hücrenin '*' olup olmadığını kontrol eder, eğer değilse, var olmayan bir ekstra para arayarak arar. giriş 1 ise, başlangıç ​​alanından çıkar ve hücrenin bir boşluk olduğunu görür ve hata sıfır ise başlangıç ​​alanında kalır ve pareni yok sayar.


7

Javascript (düğüm), 19 bayt, 2 çıkış kodu

Tam program:

+process.argv[2]&&a

İşlev:

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

process.argvçalıştırılabilir düğüme giden yolu, yürütülen javascript dosyasının yolunu ve komut satırı argümanlarını içeren bir dizidir. Bu durumda, bu ya "1"da olacaktır "0". Dize, unary +işleciyle bir sayıya dönüştürülür . Sayı sıfırsa, tembel &&operatör sağ tarafı değerlendirmez, sayı trutiyse (sıfır değil), sağ tarafı &&değerlendirilir ve tanımsız bir değişkene başvurduğu için bir hata atılır ve program var çıkış kodu 1 ile.

Fonksiyon girişi bir sayı olarak bekler. Girdi gerçekse, işlev kendisini çağırır ve düğüm çalışma zamanını yığın taşmasıyla kilitler. Giriş 0 ise, tembel &&operatör sağ tarafını değerlendirmeden 0 değerini döndürür.


@VoteToClose Tanımlanmamış bir değişkene değiştirildi
corvus_192

Bu işe yarıyor. : P
Addison Crump,

Tam program kısaltılabilir +process.argv[2]&&a.
user2428118

@ user2428118 Haklısın
corvus_192

Sadece merak dışında, ReferenceError.prototype.name=process.argv[2]?a:0geçerli olur mu?
Patrick Roberts

6

Perl 6 , 57 bayt, 256 çıkış kodu

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

Deneyin
Bu, Perl 5 örneğinin bir çevirisidir.

Expanded

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 bayt, 2 çıkış kodu

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

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

JVM, aramazsanız çıkış kodları olarak yalnızca 1 ve 0'ı destekler System.exit.

İlk program 1/0, ilk argüman olup olmadığını, 1JVM'yi 1 çıkış koduyla kilitleyeceğini hesaplamaya çalışır. Argüman 0 ise, başarılı bir şekilde çıkar.

Argümanı tam sayıya dönüştüren ikinci program, birini çıkarır ve 1'i bu sayıya bölmeye çalışır. Eğer argüman 1 ise hesaplar 1/0, böylece JVM kilitlenir; eğer argüman 0 ise, hesaplar 1/-1ve çıkar.


5

Python 3 , 15 bayt, 2 çıkış kodu

Açıkçası, bu Python 2 çözümünden daha uzun , çünkü Python 3'te arama yapmadan değişmez bir girdi alamıyoruz eval. Ancak, string karşılaştırma tekniklerini ilginç bir şekilde kullanabiliriz ...

1/(input()<'1')

Girdi, dize 0ya da 1- 1 ise, koşul 0 (false) olarak değerlendirilir ve sonuçta 1 / 0açıkça çarpışan bir hesaplama denemesi yapılır (çıkış kodu 1). Aksi takdirde, hiçbir şey olmuyor ve Python normal çıkış kodu 0 ile çıkıyor.

Bildiğim kadarıyla Python diğer çıkış kodlarıyla çarpışamıyor.


5

Java, 71 66 bayt, 2 çıkış kodu

Holger sayesinde 4 bayt kaydedildi

Tam program:

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

Bir argüman olarak int alma işlevi:

i->1/(i-1)

Program, bir tamsayı (0 veya 1) elde etmek için ilk bağımsız değişkenin ilk karakterini alır (veya '0'veya '1've 48'i çıkarır (ascii değeri '0')). giriş 1'dir, program bir ile ArrayIndexOutOfBoundsExceptionçarpışır, çünkü argüman dizisinin sadece 0 konumunda (sıfır indeksli) bir eleman vardır.


Sen değeri atamak veya dizi endeksi olarak örneğin, başka bir şekilde kullanabilirsiniz a[a[0].equals("1")?1/0:1]="";eşit düzeyde olur, int x=a[0].equals("1")?1/0:1;. Ancak bir kaç baytlık tasarruf ArrayIndexOutOfBoundsExceptionyerine provoke etmek için programı daha da değiştirmek ArithmeticException:interface I{static void main(String[]a){a[a[0].charAt(0)-'0']="";}}
Holger

4

Python 2, 11 bayt, 2 çıkış kodu

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

Üç farklı hata için üç farklı 11 bayt çözüm! (Sadece eğlence için, bu puan vermez.) Varsayılan olarak, Python başarılı çıkış için sadece 0, hata için 1 çıkış kodlarına sahiptir. Başarılı koşular hiçbir şey çıkarmaz.

 1>>-input()

Giriş 1'de "ValueError: negative shift count" değerini verir. 0 girişinde, sıfır kaydırma sayımı başarılı olur ve 1 değerini verir.

1/~-input()

Giriş 1 üzerinde verir "ZeroDivisionError: tamsayı bölme ya da sıfıra modulo" nedeniyle ~-input(), aka input()-1giriş 1 0. olmak 1/-1verir -1. 0**-input()ayrıca çalışırdı.

0<input()<x

1 numaralı girişte "NameError: 'x' adı tanımlanmadı" ifadesini veriyor. 0 girdisinde, bu ilk eşitsizlik 0<0False olarak değerlendirilir, bu nedenle gerisi değerlendirilmez ve sonuç sadece False olur.


2

Node.js (ES6), 77 bayt, 2 çıkış kodu

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

2

Jöle , 4 çıkış kodu, 18 bayt

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

Çıkış kodları 0 , 1 , 137 (öldürüldü) ve 139 (bölümlendirme hatası) desteği.

Çevrimiçi deneyin!

Nasıl çalışır

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 bayt, 39 çıkış kodu (52 üzerinden)

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

Bu kesinlikle daha kısa yapılabilir. SB sadece 0'dan 51'e kadar hata kodlarına sahiptir ve bazılarının tetiklenmesi imkansızdır.


0

ZX81 BASIC> 255 çıkış kodları - 52 bayt (listeleme)

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

Teknik olarak, Naralıktaki herhangi bir 24 bit kayan nokta sayısı olabilir, ancak burada tamsayıları varsayacağız. Satır 2, IF N>0 AND N <=255 THEN GOTO 3: ELSE GOTO 1ZX81 BASIC'in IF/ELSEsembolik talimatlarında bulunup bulunmadığına eşdeğerdir .


3
Bu nasıl tatmin eder the program caused some fatal unintended exception? Bu sadece bazı metinleri yazdırır ve yürütmeyi tamamlar.
AdmBorkBork, 21.07

Haklısın - sabahları daha uyanık olmam gerekiyor.
Shaun Bebbers

RAND USR NROM'un bir bölümünü beklenmedik bir yerden çağırmak iyi bir fikir olmadığı için istenmeyen etkilere neden olacaktır, bu nedenle RAND USR 0çok zarif olduğu için dışlanmıştır.
Shaun Bebbers

Bunun gerçekten programın çökmesine neden olacağı konusunda biraz daha detay verebilir misiniz? ZX81 BASIC'e yakından aşina değilim.
AdmBorkBork

ROM, 0x0000 - 0x1fff; Doğru yerde başlarsanız ROM rutinlerini çağırmak işe yarar. Z80'de herhangi bir makine kodu yordamına bir veya daha fazla bayt başlatmak beklenmedik etkilere neden olur. Eğer LD BC, 0000 RST 10 RET0x1000'de basit bir numaraya RAND USR 4097sahipseniz ama çağrılan LD operandını kaçıracaksınız ve makine kodu çarpık olacaktır. Tüm ROM çağrılarını hatırlamıyorum, ancak tüm yasal / zarif sonuçları çözeceğim ve daha sonra hariç tutacağım.
Shaun Bebbers
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.