Bu kod * bu * ve * bu * hataları, gerçekten bunlarda yazılı mı?


25

İlham verici bir şekilde aradığınız dil ben değilim!

Meydan okuma

İki farklı programlama dili seçin ve aşağıdaki satırı stdout'a (veya eşdeğeri) yazdıran bir program yazın:

This program errors out in <the current language> :P

ve sonra iki dilin her birinde farklı tür hatalar oluşturur.

kurallar

Bazı kurallar orijinal mücadeleden alınmıştır.

  • Çıktıda, dil isimlerinin tam olarak takip etmesi gerekir:
    • Listelenen adı TIO isteğe sürüm numarasını ve / veya uygulama adını hariç (kullanırsanız örneğin JavaScript (Node.js)sizin dillerinden biri olarak kullanabileceğiniz JavaScriptdil adı için değil, JSya da Javascript.)
    • Tercih ettiğiniz dil TIO'da mevcut değilse, resmi web sitesindeki tam ad (veya GitHub repo).
  • Her iki program da kullanıcıdan herhangi bir girdi almamalıdır.
  • Yorumları iki dilde de kullanabilirsiniz.
  • Aynı dilin iki farklı sürümü, farklı diller olarak sayılır.
    • Bu yapılırsa, program ana sürüm numarasını vermeli ve iki farklı küçük sürümde çalışıyorsa küçük sürümü de bildirmelidir.
    • Önceden oluşturulmuş sürüm işlevlerini kullanmamalısınız (buna çalışma zamanında zaten değerlendirilmiş olan değişkenleri içerir).
  • Aynı dilde iki farklı komut satırı bayrağı, aynı zamanda , bayraklar kod parçaları içermediği sürece, bu meta oyuna göre farklı diller olarak sayılır ( -Dblahblah...C'deki gibi ).
    • Bu yapılırsa, program ayrıca kullanılan bayrağı da çıkarmalıdır.
  • Her iki hatanın da aynı anlambilimci tarafından üretilmediği sürece (örneğin "sıfıra bölme", ​​"bölümlendirme hatası" veya "aralık dışı dizin") iki hata farklı olarak kabul edilir.
    • Bir dilin çalışma zamanı bir hatadan sonra çıkmaz, ancak hatayı bir şekilde kullanıcıya bildirirse, geçerli bir hatadır.
    • Bir dil hata mesajlarını ayırt etmiyorsa, ancak hataya sebep olan bilinen bir nedenler listesine sahipse , hata mesajını değil nedenini belirtmelisiniz.
      Örnek olarak ><>, yalnızca bir hata mesajı vardır something smells fishy..., ancak esolangs wiki sayfasının hata nedenlerinin bir listesi vardır.
  • Sözdizimi hatasına, çağrı yaparak eval()veya benzer şekilde oluşturulmadıkça izin verilmez .
  • Elle bir şey atma ( throw(JS), raise(Python), die(Perl) veya benzeri) izin verilir, ancak hepsinin bir tür hata olduğu kabul edilir.
  • 2B veya golf kurgularında geçersiz komutla hataya da izin verilir (ve bir tür hata olarak kabul edilir).

Örnekler

Python ve Yakut

  • Python: This program errors out in Python :Pstdout'a, sonra tanımsız tanımlayıcı
  • Ruby: This program errors out in Ruby :Pstdout'a, sonra sınırların dışına dizine gir

C89 ve C99

  • C89: This program errors out in C 89 :Pstdout'a, sonra sıfırla böl
  • C99: This program errors out in C 99 :Pstdout'a, sonra segmentasyon hatası

Sürüm numarasının her zaman dil adından boşlukla ayrılması gerektiğini unutmayın .

Python 2.7.9 ve Python 2.7.10

  • Python 2.7.9: This program errors out in Python 2.7.9 :Pstdout'a, ardından eval üzerinde sözdizimi hatası
  • Python 2.7.10: This program errors out in Python 2.7.10 :Pstdout'a, sonra dict'de anahtar hatası

Perl ve Perl -n

  • Perl: This program errors out in Perl :Pstdout'a, ardından geçersiz zaman biçimi
  • Perl -n: This program errors out in Perl -n :Pstdout'a, daha sonra varolmayan bir dosyayı açmaya çalışın

Kazanma koşulu

Bu , yani bayt cinsinden en kısa kod kazanır. Ancak her zaman çok kısa olmasa bile eğlenceli veya ilginç bir cevap göndermeniz teşvik edilir.



Hatanın programı durdurması gerekiyor mu?
Jo King,

Başlangıçta öyle düşündüm. Bununla birlikte, "sıfıra bölme" gibi bir şeyden sonra (muhtemelen tanımsız davranışla) devam edebilecek bazı diller varsa, programın bu hatayla karşılaştığını kabul etme mekanizması olan bazı mekanizmalar varsa, buna izin vereceğim.
Bubbler

Sanırım cevabı zaten biliyorum, ama tam olarak: cümle This program errors out in ...sadece boşluklar yerine karışık sekmeler / boşluklar içerebilir mi?
Kevin Cruijssen

İlgili (iki farklı dilde iki farklı metin yazdırın).
Kevin Cruijssen

Yanıtlar:


33

Python 2 / Python 3 , 60 bayt

print("This program errors out in Python %d :P"%(3/2*2))*1;a
  • Python 2 var NameError: name 'a' is not defined
  • Python 3 var unsupported operand type(s) for *: 'NoneType' and 'int'

Python 2:

  • /tam sayı bölümü, 3/2 1; int (3/2 * 2) 2'dir.
  • print bir cümledir, öyleyse ilk okunan ifade print((...)*1), işte bir *1kez tekrarlanması anlamına gelir.
  • second deyimi, hataya neden olan varolmayan bir değişkene başvuruda bulundu.
  • Çevrimiçi deneyin!

Python 3:

  • '/' değişken sayı bölümü, 3/2 1.5; int (3/2 * 2), 3'tür.
  • print bir fonksiyondur, yani ilk ifade olarak okunur (print(...))*1.
  • işlev printdöndürür None; Çarpma çalışmıyor None x int, bu yüzden "desteklenmeyen işlenen" i rapor ediyor.
  • Çevrimiçi deneyin!

15

C ve C ++, 114 101 bayt

-4m2 sayesinde 13 bayt !

#include<stdio.h>
main(){auto d=.5;printf("This program errors out in C%s :P",d?"++":"");2[&d]+=1/d;}

C ++ 'da segmentasyon hatası, C' de kayan nokta istisnası

autointC olarak varsayılan olarak ayarlanmıştır, böylece (int).5olur 0, onunla bölünmeye çalışmak temelde sıfıra bölünür.

C ++ ' 1/dda 2, adrese ekleme dve bu adresin değiştirilmeye çalışılması' değeri bir segfault atar.

C ++ 'da deneyin!
C de dene!


1
Eğer yardımı, ancak 2 ve 0 C / C ++ harita eğer şunu kullanabilirsiniz emin değil "++"+nnerede, nolduğu 0C ++ ve 2C
Conor O'Brien

2
d?"++":""9 karakter, "++"+4*d8 karakter. Ancak geriye C / C ++ alır. İç çekmek.
Yakk

1
int main(){auto d=.5;printf("This program errors out in C%s :P",d?"++":"");2[&d]+=1/d;}(105) neden olduğunu bilmeme rağmen
l4m2

1
Ayrıca intatlanabilir
l4m2

Öner L"⬫"+!dyerined?"++":""
ceilingcat

14

JavaScript + HTML / HTML + JavaScript, 160 bayt

<!--
document.write`This program errors out in JavaScript + HTML :P`()
--><script>document.write`This program errors out in HTML + JavaScript :P`+X</script>

<!--
document.write`This program errors out in JavaScript + HTML :P`()
--><script>document.write`This program errors out in HTML + JavaScript :P`+X</script>

Bu iki dil sayılır mı emin değilim, ama komik.


Bu nedenle, eski tanımsız tanımlayıcıdır, ikincisi, işlevsiz bir türdeki işlev çağrısıdır. Teknik olarak eski HTML'yi ve sonraki JavaScript'i düşünürdüm, ama gerçekten güzel bir fikir.
Bubbler

<!-- ... -->Tek satırlı yorum işaretleyicileri olarak iyi bir kullanım ( bunun geriye dönük uyumluluk nedenleriyle ilgili olduğunu biliyorum)
Shieru Asakoto 12:18

12

Java 8 ve C99, 172 bayt

//\
interface a{static void main(String[]a){System.out.print("This program errors out in Java 8 :P");a[1]=""/*
main(n){{n=puts("This program errors out in C99 :P")/0/**/;}}

'Abc' ve 'cba' mücadelesine verdiğim cevaba dayanarak .

Java 8'de deneyin - ArrayIndexOutOfBoundsException: 1 ile sonuçlanır .
C içinde deneyin - Kayan nokta istisnasına yol açın: sıfıra bölmek tanımsız .

Açıklama:

//\
interface a{static void main(String[]a){System.out.print("This program errors out in Java 8 :P");a[1]=""/*
main(n){{n=puts("This program errors out in C99 :P")/0/**/;}}

Yukarıdaki Java ile işaretlenmiş kodda görebileceğiniz gibi, ilk satır şu nedenlerden dolayı bir yorumdur //ve C kodu aşağıdakilerden kaynaklanan bir yorumdur /* ... */:

interface a{static void main(String[]a){System.out.print("This program errors out in Java 8 :P");a[1]="";}}

Bu yüzden STDOUT'a yazdırır ve sonra ikinci program argümanına erişmeye çalışır (hiçbiri verilmediğinde), bu yüzden ArrayIndexOutOfBoundsException öğesini üretir .


//\
interface a{static void main(String[]a){System.out.print("This program errors out in Java 8 :P");a[1]=""/*
main(n){{n=puts("This program errors out in C99 :P")/0/**/;}}

C ile vurgulamanın nasıl doğru şekilde etkinleştirileceğinden emin değilsiniz, çünkü lang-csonuçta Java ile aynı şekilde vurgulanır. Ancak //\, Java kodu olan bir sonraki satırı yorumlayacaktır.

main(n){{n=puts("This program errors out in C99 :P")/0;}}

Böylece STDOUT'a yazdırır ve ardından sıfır hatayla bölme verir.


Ben düşünüyorum Bu C89 ve C99 ile çalışacaktır. Beni buna tutma.
SIGSTACKFAULT

//C99 ile C'ye ilave edildi.
18'de

İkinize de teşekkürler, olarak değiştirdim C99.
Kevin Cruijssen

Neden a[1]yerine a[0]?
xehpuk

@ xehpuk Özel bir sebep yok. Hangi rakamı kullandığım önemli değil 1ve baştan beri doldurmuştum . Kullanılabilirdi 0, 9vb. Bu gönderiyle ilgili düzenleme yapacak bir şeyim varsa 0, aynı zamanda onu da değiştireceğim .
Kevin Cruijssen

11

Java 8 ve Boşluk , 439 431 428 408 bayt

                         






























 interface a{static void    main(String[]a){System.out.print("This program errors out"+
" in Java 8 :P");a[0]="";}}














Java 8'de deneyin - ArrayIndexOutOfBoundsException: 0 ile sonuçlanır .
Boşlukta deneyin - kullanıcı hatasıyla sonuçlanır (Infix Plus'ı yapamazsınız) .

Açıklama:

Java 8:

interface a{static void main(String[]a){System.out.print("This program errors out"+
" in Java 8 :P");a[0]="";}}

Bu yüzden STDOUT'a yazdırır ve sonra ilk program argümanına erişmeye çalışır (hiçbiri verilmediğinde), bu yüzden ArrayIndexOutOfBoundsException öğesini üretir .


Beyaz boşluk:

[S S T  T   T   T   T   T   N
_Push_-31_P][S S T  T   T   S T S T N
_Push_-53_:][S S T  T   S S T   T   T   T   N
_Push_-79_space][S S T  T   S T S N
_Push_-10_e][S S T  T   T   S S N
_Push_-12_c][S S T  T   T   T   S N
_Push_-14_a][S S S T    N
_Push_1_p][S S S T  S S N
_Push_4_s][S S T    T   S T S N
_Push_-10_e][S S S T    S T N
_Push_5_t][S S T    T   T   S N
_Push_-6_i][S S T   T   T   T   N
_Push_-7_h][S S T   T   T   S S S N
_Push_-24_W][S T    S S T   S T S N
_Copy_0-based_10th_(-79_space)][S S T   T   N
_Push_-1_n][S S T   T   T   S N
_Push_-6_i][S T S S T   S N
_Copy_0-based_2nd_(-79_space)][S S S T  S T N
_Push_5_t][S S S T  T   S N
_Push_6_u][S S S N
_Push_0_o][S T  S S T   T   N
_Copy_0-based_3rd_(-79_space)][S S S T  S S N
_Push_4_s][S S S T  T   N
_Push_3_r][S S S N
_Push_0_o][S S S T  T   N
_Push_3_r][S N
S _Duplicate_top_(3_r)][S S T   T   S T S N
_Push_-10_e][S T    S S T   T   S N
_Copy_0-based_6th_(-79_space)][S S T    T   S N
_Push_-2_m][S S T   T   T   T   S N
_Push_-14_a][S S S T    T   N
_Push_3_r][S S T    T   S S S N
_Push_-8_g][S S S S (_Note_the_additional_S_here)N
_Push_0_o][S S S T  T   N
_Push_3_r][S S S T  N
_Push_1_p][S T  S S T   T   T   N
_Copy_0-based_7th_(-79_space)][S S S T  S S N
_Push_4_s][S S T    T   T   S N
_Push_-6_i][S S T   T   T   T   N
_Push_-7_h][S S T   T   T   S T T   N
_Push_-27_T][N
S S N
_Create_Label_LOOP][S S S T T   S T T   T   T   N
_Push_111][T    S S S _Add][T   N
S S _Print_as_character][N
S N
N
_Jump_to_Label_LOOP]

Harfler S(boşluk), T(sekme) ve N(yeni satır) yalnızca vurgulama olarak eklenmiştir.
[..._some_action]sadece açıklama olarak eklendi.

Vurgulanan bu sürümü deneyin.

Boşluk, boşluklar, sekmeler ve yeni satırlar dışında her şeyi yok sayan yığın tabanlı bir dildir. İşte sözde kodda aynı program:

Push all unicode values of "P: ecapsetihW tuo srorre margorp sihT", minus 111
Start LOOP
  Push 111
  Add the top two stack values together
  Print as character
  Go to the next iteration of the LOOP

Tüm değerleri yazdırır tamamlanmaz hata verir ve yığın üzerinde iki öğe gerektiren Add ( TSSS) işlemini yapmaya çalıştığında yığın boştur .

Whitespace'de yaptığım önceki ASCII ile ilgili zorluklar için de kullandığım bu Java programı111 ile sabiti oluşturdum . Ayrıca, baytları kurtarmak için boşluklar için bazı kopyalar kullandım.

Unutulmaması gereken önemli bir şey, Java programını Whitespace'in yanıtına yerleştirmek için kullandığım numara. Whitespace’de bir numaranın nasıl itildiğini açıklayarak başlayayım:

Sbaşlangıçta: Yığın Manipülasyonunu Etkinleştir;
S: Sayı olarak gelenleri itin;
Sveya T: Sırasıyla Pozitif veya Negatif;
Bazı Sve / veya T, ardından N: İkili sayı, nerede T=1ve S=0.

İşte bazı örnekler:

  • 1 değerini itmek SSSTN;
  • -1 değerini itmek SSTTN;
  • 111 değerine basmak olacaktır SSSTTSTTTTN.
  • 0 değerini Pushing olabilir SSSSN, SSTSN, SSSN, SSTN, SSSSSSSSSSSSN, vb (kullandığınızda SSSN(veya SSTN) biz onun işareti belirtilen sonra örtülü olarak 0, çünkü biz, ikili bölümünü belirtmek gerekmez.)

Yani sadece SSSNdeğeri itmek için yeterli 0( obu durumda harf için kullanılır ). Ama, ilk iki yüzden Java programı bu golfed Boşluk programında, ben, ilave bir alan gerekli yere oler ile itilir SSSN, ancak üçüncü bir ile itilir SSSSNanda Java programının cümle için yeterli boşluk var, bu yüzden.


10

CBM BASIC ve 6502 makine kodu (C64), 142 144 bayt

Bir sözdizimi hatası izin verilmediğini fark ettikten sonra 2 bayt eklemek zorunda kaldı ....


Dosyanın Hexdump .prg:

01 08 50 08 00 00 8F 5A 49 52 49 41 A9 17 8D 18 D0 A2 30 BD 30 08 20 D2 FF E8
E0 4B D0 F5 A2 30 BD 05 08 20 D2 FF E8 E0 44 D0 F5 A9 0D 20 D2 FF A2 1A 4C 37
A4 22 36 35 30 32 20 4D 41 43 48 49 4E 45 20 43 4F 44 45 20 3A D0 22 20 20 20
20 20 00 8D 08 01 00 97 35 33 32 37 32 2C 32 33 3A 99 22 D4 48 49 53 20 50 52
4F 47 52 41 4D 20 45 52 52 4F 52 53 20 4F 55 54 20 49 4E 20 C3 C2 CD 2D C2 C1
D3 C9 C3 20 3A D0 22 2C 58 AD 50 00 00 00

CBM BASIC görünümü , C64'ün editöründe listelendiği gibi:

0 remziriastepgosubinput#new0exp0 dim.clrsavekinput#stepnew0exp<white> dim.clrsavedinput#stepstep
 dim.newl7to"6502 machine code :P"
1 poke53272,23:print"This program errors out in CBM-BASIC :P",x/p

orijinal liste

Dikkat : Bu programa BASIC editöründe doğru şekilde girmek mümkün değildir. Bu programı BASIC editöründe düzenlemeye bile çalışmayın , çökecek. Yine de, çalıştırılabilir bir BASIC programı;)


6502 makine kodu görünümü :

         01 08                          ; load address

.C:0801  50 08       BVC $080B          ; jump to real start of mc

         ; line number (00 00), REM (8F) and "ziria"
.C:0803  00 00 8F 5A 49 52 49 41

.C:080b  A9 17       LDA #$17
.C:080d  8D 18 D0    STA $D018          ; set upper/lower font
.C:0810  A2 30       LDX #$30
.C:0812  BD 30 08    LDA $0830,X
.C:0815  20 D2 FF    JSR $FFD2          ; print "This program errors ..."
.C:0818  E8          INX
.C:0819  E0 4B       CPX #$4B
.C:081b  D0 F5       BNE $0812
.C:081d  A2 30       LDX #$30
.C:081f  BD 05 08    LDA $0805,X
.C:0822  20 D2 FF    JSR $FFD2          ; print "6502 machine code :P"
.C:0825  E8          INX
.C:0826  E0 44       CPX #$44
.C:0828  D0 F5       BNE $081F
.C:082a  A9 0D       LDA #$0D
.C:082c  20 D2 FF    JSR $FFD2          ; print a newline
.C:082f  A2 1A       LDX #$1A           ; error code for "can't continue"
.C:0831  4C 37 A4    JMP $A437          ; jump to error handling routine

.C:0834  22 ; '"'

         ; "6502 machine code :P"
.C:0835  36 35 30 32 20 4D 41 43 48 49 4E 45 20 43 4F 44 45 20 3A D0

         ; '"', some spaces, and next BASIC line
.C:0849  22 20 20 20 20 20 00 8D 08 01 00 97 35 33 32 37 32 2C 32 33 3A 99 22

         ; "This program errors out in CBM-BASIC :P"
.C:0860  D4 48 49 53 20 50 52 4F 47 52 41 4D 20 45 52 52 4F 52 53 20 4F 55 54
.C:0877  20 49 4E 20 C3 C2 CD 2D C2 C1 D3 C9 C3 20 3A D0

.C:0887  22 2C 58 AD 50 00 00 00

Çevrimiçi demo ,runBASICsys 2049olarak çalışmak üzere yazın, makine kodu olarak çalıştırmaklistiçin, BASIC kodu olarak yorumlandığını göstermek için.

BASIC olarak division by zero error in 1çalıştırmak, makine kodu olarak çalıştırmak için bircan't continue error

ekran görüntüsü


Açıklama:

Bir .prgdosyanın ilk iki baytı, endian cinsinden yükleme adresidir, işte bu $0801(ondalık 2049), ki burada C64'teki BASIC programlarının başlangıç ​​adresidir. runBASIC yorumlayıcısında bu programı başlatırken sys 2049, adrese bir makine kodu programı çalıştırma komutu verilir 2049.

Gördüğünüz gibi, BASIC görünümündeki ilk satır rem"çöp" içeren bir yorum ( ) ve gerekli çıktı dizesinin bir parçası. Bu makine kod programı ve bazı dolgu baytları. Burada bazı "rastgele" BASIC komutları görüyorsunuz, çünkü CBM-BASIC programları tek bayt değerleri olarak "tokenized" komutlarını içeriyor ve bu değerlerin bazıları makine kodunda kullanılan opcodlarla aynı. Makine kodu, ikinci kod satırında bulunan dizgeyi çıktı için yeniden kullanır.

Temel bir programın bir satırının ilk iki baytı, bir sonraki satıra bir işaretçidir, burada $0850. Bu, dikkatli bir şekilde seçilmiştir, çünkü 50 08taşma bayrağı ayarlanmadığında sonraki 8 bayta atlayan bir 6502 dal talimatıdır - bu, makine kodu olarak çalıştırıldığında bu "yorum" satırının ortasındaki bir yere atlamak için kullanılır. 50İkinci satır başlamalı yüzden, burada kullanılan işlem kodu 0850işe numaram. Bu yüzden 20doldurmanız gereken 5 baytlık (boşluk karakterleri) bir dizi görüyorsunuz . Makine kodu aktif olarak "devam edemez" hatası vermek için ROM hata işleme yordamına atlar.

BASIC kodu oldukça basittir; "yazdırmak" için ikinci bir argüman olarak, başlatılmamış iki değişken ( 0CBM BASIC'de bir değere sahip ) bölünerek "sıfıra bölünme" hatasını tetikler.


2
Siz bayım, siz gerçek bir programcısınız. Bununla nasıl başa çıktın? Atari programlama?
Orion

@Orion thanks :) Temel olarak, normal BASIC olarak girilen ikinci satırla başladım, mengene (emülatör) yerleşik makine kodu izleyicisini kullanarak yoldan çıkardım, makine kodunu doğrudan tokmak için monte ettim ve satır işaretleyicilerini elle tamir ettim. temel program ...
Felix Palmen

9

> <> ve Foo , 42 bayt

#o<"This code errors in "p"Foo"'><>'" :P"/

Deneyin> <>!

Foo'da dene!

Foo ", belgelendiği gibi her şeyi basar ve sonunda sıfıra bölmeye çalışır. Bu görmezden gelir '><>'.

><>"Foo" yu yığına itiyor, fakat hemen kullanarak kullanıyor p. Yığına her şeyi yazdırdıktan sonra, yığını #o<bildiği tek hata iletisiyle yığın boş olduğunda çıkar.something smells fishy...


Hatanın nedeni hata mesajı değil önemlidir. Esolang sayfasındaki ><>bir hata nedeni listesi var, bu yüzden bunlardan birini belirtmeniz gerektiğine inanıyorum something smells fishy....
Bubbler

2
@Bubbler Hata, boş bir yığından haşlanmadan kaynaklanır.
Esolanging Fruit

3
pPop kullanmak Fooçok zekice!
Esolanging Fruit

6

C ve Python, 126 116 bayt

-Bubbler sayesinde -10 bayt!

#1/*
-print("This program errors out in Python :P")
'''*/
main(c){c=puts("This program errors out in C :P")/0;}//'''

Python'da print () bir Yoktur, yani negatifini almaya çalışmak anlamsızdır, bu yüzden Python bir hata yapar.

C printf () bir int döndürür, böylece sıfıra bölerek bir kayan nokta istisnası verilir.

C de dene!
Python'da deneyin!


1
Bir Python'da -print(...)yükseltmek için kullanabilirsiniz TypeErrorve sonra C'de Kayan Nokta Hatası (sıfır ile bölme) yapmakta serbestsiniz. Bazı gereksiz yeni satırlarla birlikte, burada 116 bayt ( Python , C ).
Bubbler

5

Ataşesi + Wolfram Dili (Mathematica) , 82 bayt

s:="Attache"
s=" Mathematica "
Throw[Print["This program errors out in",s,":P"]-0]

Online Attache'yi deneyin! Çevrimiçi Mathematica'yı deneyin!

Bu, operatörün =iki dilde anlamı üzerinde durur . Attache'de eşitliği karşılaştırır, ancak Mathematica'da değişken atama yapar. :=Her iki dilde değişken atama yapar.

Şimdi, Attache'de Printbasılan bir dizi dizisi döndürür ve dizeler ve tamsayılarla (yani 0) çıkarma yapılamaz . Bu nedenle, bir tür hata atılır. Mathematica'da, Printgeri döner Nullve Mathematica bundan daha iyi çıkar 0. Ama biz bu boşluğu elle atıp Throwbir nocatchhata yaparak atıyoruz .


Not: Bu bir hata nedeniyle ataşenin mevcut sürümleri için işe yaramaz. Bunu en kısa zamanda düzeltmeye çalışacağım
Conor O'Brien

5

Python (2) ve QB64 , 82 bayt

1#DEFSTR S
s="QB64"
'';s="Python"
print"This program errors out in "+s+" :P"
CLS-1

Python sürümünü test etmek için çevrimiçi deneyebilirsiniz! QB64 sürümünü test etmek için, QB64'ü indirmeniz gerekir.

Python'un gördüğü

1#DEFSTR S
s="QB64"
'';s="Python"
print"This program errors out in "+s+" :P"
CLS-1

İlk satır, sadece 1bir açıklama tarafından izlenen çıplak ifadedir (no-op).

İkinci satır sdizeye ayarlanır "QB64", ancak üçüncü satır derhal onu değiştirir "Python". Dördüncü satır mesajı buna göre yazdırır.

Beşinci satır, başka bir çıplak ifadedir, ancak NameErrortanımsız addan dolayı bir yükseltir CLS.

QB64'ün gördüğü

1#DEFSTR S
s="QB64"
'';s="Python"
print"This program errors out in "+s+" :P"
CLS-1

Numaralı ilk satır, 1#adı S(harf duyarsız) ile başlayan her değişkeni dize değişkeni olarak tanımlar . Bu s$, Python'da bir sözdizimi hatası olan kullanmak zorunda olmadığımız anlamına gelir .

İkinci satır sdizeye ayarlanır "QB64". 'QB64'te bir yorum başlatır, böylece üçüncü satır hiçbir şey yapmaz. Dördüncü satır mesajı buna göre yazdırır.

Beşinci çizgi CLSbir argümanla (ekranı temizlemeye) çalışır -1. Fakat CLSsadece bağımsız değişkenleri kabul 0, 1ya 2bu hatayı üretir Illegal function call. Hata, kullanıcıya yürütmeye devam etmek veya iptal etmek isteyip istemediklerini soran bir iletişim kutusu oluşturur. Teknik olarak, bu, hatanın ölümcül olmadığı anlamına gelir (bu durumda, "yürütmeye devam et" seçeneğini seçebilir ve program daha fazla sorun yaşamadan sona erer); ancak OP açıkça bir hatadan sonra devam edebilen dillere izin verdi, bu yüzden QB64'ün davranışı iyi olmalı.



3

Octave ve MATLAB, 67 bayt

v=ver;disp(['This program errors out in ' v(1).Name ' :P']);v(--pi)

Çevrimiçi deneyin!

Notlar: Kod, MATLAB'ın hiçbir alet kutusu olmadan kurulduğunu varsayar (ya da kurulu herhangi bir alet kutusunun adının A - M harfleriyle başlayamadığını).

Nasıl çalışır:

Kod, yorumlayıcı ve araç kutularını kullanarak sürüm verilerini alır ver. Çalıştırmak v(1).Nameilk ürünün adını ayıklar, bu ya geri döner ya Octaveda MATLAByukarıdaki notun geçerli olduğunu varsayarsak geri döner .

Program daha sonra Octaveveya MATLABile gerektiği gibi , istenen dizeyi gösterecektir .

Sonunda yapıyoruz v(--pi).

Octave'de, --azaltma öncesi işlecidir. Bu nedenle değişken piolmadığından başarısız olan ön azaltmaya çalışır ( piaslında bir işlevdir, bir değişken değildir).

This program errors out in Octave :P
error: in x-- or --x, x must be defined first

MATLAB'da, azaltma öncesi operatörü mevcut değildir. Bu nedenle, ifade tam olarak v(-(-pi))eşit olduğu şeklinde yorumlanmaktadır v(pi). Ancak pibir tamsayı değil, vdiziye endekslemek için kullanılamaz , bir hata veriyor.

This program errors out in MATLAB :P
Subscript indices must either be real positive integers or logicals.

3

C ++ 14 (gcc) / C ++ 17 (gcc) , 107 105 bayt

#include<cstdio>
int*p,c=*"??/0"/20;int
main(){*p=printf("This program errors out in C++ 1%d :P",4+c)/c;}

Çevrimiçi deneyin! (C ++ 14)

Çevrimiçi deneyin! (C ++ 17)


Varsayar <cstdio>beyan printf(ek olarak genel ad std) ve Linux üzerinde hem gerçek kullanarak gr ++ olan temel yürütme karakter kümesi kullanır ASCII değerleri.

Buradaki temel yakalama, C ++ 17'nin dilde yazılanları kaldırmasıdır.

C ++ 14, "??/0"bir trigraph içerir ve eşittir "\0". Yani *"??/0"sıfır ve csıfıra ayarlanmış. 4 sayısı argüman olarak iletilir printf, daha sonra bölünme ctanımsız davranışa neden olur. Linux'ta, bu daha önce *pfotoğrafa gelmeden önce gerçekleşir ve program a olur SIGFPE.

C ++ 17, "??/0"tam olarak göründüğü 4 dize uzunluğu. Yani *"??/0"bir '?'veya 63 ve c7 numaralı bir argüman olarak geçirilir 3'e ayarlanır printfve bu kez yoluyla bölünme cgeçerlidir. Bu yana pbir isim alanı elemanı, bu nedenle, program başlangıcında sıfır başlatılır alır ve bir boş gösterici değerine sahip *ptanımsız bir davranıştır. Linux'ta, program belleği adres sıfırda değiştirmeye çalıştığından, program a SIGSEGV.


main's dönüş tipi ihmal edilebilir, yani -3 bayt.
Max Yekhlakov 12:18


2

C (gcc) / Stax , 109 bayt

AA=~1;
	char* s;main(){*(int*)(printf("%s C :P",s))=0;}char* s=
"This program errors out in";;;/*dp`UGYC\`Q*/

Çevrimiçi deneyin! (C (gcc))

Çevrimiçi deneyin! (Stax) veya Çalıştır ve hata ayıkla! (Stax)

C'deki segfault. Stax'ta geçersiz işlem. Bir yorum olmayan her şeyin aslında Stax'ta nasıl kullanıldığını seviyorum.

C

C böyle görüyor. İlk satır no-op. İkinci satır, mesajı ile birlikte yazdırır printfve ardından =0.

AA=~1;
	char* s;main(){*(int*)(printf("%s C :P\n",s))=0;}char* s=
"This program errors out in";;;/*dp`UGYC\`Q*/

Stax

Stax programı, boş istiflerden çıkmaya veya göz atmaya çalıştığında sona erer. Bu biraz zorlaştırıyor ve boş olmayan bir yığın hazırlamak zorundayız. AA=~1;Bunu, C’de geçerli bir ifade kalırken yapar.

AA=~1;
AA=       10=10, returns a 1
   ~      Put it on the input stack
    1     Pushes a 1 to main stack (*)
     ;    Peek from the input stack (**)

Gerçekten yararlı olan ~, boş olmayan bir giriş yığını hazırlar, böylece ;programdan çıkmadan çalıştırılabilir. Bununla birlikte, 1ana istif üzerindeki iki s daha sonra da kullanılır.

İkinci satır bir sekmeyle başlar ve Stax'ta bir satır yorumu başlatır.

"...";;;/*dp`UGYC\`Q*/
"..."                     "This program errors out in"
     ;;;                  Peek the stack three times so that we have enough operands for the next two operations
        /                 Divide, this consumes one element of the main stack
         *                Multiply, this consumes another element
          d               Discard the result, now the TOS is the string
           p              Pop and print without newline
            `UGYC\`       Compressed string literal for " Stax :P"
                   Q      Print and keep the string as TOS
                    *     Duplicate string specific times
                          Since the element under the top of stack is `1` that was prepared in (**), this does nothing
                     /    Invalid operation error

Geçersiz işlem, /TOS (2. işlenen) gibi bir dize 1ve 1. * işlenen olan (*) sayısının geçersiz olduğu işlemi gerçekleştirmeye çalışıyor .

İki işlenen değiştirilirse, Stax'ta geçerli bir işlem olur.


2

Jöle ve M , 39 bayt

İ=`ị“¢³ƥ“Ȥ¹»;“ :P”“¢ḅñ⁵ẹḞŀẊịñṙȧṄɱ»;ȮṠṛƓ

Jelly’de dene!

M de dene!

Her iki dilde tersini uygulamak İiçin 0sonuçları hangi infJelly için ve zooneden M. I bilmiyorum zooM'de sonsuzluk Dennis sor temsil eder.

Önemli olan, Jelly'in sonsuzluğunun kendisine eşit olması, M'nin sonsuzluğunun olmamasıdır. Bu nedenle tek hücreli "kendisini eşittir" =`verimler 1jöle ve 0Buradan M.:

İ=`ị“¢³ƥ“Ȥ¹»;“ :P”“¢ḅñ⁵ẹḞŀẊịñṙȧṄɱ»;ȮṠṛƓ
İ=`                                      0 in M, 1 in Jelly
    “¢³ƥ“Ȥ¹»                             Pair of compressed strings: [' M',' Jelly']
   ị                                     Index into this list with 0 or 1
            ;“ :P”                       Concatenate with the string ' :P'
                  “¢ḅñ⁵ẹḞŀẊịñṙȧṄɱ»       Compressed string: 'This program errors in'
                                  ;      Prepend this to ' Jelly/M :P'
                                   Ȯ     Print the string and return it
                                    Ṡ    Sign. M errors with a string as input and terminates
                                         Jelly returns a list of Nones
                                     ṛ   Right argument. This prevents the list of Nones from being printed
                                      Ɠ  Read a single line from input. Since input is not allowed, this produces an EOFError

Jelly'in hatası EOFError: EOF when reading a line.

M'nin hatası TypeError: '>' not supported between instances of 'str' and 'int'.


1
Bunu iki ayrı dilde yapmaya bile nasıl başlıyorsunuz?
Magic Octopus Urn

2

Foo / CJam , 51 50 bayt

"This program errors out in ""Foo"/'C'J'a'm" :P"Li

Bu NumberFormatException, Foo’da bir sıfıra bölünme hatasıyla ve bir CJam’da çıkar.

CJam’e:

  • Bir dize değişmezi (tırnak işaretleri arasında) kendisini yığına iter. Program sona erdiğinde yığındaki öğeler otomatik olarak ayırıcı olmadan yazdırılır.
  • /dize This program errors out in alt dize bölmeye çalışır Foo. Dize alt dizeyi içermediğinden, orijinal diziyi içeren ve aynı şekilde görüntülenen tek bir dizi verir.
  • 'xxtek karakterli bir dize ile aynı şekilde basılan bir karakter değişkenidir. Bu şekilde, Foo tarafından göz ardı edilen CJam verilerini zorlayabiliriz (Foo'da nasıl bir döngü oluşturmayacağımı çözmedim).
  • Liboş dizgiyi başarısız olan bir tamsayıya dönüştürmeye çalışır. Yığından gelen her şey yazdırılıyor.

Foo'ya:

  • Bir dize değişmez (tırnak işaretleri arasında) kendisini yazdırır.
  • /mevcut hücreyi üst yığın elemanı (yani kapalı olan 0) ile bölmeye çalışır . Nedense, 0'a bölme hataları Foo'da ölümcül değil, bu yüzden bu sadece mesajı yazdırıyor
    Only Chuck Norris can divide by zero.
    STDERR'e ve devam ediyor.
  • Tanınmayan karakterler ( 'C'J'a'mve Li) dikkate alınmaz.

2
İkinci 50 bayt değil mi?
Bubbler

@Bubbler Üzgünüz, düzenlemeyi unuttum.
Esolanging Fruit

7
Foo yorumlayıcısında bir hata olduğunu düşünüyorum. Açıkçası ile hata gerektiğini Only Jon Skeet can divide by zero. meta.stackexchange.com/a/9138

2

Python ve Lua , 111 110 102 98 95 85 bayt

x="This program errors out in ",#[[
print(x[0]+"Python :P")
a#]]z=#print(x.."Lua :P")

Hatalar: Python 3:

Traceback (most recent call last):
  File ".code.tio", line 3, in <module>
    a#]]z=#print(x.."Lua :P")
NameError: name 'a' is not defined

Lua:

lua: .code.tio:3: attempt to get length of a nil value
stack traceback:
    .code.tio:3: in main chunk
    [C]: in ?

Açıkça belirgin.

Farklı farkları kötüye kullanmak:

  • <var>=<a>,<b>,... Python'da bir tuple yaratır, ancak Lua'da sadece ilk üyenin alındığı bir tartışma listesi oluşturur.
  • #Python'da bir yorum başlatır, ancak Lua'daki uzunluk operatörüdür. Pistonların virgülle bitmesine izin vermek için Python'a fazladan destek.
  • [[...]]Lua'nın çok satırlı dize sözdizimi, yani Python'un yazdırma işlevini görmüyor bile; bu, Lua'nın ..string bitiştirme için kullanması nedeniyle gereklidir ve değil +.
  • Python hataları gördükten sonra atanımsız bir değişken; Lua sonra z=#print(x.."Lua :P"). Sadece #print(x.."Lua :P")Lua için kullanmak işe yaramaz, çünkü kod çalıştırılmadan önce bir hata ortaya çıkar.

Düzenlemeler:

  • "".joinPython, -1 bayt kullanmaya gerek yok
  • Make xa her iki dilde dizesi ve yeri Python, baskı işlevinde bir dize içinde -8 bayt
  • Kullanmak ve #[[]]daha kısa , -4 bayt#""--[[]]
  • #1Tablo anahtarı olarak kullanmanıza gerek yok , -3 bayt
  • Jo Kral yaptığımız bu , -9 bayt
  • print(x.."Lua :P")Anlaşılan eserin geri dönüş değerinin uzunluğunu almak ; -1 bayt


2

Java ve C # 242 235

/**\u002f/*/using System;/**/class G{public static void/**\u002fmain/*/Main/**/(String[]a){String s="This program errors out in ";/**\u002fSystem.out.print(s+"Java :P");/*/Console.Write(s+"C# :P")/**/;s=/**\u002f(1/0)+""/*/a[-1]/**/;}}

Java ile C # arasındaki farklı kaçış işlemlerinin kötüye kullanılması (unicode kaçışlar, java'da kod ayrıştırılmadan önce ayrıştırılır ve c # olarak değil) bir ön işlemci olarak ayrılır, yani \u0027sihir işinin geri kalanı bazı "toggle-comments" dır.

Düzenleme: @KevinCruijssen bir pointer sayesinde 8 bayt kapalı Golf

Düzenleme: Kural derp sabit


Sen golf 6 hem değiştirerek bayt can Stringiçinde var(Java 10 desteklerin bu). (Ya 5 değiştirerek String s="...";etmek String s="...",x;ve kaldır Stringönünde x=önce Java 9 veya içinde).
Kevin Cruijssen

1
S-string'i tekrar kullanmak java99 ve öncesi için de geçerlidir. @KevinCruijssen
masterX244

2

AutoHotKey / C #, 155 133 128 122 bayt

Sözdizimi vurgulama benden daha iyi açıklıyor:

C # RuntimeBinderException: 'Temsilci olmayan bir tür çağrılamaz.'

;dynamic
i="This program errors out in " ;Console.Write(i+"c# :P");i();/*
i:=SubStr(i,2,27)
send %i%AutoHotkey :P
Throw */

AutoHotkey Hatası: Bir istisna atıldı.

;dynamic
i="This program errors out in " ;Console.Write(i+"c# :P");i();/*
i:=SubStr(i,2,27)
send %i%AutoHotkey :P
Throw */

Düzenlemeler:

  1. var kaldırıldı
  2. -5 sayesinde bayt süt

2
İşte C #: atmak için biraz daha kısa bir istisna i+=i[-1]. System.IndexOutOfRangeException: 'Dizin, dizinin sınırlarının dışındaydı.'
süt

2
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException dynamicyerine kullanmak varve atmak için hala biraz daha kısa i(). 'Delege olmayan bir tür çağrılamaz . '
Süt,

2

PHP 7+ / JavaScript, 90 89 bayt

Bu, her iki dilde de bu kodu yazmanıza izin veren, benzer sözdizimi olan 2 dil kullanır.

Dil ayrımı, JavaScript’te bulunmayan bir özellik tarafından yapılır: PHP, JavaScript’te []haksızlık yaparken (boş bir dizi) sahte bir değer olarak kabul eder (çünkü bir nesnedir ve nesneler her zaman truthydir new Boolean(false)).

$X='This program errors out in %s :P';([]?console.log($X,'JavaScript'):printf($X,PHP))();


Yürütme:

Aşağıdaki kod parçası üzerinde durulacak: ([]?console.log($X,'JavaScript'):printf($X,PHP))();.

String niteliği her iki dilde de aynı şekilde çalışır.

Bu kod, genellikle her iki dilde de aynı şekilde çalışan "üçlü operatör" ü ( Javascript , PHP ) kullanır .

JavaScript

Javascript console.log($X,'JavaScript')dönen parçayı çalıştıracak undefined.

Daha sonra, yürütmeye çalıştığınızda (...)()bir Uncaught TypeError: (intermediate value)(intermediate value)(intermediate value) is not a function(Google Chrome'da) alırsınız .

PHP

PHP printf($X,PHP)parçayı çalıştıracak .

PHP'de, printfişlev çıktının uzunluğunu döndürür .

PHP'nin ilginç bir işlevi vardır: Bir değişkende (veya bir ifadenin sonucu olarak PHP7'den beri) bir değişkende saklanan işlevleri gerçekleştirebilir, bu da bir sözdizimi hatasını önler.

PHP daha sonra isminin sonucu olan işlevi çalıştırmayı deneyecektir []? ... :printf($X,PHP)(sayı 33).
Ancak bu ilginç işlevsellik bir ihtirasa sahiptir: sadece dizeleri kabul eder (ha!).

Bu bir neden olur Fatal error: Function name must be a stringçünkü 33bir int.


Beni 1 bayt kurtardığı için Shieru Asakoto'ya teşekkürler !


1
[]'0'JS ve PHP'de farklı olarak değerlendirildi ve kısaltıldı , yani burada -1 bayt olabilir mi?
Shieru Asakoto 12:18

Ben bu konuda, ile soruların bol []ihtiyaçları yerine kullanılmak üzere '0', '\0', '\0'=="0"ve bu kullanılan []önce de. Ancak bu soruyu tespit ettiğiniz için teşekkür ederiz.
Ismael Miguel,

1

Perl 5 ve C, 95 bayt

//;$_='
main(){puts(puts("This program errors out in C :P"));}//';/T.*n /;print$&,"perl :P";die

//; temelde perl'de NOP'dur ve C.

Yani C programı etkilidir:

main(){puts(puts("This program errors out in C :P"));}

Gerekli dizgeyi basan, sonra çalıştırmayı dener puts(32). Bu teknik olarak C'deki tanımsız davranış, ancak TIO'da ve erişebildiğim her sistemde segmentasyon hatasına neden oluyor.

Perl programı tüm C programını bir dizge olarak kabul eder, /T.*n /eşleşmek için regex'i kullanır This program errors out inve sonra bunu basar perl :P. dieprogramın hatayla kilitlenmesine neden olur Died at script_name line 2.

Bunu bir hata olarak sevmiyorsanız 1/0, aynı uzunluktadır ve bir Illegal division by zerohatayla kilitlenir . Ben sadece diedaha fazla seviyorum ;)

Çevrimiçi deneyin! (C)

Çevrimiçi deneyin! (Perl)


1

VBScript, JScript, 72 bayt

x="VB"
'';x='J'
WScript.echo("This program errors out in "+x+"Script")
y

VBScript "Microsoft VBScript çalışma zamanı hatası: Yazım uyumsuzluğu: 'y'"
yazacaktır JScript "Microsoft JScript çalışma zamanı hatası:" y 'tanımsızdır "yazacaktır


1

JavaScript ve Python 3, 105 91 bayt

NameError: name 'console' is not definedPython 3 hatalarını

a="This program errors out in %s :P"
1//2;print(a%"Python 3")
console.log(a,"JavaScript")()

Çevrimiçi deneyin!

... ve TypeError: console.log(...) is not a functionJavaScript tarafından .

a="This program errors out in %s :P"
1//2;print(a%"Python 3")
console.log(a,"JavaScript")()

Çevrimiçi deneyin!


1

Java (JDK) / JavaScript (Node.js), 154 bayt

class P{P(){var s="This program errors out in ";try{System.out.printf("%sJava :P",s);}finally{if(1!='1'){var a=0/0;}throw new Error(s+"JavaScript :P");}}}

Çevrimiçi deneyin! (Java)

Çevrimiçi deneyin! (JavaScript)

Java’da Çıktı:

This program errors out in Java :P
Exception in thread "main" java.lang.ArithmeticException: / by zero
    at P.(Main.java:1)

JavaScript'te çıktı (stderr'ye):

Error: This program errors out in JavaScript :P
    at P (/home/runner/.code.tio:1:185)

Bu 1=='1', dili algılamak için JavaScript’in zayıf yazımından ( ) ve Java ile JavaScript’te ( var, class) aynı anahtar sözcüklerden new Error()ve poliglot yapmak için benzer hata yapıcılarından ( ) faydalanır.


1

PowerShell v6 ve PowerShell v2, 73 bayt

"This errors out in PowerShell v$($PSVersionTable.PSVersion) :P"
1-shl1/0

Çevrimiçi deneyin!

Bu v2'ye ayrıştırma hatası verir çünkü -shlv3'te tanıtılmıştır. v3 + daha sonra 0'a bölmeyi denemeden önce değeri doğru bir şekilde değiştirebilir, böylelikle sıfıra bölme hatası atar. Her iki sürümde de PSVersionalanı içeren $ PSVersionTable hashmap'i var


0

Linux'taki C (gcc) Mac'te (160) C / g (gcc)

#include <sys/utsname.h>
main(){struct utsname n;float g;uname(&n);printf("This program errors out in C(gcc) on %s :P\n",n.sysname);g=1/(int)gamma(1);abort();}

Mac'te denenmemiş; temelde, John Cook ( blogunda ) POSIX'in gama tanımlamadığını; Linux, gama fonksiyonunun logunu kullanır (log (gama (1)), bir kayan nokta istisnasını tetikleyen 0 değerini döndürür); OSX (gerçek olarak POSIX başına tgamma denir) "gerçek" gama işlevini kullanır; bu, 1 değerini döndürür; bu durumda iptal ifadesiyle karşılaşılır; Farklı bir kayan nokta hatası atmaya çalıştım (örneğin, sqrt (-1), ancak nasıl sıfır attığımı, ancak sıfıra döndüğünü)


0

Perl, Bash (78 bayt)

printf "This program errors out in ";eval 'echo Bash :P'||print"Perl :P
";
a()

Perl cinsinden çıktı:

This program errors out in Perl :P
Undefined subroutine &main::a called at /tmp/perlbash line 3.

Bash'te Çıktı:

This program errors out in Bash :P
/tmp/perlbash: line 4: syntax error: unexpected end of file

( line 4Satır 3'ün satır beslemesiyle bitmemesine rağmen Bash'in hatayı gerçekten gösterdiğini unutmayın ...)



0

C (gcc) ve Haskell , 135 bayt

char/*x=0-- */*
s="This program errors out in ";
int main(){--s;*s=printf("%sC :P",s+1);}//-}=0;main=mapM print[s++"Haskell :P",tail""]

Çevrimiçi deneyin (С)! Çevrimiçi deneyin (Haskell)!

Sonuç yorumların iç içe geçmesiyle elde edilir, C versiyonu esasen şöyledir:

char * s = "This program errors out in ";
int main ()
{
   --s;
   *s = printf ("%sC :P", s + 1);
}

(Dizenin başlangıcından önce yazı yazarak başarısızlık elde edilir).

Haskell versiyonu ise aşağıdakilere indirgeniyor:

char /* x = 0 -- a useless operator (/*) taking two arguments
s = "This program errors out in ";
int main () = 0 -- a useless function int taking two arguments
main = mapM print [s ++ "Haskell :P", tail ""]

(Boş bir listenin kuyruğunu alarak başarısızlık elde edilir)

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.