Mã này bị lỗi trên * this * và * that *, nó có thực sự được viết trong đó không?


25

Lấy cảm hứng từ tôi không phải là ngôn ngữ bạn đang tìm kiếm!

Thử thách

Chọn hai ngôn ngữ lập trình khác nhau và viết chương trình in dòng sau thành thiết bị xuất chuẩn (hoặc tương đương):

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

và sau đó tạo ra loại lỗi khác nhau trong mỗi hai ngôn ngữ.

Quy tắc

Một số quy tắc được lấy từ các thách thức ban đầu.

  • Trong đầu ra, tên ngôn ngữ phải chính xác theo sau:
    • Tên được liệt kê trên TIO , tùy chọn loại trừ số phiên bản và / hoặc tên triển khai (ví dụ: nếu bạn sử dụng JavaScript (Node.js)làm một trong các ngôn ngữ của mình, bạn có thể sử dụng JavaScriptcho tên ngôn ngữ của mình, nhưng không JShoặc Javascript.)
    • Tên đầy đủ trên trang web chính thức (hoặc repo GitHub) nếu ngôn ngữ bạn chọn không có sẵn trên TIO.
  • Không chương trình nào nên lấy bất kỳ đầu vào nào từ người dùng.
  • Bạn có thể sử dụng ý kiến ​​trong một trong hai ngôn ngữ.
  • Hai phiên bản khác nhau của cùng một ngôn ngữ được tính là các ngôn ngữ khác nhau.
    • Nếu điều này được thực hiện, chương trình sẽ xuất ra số phiên bản chính và nếu chạy trên hai phiên bản nhỏ khác nhau, cũng nên báo cáo phiên bản nhỏ.
    • Bạn không nên sử dụng các chức năng phiên bản dựng sẵn (điều này bao gồm các biến đã được đánh giá trong thời gian chạy).
  • Hai cờ dòng lệnh khác nhau trong cùng một ngôn ngữ cũng được tính là các ngôn ngữ khác nhau theo sự đồng thuận meta này , miễn là các cờ không bao gồm các đoạn mã (chẳng hạn như -Dblahblah...trong C).
    • Nếu điều này được thực hiện, chương trình cũng sẽ xuất cờ được sử dụng.
  • Hai lỗi được coi là khác nhau trừ khi cả hai lỗi được tạo bởi cùng một ngữ nghĩa (chẳng hạn như "chia cho 0", "lỗi phân đoạn" hoặc "chỉ số nằm ngoài phạm vi").
    • Nếu thời gian chạy của ngôn ngữ không thoát sau một lỗi, nhưng báo cáo lỗi theo một cách nào đó cho người dùng, đó là một lỗi hợp lệ.
    • Nếu một ngôn ngữ không phân biệt các thông báo lỗi nhưng có một danh sách các lý do đã biết gây ra lỗi, bạn phải chỉ định lý do, không phải thông báo lỗi.
      Một ví dụ là ><>, chỉ có một thông báo lỗi something smells fishy..., nhưng trang wiki esolang có một danh sách các lý do lỗi.
  • Lỗi cú pháp không được phép trừ khi nó được tạo bằng cách gọi eval()hoặc tương tự.
  • Ném một cái gì đó bằng tay (thông qua throw(JS), raise(Python), die(Perl) hoặc tương tự) được cho phép, nhưng tất cả chúng đều được coi là một loại lỗi.
  • Lỗi do lệnh không hợp lệ trong 2D hoặc golflang cũng được cho phép (và được coi là một loại lỗi).

Ví dụ

Python và Ruby

  • Python: This program errors out in Python :Pto stout, sau đó không xác định định danh
  • Ruby: This program errors out in Ruby :Pstdout, sau đó lập chỉ mục ngoài giới hạn

C89 và C99

  • C89: This program errors out in C 89 :Pđể xuất chuẩn, sau đó chia cho số không
  • C99: This program errors out in C 99 :Pđể stdout, sau đó lỗi phân đoạn

Lưu ý rằng số phiên bản phải luôn được phân tách khỏi tên ngôn ngữ theo khoảng trắng.

Python 2.7.9 và Python 2.7.10

  • Python 2.7.9: This program errors out in Python 2.7.9 :Pto stout , sau đó lỗi cú pháp trên eval
  • Python 2.7.10: This program errors out in Python 2.7.10 :Pđến thiết bị xuất chuẩn, sau đó xảy ra lỗi trên dict

Perl và Perl -n

  • Perl: This program errors out in Perl :Pto stout, sau đó định dạng thời gian không hợp lệ
  • Perl -n: This program errors out in Perl -n :Pđể stdout, sau đó thử mở một tệp không tồn tại

Điều kiện chiến thắng

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng. Nhưng bạn luôn được khuyến khích đăng một câu trả lời thú vị hoặc thú vị ngay cả khi nó không quá ngắn.



Có lỗi cần phải dừng chương trình?
Jo King

Ban đầu tôi cũng nghĩ vậy. Tuy nhiên, nếu có một số ngôn ngữ có thể tiếp tục (có thể có hành vi không xác định) sau một số thứ như "chia cho số 0", với một số cơ chế để xác nhận rằng chương trình gặp phải lỗi đó, thì tôi sẽ vui vẻ cho phép điều đó.
Bong bóng

Tôi nghĩ rằng tôi đã biết câu trả lời, nhưng chỉ trong trường hợp: câu This program errors out in ...có thể chứa các tab / khoảng trắng hỗn hợp thay vì chỉ khoảng trắng không?
Kevin Cruijssen

Liên quan (in hai văn bản khác nhau trong hai ngôn ngữ khác nhau).
Kevin Cruijssen

Câu trả lời:


33

Python 2 / Python 3 , 60 byte

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

Con trăn 2:

  • /là phép chia số nguyên, 3/2 có 1; int (3/2 * 2) là 2.
  • print là một câu lệnh, vì vậy câu lệnh đầu tiên được đọc là print((...)*1), ở đây *1có nghĩa là lặp lại chuỗi một lần.
  • câu lệnh thứ hai tham chiếu một biến không tồn tại, gây ra lỗi.
  • Hãy thử trực tuyến!

Con trăn 3:

  • '/' là phép chia số trôi nổi, 3/2 có 1,5; int (3/2 * 2) là 3.
  • in là một hàm, vì vậy câu lệnh đầu tiên đọc là (print(...))*1.
  • printtrả về hàm None; Phép nhân không hoạt động None x int, vì vậy nó báo cáo "toán hạng không được hỗ trợ".
  • Hãy thử trực tuyến!

15

C và C ++, 114 101 byte

-13 byte nhờ l4m2 !

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

Lỗi phân đoạn trong C ++, ngoại lệ dấu phẩy động trong C.

autođược mặc định là inttrong C vì vậy (int).5trở thành 0, vì vậy cố gắng chia cho nó về cơ bản là chia cho không.

Trong C ++ 1/dlà 2, việc thêm nó vào địa chỉ dvà cố gắng thay đổi giá trị của địa chỉ đó sẽ tạo ra một segfault.

Hãy thử nó trong C ++!
Hãy thử nó trong C!


1
Không chắc chắn nếu nó giúp, nhưng nếu bạn có thể ánh xạ C / C ++ thành 2 và 0, bạn có thể sử dụng "++"+n, ở đâu n0cho C ++ và 2cho C
Conor O'Brien

2
d?"++":""9 char, "++"+4*d8 char. Nhưng được C / C ++ ngược. Thở dài.
Yakk

1
int main(){auto d=.5;printf("This program errors out in C%s :P",d?"++":"");2[&d]+=1/d;}(105) mặc dù tôi không biết tại sao
l4m2

1
Cũng intcó thể được bỏ qua
l4m2

Đề xuất L"⬫"+!dthay vìd?"++":""
trần mèo

14

JavaScript + HTML / HTML + JavaScript, 160 byte

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

Không chắc chắn nếu điều này đếm hai ngôn ngữ, nhưng nó là buồn cười.


Vì vậy, cái trước là định danh không xác định, cái sau là hàm gọi trên một loại không có chức năng. Về mặt kỹ thuật tôi sẽ xem xét HTML trước đây và JavaScript sau, nhưng ý tưởng thực sự hay.
Bong bóng

Sử dụng tốt các <!-- ... -->dấu nhận xét dòng đơn (Tôi biết rằng đây là thông số kỹ thuật vì lý do tương thích ngược)
Shieru Asakoto

12

Java 8 & C99, 172 byte

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

Dựa trên câu trả lời của tôi cho thử thách 'abc' và 'cba' .

Hãy thử nó trong Java 8 - kết quả là ArrayIndexOutOfBoundException: 1 .
Hãy thử bằng C - dẫn đến ngoại lệ dấu phẩy động: chia cho 0 là không xác định .

Giải trình:

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

Như bạn có thể thấy trong mã được tô sáng Java ở trên, dòng đầu tiên là một nhận xét do //và mã C là một nhận xét do /* ... */, dẫn đến:

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

Vì vậy, nó in ra STDOUT, và sau đó cố gắng truy cập đối số chương trình thứ hai (khi không được cung cấp), do đó, nó tạo ra ArrayIndexOutOfBoundException .


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

Không chắc chắn làm thế nào để bật tính năng tô sáng C một cách chính xác, vì lang-ckết quả trong việc làm nổi bật giống như Java .. Nhưng //\sẽ nhận xét dòng tiếp theo, đó là mã Java, dẫn đến:

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

Vì vậy, nó tiến tới STDOUT, và sau đó phân chia cho lỗi không.


Tôi nghĩ rằng nó sẽ hoạt động với cả C89 và C99. Đừng giữ tôi đến đó.
SIGSTACKFAULT

Đã //được thêm vào C với C99.
betseg

Cảm ơn cả hai bạn, tôi đã đổi nó thành C99.
Kevin Cruijssen

Tại sao a[1]thay vì a[0]?
xehpuk

@xehpuk Không có lý do cụ thể. Không quan trọng tôi sử dụng chữ số nào và tôi đã điền 1từ đầu. Có thể đã sử dụng 0, 9vv là tốt. Nếu tôi có một cái gì đó để chỉnh sửa về bài viết này, tôi cũng sẽ thay đổi nó 0thành cùng một lúc.
Kevin Cruijssen

11

Java 8 & khoảng trắng , 439 431 428 408 byte

                         






























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













Hãy thử nó trong Java 8 - kết quả là ArrayIndexOutOfBoundException: 0 .
Hãy thử trong Whitespace - dẫn đến lỗi người dùng (Không thể làm Infix Plus) .

Giải trình:

Java 8:

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

Vì vậy, nó in ra STDOUT, và sau đó cố gắng truy cập vào đối số chương trình đầu tiên (khi không được cung cấp), do đó, nó tạo ra ArrayIndexOutOfBoundException .


Khoảng trắng:

[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]

Chữ cái S(dấu cách), T(tab) và N(dòng mới) được thêm vào dưới dạng chỉ tô sáng.
[..._some_action]chỉ thêm vào giải thích.

Hãy thử phiên bản nổi bật này.

Whitespace là một ngôn ngữ dựa trên ngăn xếp mà bỏ qua mọi thứ trừ khoảng trắng, tab và dòng mới. Đây là chương trình tương tự trong mã giả:

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

Nó sẽ báo lỗi ngay khi in xong tất cả các giá trị và ngăn xếp trống khi nó cố thực hiện Thêm ( TSSS), yêu cầu hai mục trên ngăn xếp.

Tôi đã tạo hằng số 111với chương trình Java này , mà tôi cũng đã sử dụng cho các thách thức liên quan đến ASCII trước đây mà tôi đã thực hiện trong Khoảng trắng. Ngoài ra, tôi đã sử dụng một số bản sao cho khoảng trắng để lưu byte.

Một điều quan trọng cần lưu ý là mẹo tôi đã sử dụng để đặt chương trình Java trong câu trả lời của Whitespace. Hãy để tôi bắt đầu bằng cách giải thích cách một số được đẩy trong Khoảng trắng:

Skhi bắt đầu: Kích hoạt thao tác ngăn xếp;
S: Đẩy những gì sau số;
Shoặc T: Tích cực hoặc tiêu cực tương ứng;
Một số Svà / hoặc T, theo sau là N: Số là nhị phân, ở đâu T=1S=0.

Dưới đây là một số ví dụ:

  • Đẩy giá trị 1 sẽ là SSSTN;
  • Đẩy giá trị -1 sẽ là SSTTN;
  • Đẩy giá trị 111 sẽ được SSSTTSTTTTN.
  • Đẩy giá trị 0 có thể SSSSN, SSTSN, SSSN, SSTN, SSSSSSSSSSSSN, vv (Khi bạn sử dụng SSSN(hoặc SSTN), chúng tôi không cần phải xác định một phần nhị phân, bởi vì nó ngầm 0 sau khi chúng tôi đã nêu dấu hiệu của nó.)

Vì vậy, chỉ SSSNlà đủ để đẩy giá trị 0(được sử dụng cho chữ cái otrong trường hợp này). Nhưng, để đặt chương trình Java trong chương trình Whitespace được đánh gôn này, tôi cần thêm một khoảng trắng, vì vậy hai ogiây đầu tiên được đẩy theo SSSN, nhưng cái thứ ba được đẩy theo SSSSN, vì vậy chúng tôi có đủ khoảng trống cho câu của chương trình Java.


10

Mã máy CBM BASIC6502 (C64), 142 144 byte

Phải thêm 2 byte sau khi nhận ra lỗi cú pháp không được phép ....


Hexdump của .prgtập tin:

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

Khung nhìn CBM BASIC , như được liệt kê trong trình chỉnh sửa của C64:

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

danh sách gốc

Chú ý : Không thể nhập chính xác chương trình này trong trình chỉnh sửa BASIC. Thậm chí đừng thử chỉnh sửa chương trình này trong trình soạn thảo BASIC, nó sẽ bị sập. Tuy nhiên, đây là một chương trình BASIC có thể chạy được;)


Giao diện mã máy 6502 :

         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

Bản demo trực tuyến , nhậprunđể chạy dưới dạng BASIC,sys 2049để chạy dưới dạng mã máy,list để hiển thị nó được hiểu là mã BASIC.

Chạy như BASIC tạo ra một division by zero error in 1, chạy như mã máy acan't continue error

ảnh chụp màn hình


Giải trình:

Hai byte đầu tiên của một .prgtệp là địa chỉ tải theo ít endian, đây là $0801(thập phân 2049) ở đây, là địa chỉ bắt đầu cho các chương trình BASIC trên C64. runkhởi động chương trình này trong trình thông dịch BASIC, trong khi đó sys 2049là lệnh để chạy chương trình mã máy tại địa chỉ2049 .

Như bạn có thể thấy, dòng đầu tiên trong chế độ xem BASIC là một nhận xét (rem ) chứa "rác" và một phần của chuỗi đầu ra được yêu cầu. Đây là chương trình mã máy và một số byte phụ. Bạn thấy một số lệnh BASIC "ngẫu nhiên" ở đó vì các chương trình CBM-BASIC chứa các lệnh "được mã hóa" dưới dạng các giá trị byte đơn và một số giá trị này giống như các mã được sử dụng trong mã máy. Mã máy sử dụng lại chuỗi có trong dòng mã thứ hai cho đầu ra của nó.

Hai byte đầu tiên của một dòng của một chương trình cơ bản là một con trỏ đến dòng tiếp theo, ở đây $0850. Điều này được chọn cẩn thận vì 50 08cũng là một lệnh rẽ nhánh 6502 nhảy qua 8 byte tiếp theo khi cờ tràn không được đặt - điều này được sử dụng để nhảy ở đâu đó ở giữa dòng "nhận xét" này khi được thực thi dưới dạng mã máy. Các 50là opcode sử dụng ở đây, do đó, dòng thứ hai đã bắt đầu 0850cho các trick để làm việc. Đó là lý do tại sao bạn thấy một chuỗi 5 20byte (ký tự khoảng trắng) để điền vào. Mã máy chủ động nhảy vào thói quen xử lý lỗi ROM để đưa ra lỗi "không thể tiếp tục".

Mã BASIC khá đơn giản; như là một đối số thứ hai để "in", hai biến chưa được khởi tạo (có giá trị 0trong CBM BASIC) được chia, gây ra lỗi "chia cho 0".


2
Bạn, thưa ngài, là một lập trình viên thực sự. Làm thế nào bạn đến với điều này? Lập trình Atari?
Orion

@Orion cảm ơn :) Về cơ bản, tôi đã bắt đầu với dòng thứ hai được nhập như BASIC bình thường, di chuyển nó ra khỏi đường bằng cách sử dụng trình giám sát mã máy được tích hợp vào phó (trình giả lập), lắp ráp mã máy trực tiếp vào ram và tự sửa chữa các con trỏ của dòng chương trình cơ bản ...
Felix Palmen

9

> <>Foo , 42 byte

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

Hãy thử trong> <>!

Hãy thử nó trong Foo!

Foo in mọi thứ trong ", như được ghi lại rõ ràng và cố gắng chia cho số 0 ở cuối. Nó bỏ qua '><>'.

><>đẩy "Foo" vào ngăn xếp, nhưng ngay lập tức bật nó ra bằng cách sử dụng p. Sau khi nó in mọi thứ vào ngăn xếp với #o<nó thoát ra khi ngăn xếp trống với thông báo lỗi duy nhất mà nó biết,something smells fishy...


Lý do lỗi là quan trọng, không phải là thông báo lỗi. Trang esolang trên ><>có một danh sách các lý do lỗi, vì vậy tôi tin rằng bạn nên chỉ định một trong số đó, không phải something smells fishy....
Bong bóng

2
@Bubbler Lỗi là do popping từ một ngăn xếp trống.
Esolanging Fruit 21/03/18

3
Sử dụng pđể bật Foolà rất thông minh!
Esolanging Fruit 21/03/18

6

C và Python, 126 116 byte

-10 byte nhờ @Bubbler!

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

Trong Python print () là Không có, vì vậy cố gắng lấy tiêu cực của nó không có ý nghĩa, vì vậy Python ném lỗi.

Trong C printf () trả về một int, do đó, chia nó cho 0 sẽ cho một ngoại lệ dấu phẩy động.

Hãy thử nó trong C!
Hãy thử nó trong Python!


1
Bạn có thể sử dụng -print(...)để nâng cao TypeErrorbằng Python và sau đó bạn có thể tự do mắc Lỗi dấu phẩy động (chia cho số 0) trong C. Kết hợp với một số dòng mới, đây là 116 byte ( Python , C ).
Bong bóng

5

Ngôn ngữ Attache + Wolfram (Mathicala) , 82 byte

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

Hãy thử Attache trực tuyến! Hãy thử Mathicala trực tuyến!

Điều này xoay quanh ý nghĩa của toán tử =trong hai ngôn ngữ. Trong Attache, nó so sánh cho sự bình đẳng, nhưng trong Mathicala, nó thực hiện phép gán biến. :=không gán biến trong cả hai ngôn ngữ.

Bây giờ, trong Attache, Printtrả về một chuỗi các chuỗi được in và phép trừ không thể thực hiện được với các chuỗi và số nguyên (cụ thể là 0). Vì vậy, một lỗi loại được ném. Trong Mathicala, Printtrả về Nullvà Mathematica chỉ trừ đi 0điều đó. Nhưng, chúng tôi tự ném null đó với Throw, đưa ra một nocatchlỗi.


lưu ý: điều này không hoạt động đối với các phiên bản hiện tại của tùy viên do lỗi. Tôi sẽ cố gắng khắc phục điều đó sớm
Conor O'Brien

5

Python (2)QB64 , 82 byte

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

Để kiểm tra phiên bản Python, bạn có thể dùng thử trực tuyến! Để kiểm tra phiên bản QB64, bạn sẽ cần tải xuống QB64.

Những gì Python thấy

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

Dòng đầu tiên chỉ là biểu thức trần 1(không có op) theo sau là một nhận xét.

Dòng thứ hai đặt sthành chuỗi "QB64", nhưng dòng thứ ba ngay lập tức thay đổi nó thành chuỗi "Python". Dòng thứ tư in thông điệp tương ứng.

Dòng thứ năm là một biểu thức trần khác, nhưng nó tăng lên NameErrorvì tên không xác định CLS.

QB64 nhìn thấy gì

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

Dòng đầu tiên, được đánh số 1# , định nghĩa mọi biến có tên bắt đầu bằng S(không phân biệt chữ hoa chữ thường) là biến chuỗi. Điều này có nghĩa là chúng ta không phải sử dụng s$, đây sẽ là một lỗi cú pháp trong Python.

Bộ dòng thứ hai s thành chuỗi "QB64". 'bắt đầu một nhận xét trong QB64, vì vậy dòng thứ ba không làm gì cả. Dòng thứ tư in thông điệp tương ứng.

Dòng thứ năm cố gắng CLS(xóa màn hình) với một đối số -1. Nhưng vì CLSchỉ chấp nhận lập luận của 0, 1hay 2, điều này tạo ra lỗi Illegal function call. Lỗi tạo một hộp thoại hỏi người dùng nếu họ muốn tiếp tục thực hiện hoặc hủy bỏ. Về mặt kỹ thuật, điều này có nghĩa là lỗi không nghiêm trọng (trong trường hợp này, bạn có thể chọn "tiếp tục thực hiện" và chương trình chỉ đơn giản kết thúc mà không gặp sự cố nào nữa); nhưng OP đã cho phép rõ ràng các ngôn ngữ có thể tiếp tục sau một lỗi, vì vậy hành vi của QB64 sẽ ổn.


3

Perl 5JavaScript (Node.js) , 96 byte

eval("printf=console.log");printf("This program errors out in %s :P",("Perl","JavaScript"));$//0

Điều này sử dụng thực tế (...)là một danh sách trong Perl printfsẽ sử dụng phần tử ngoài cùng bên trái và thực tế đó là toán tử dấu phẩy trong JavaScript, sẽ trả về đối số ngoài cùng bên phải.

Gây ra sự phân chia bằng 0 lỗi trong Perl và ReferenceError vì $không được xác định trong JavaScript.

Hãy thử Perl trực tuyến!

Hãy thử JavaScript trực tuyến!


3

Octave và MATLAB, 67 byte

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

Hãy thử trực tuyến!

Lưu ý: Mã giả định MATLAB được cài đặt không có hộp công cụ (hoặc tên của bất kỳ hộp công cụ nào được cài đặt không bắt đầu bằng các chữ cái từ A đến M).

Làm thế nào nó hoạt động:

Mã nhận dữ liệu phiên bản cho trình thông dịch và hộp công cụ sử dụng ver. Chạy v(1).Nametrích xuất tên của sản phẩm đầu tiên, điều này sẽ trả về Octavehoặc MATLABgiả sử ghi chú ở trên là đúng.

Chương trình sau đó sẽ hiển thị chuỗi yêu cầu, hoàn thành với Octavehoặc MATLABtheo yêu cầu.

Cuối cùng chúng tôi cũng làm v(--pi).

Trong Octave, --là toán tử giảm trước. Vì vậy, nó cố gắng để giảm trước thất bại vì biến pikhông tồn tại ( pithực sự là chức năng, không phải là biến).

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

Trong MATLAB, toán tử giảm trước không tồn tại. Vì vậy, tuyên bố được giải thích như v(-(-pi))là bằng v(pi). Tuy nhiên pikhông phải là số nguyên nên không thể sử dụng để lập chỉ mục vào vmảng, gây ra lỗi.

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 byte

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

Hãy thử trực tuyến! (C ++ 14)

Hãy thử trực tuyến! (C ++ 17)


Giả sử <cstdio>khai báo printftrong không gian tên toàn cục (ngoài std) và bộ ký tự thực thi cơ bản sử dụng các giá trị ASCII, cả hai đều đúng khi sử dụng g ++ trên Linux.

Cái bắt cơ bản ở đây là C ++ 17 đã loại bỏ các bộ ba khỏi ngôn ngữ.

Trong C ++ 14, "??/0"chứa một bộ ba và tương đương với "\0". Vậy *"??/0"là 0, và cđược đặt thành 0. Số 4 được truyền dưới dạng đối số printf, sau đó phân chia theo cnguyên nhân gây ra hành vi không xác định. Trên Linux, điều này xảy ra trước khi *pđi vào hình ảnh và chương trình được a SIGFPE.

Trong C ++ 17, "??/0"chính xác là chuỗi 4 chiều dài. Vậy *"??/0"'?'63 và cđược đặt thành 3. Số 7 được truyền dưới dạng đối số printfvà lần này phép chia clà hợp lệ. Vì plà một thành viên không gian tên, nó được khởi tạo bằng 0 khi bắt đầu chương trình và có giá trị con trỏ null, do đó, *phành vi không xác định. Trên Linux, vì chương trình cố gắng sửa đổi bộ nhớ ở địa chỉ 0, chương trình nhận được a SIGSEGV.


mainKiểu trả về của có thể được bỏ qua, vì vậy -3 byte.
Max Yekhlakov

2

Perl 5Perl 6 , 55 byte

say('This program errors out in Perl ',5-~-1,' :P').a/0

Hãy thử Perl 5 trực tuyến! (Phân chia bất hợp pháp bằng 0)

Hãy thử Perl 6 trực tuyến! (Không có phương pháp như vậy)

Tiền tố ~là chuỗi trong Perl 6 và về cơ bản là không có trong chương trình trên. Trong Perl 5, nó không theo chiều bit, chuyển đổi -1 thành 0.

. là cú pháp gọi phương thức trong Perl 6 và nối trong Perl 5.


2

C (gcc) / Stax , 109 byte

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

Hãy thử trực tuyến! (C (gcc))

Hãy thử trực tuyến! (Stax) hoặc Chạy và gỡ lỗi nó! (Stax)

Segfault in C. Hoạt động không hợp lệ trong Stax. Tôi thích cách mọi thứ không phải là một bình luận thực sự được sử dụng trong Stax.

C

Đây là cách C nhìn thấy nó. Dòng đầu tiên là không-op. Dòng thứ hai in thông báo với printfvà sau đó segfaults do =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

Chương trình Stax chấm dứt bất cứ khi nào nó cố gắng bật hoặc nhìn trộm từ ngăn xếp trống. Điều này làm cho nó một chút khó khăn và chúng ta phải chuẩn bị một ngăn xếp không trống. AA=~1;thực hiện điều này trong khi vẫn là một tuyên bố hợp lệ trong C.

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 (**)

Điều thực sự hữu ích là ~, nó chuẩn bị một ngăn xếp đầu vào không trống để ;có thể được thực thi mà không cần thoát khỏi chương trình. Tuy nhiên, hai1 s trên ngăn xếp chính cũng được sử dụng sau.

Dòng thứ hai bắt đầu bằng một tab và bắt đầu nhận xét dòng trong Stax.

"...";;;/*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

Hoạt động không hợp lệ đang cố gắng thực hiện /thao tác cho một chuỗi dưới dạng TOS (toán hạng 2) và số 1từ (*) là toán hạng 1, không hợp lệ.

Nếu hai toán hạng được hoán đổi, đó sẽ là một hoạt động hợp lệ trong Stax.


2

JellyM , 39 byte

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

Hãy thử nó trong Jelly!

Hãy thử nó trong M!

Cả hai ngôn ngữ đều áp dụng nghịch đảo dẫn İđến 0kết quả infcho Jelly và zoocho M. Tôi không biết tại sao zoođại diện cho vô cực trong M. Hỏi Dennis.

Sự khác biệt quan trọng là vô cực của Jelly bằng chính nó trong khi vô cực của M thì không. Do đó, đơn vị "bằng với chính nó" =`mang lại 1trong Jelly và 0ở M. Từ đây:

İ=`ị“¢³ƥ“Ȥ¹»;“ :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

Lỗi của Jelly là EOFError: EOF when reading a line.

Lỗi M là TypeError: '>' not supported between instances of 'str' and 'int'.


1
Làm thế nào để bạn thậm chí bắt đầu làm điều này trong hai esolang?
Bạch tuộc ma thuật Urn

2

Foo / CJam , 51 50 byte

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

Điều này thoát với lỗi chia cho 0 trong Foo và NumberFormatExceptionở CJam.

Tới CJam:

  • Một chuỗi ký tự (giữa các dấu ngoặc kép) tự đẩy nó vào ngăn xếp. Các mục từ ngăn xếp được in tự động mà không có dấu phân cách khi chương trình kết thúc.
  • /cố gắng tách chuỗi This program errors out in trên chuỗi con Foo. Vì chuỗi không chứa chuỗi con, điều này mang lại một mảng singleton chứa chuỗi gốc, được hiển thị theo cùng một cách.
  • 'xlà một ký tự theo nghĩa đen x, được in giống như một chuỗi ký tự. Bằng cách này, chúng ta có thể đẩy dữ liệu cho CJam bị Foo bỏ qua (Tôi chưa tìm ra cách tạo một vòng lặp không thực thi trong Foo).
  • Licố gắng truyền chuỗi rỗng thành một số nguyên, không thành công. Tất cả mọi thứ từ ngăn xếp được in.

Để Foo:

  • Một chuỗi ký tự (giữa các trích dẫn) tự in.
  • /cố gắng phân chia ô hiện tại cho thành phần ngăn xếp trên cùng (là ẩn 0). Vì một số lý do, lỗi chia cho 0 không gây tử vong trong Foo, vì vậy điều này chỉ in thông báo
    Only Chuck Norris can divide by zero.
    để STDERR và tiếp tục đi.
  • Các ký tự không được nhận dạng ( 'C'J'a'mLi) được bỏ qua.

2
Không phải là 50 byte sau?
Bong bóng

@Bubbler Quên chỉnh sửa điều đó, xin lỗi.
Esolanging Fruit 21/03/18

7
Tôi nghĩ rằng có một lỗi trong trình thông dịch Foo. Nó rõ ràng là lỗi với Only Jon Skeet can divide by zero. meta.stackexchange.com/a/9138

2

PythonLua , 111 110 102 98 95 85 byte

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

Lỗi: 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 ?

Rõ ràng khác biệt.

Lạm dụng nhiều sự khác biệt:

  • <var>=<a>,<b>,... tạo một tuple trong Python, nhưng trong Lua, nó tạo ra một danh sách đối số, từ đó chỉ có thành viên đầu tiên được thực hiện.
  • #bắt đầu một nhận xét bằng Python, nhưng là toán tử độ dài trong Lua. Đạo cụ bổ sung cho Python để cho phép các bộ dữ liệu kết thúc bằng dấu phẩy.
  • [[...]]là cú pháp chuỗi đa dòng của Lua, có nghĩa là nó thậm chí không nhìn thấy chức năng in của Python; điều này là cần thiết do Lua sử dụng ..để nối chuỗi và không +.
  • Lỗi Python sau khi nhìn thấy a, một biến không xác định; Lua sau z=#print(x.."Lua :P"). Chỉ sử dụng #print(x.."Lua :P")cho Lua không hoạt động, vì điều đó gây ra lỗi trước khi mã thậm chí được thực thi.

Chỉnh sửa:

  • Không cần sử dụng "".jointrong Python, -1 byte
  • Tạo xmột chuỗi bằng cả hai ngôn ngữ và đặt Pythonthành một chuỗi bằng chữ trong hàm in, -8 byte
  • Sử dụng #[[]]ngắn hơn #""--[[]] , -4 byte
  • Không cần sử dụng #1làm khóa bảng, -3 byte
  • Jo King đã làm điều này , -9 byte
  • Lấy chiều dài của giá trị trả lại của print(x.."Lua :P")công trình, rõ ràng; -1 byte


2

Java và 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]/**/;}}

Lạm dụng xử lý thoát khác nhau giữa java và C # (thoát unicode được phân tích cú pháp trước khi phân tích mã trong java chứ không phải trong c #) như một loại tiền xử lý, đó là công việc của \u0027 phép thuật, phần còn lại là một số "chuyển đổi nhận xét"

Chỉnh sửa: Đánh bại 8 byte nhờ một con trỏ của @KevinCruijssen

Chỉnh sửa: Đã sửa lỗi quy tắc


Bạn có thể chơi golf 6 byte bằng cách thay đổi cả hai Stringtrong var(Java 10 hỗ trợ điều này). (Hoặc 5 bằng cách thay đổi String s="...";thành String s="...",x;và xóa Stringtrước x=Java 9 hoặc trước đó).
Kevin Cruijssen 23/03/18

1
tái sử dụng chuỗi S hoạt động, quá cho java99 và trước đó. @KevinCruijssen
masterX244

2

AutoHotKey / C #, 155 133 128 122 byte

Làm nổi bật cú pháp giải thích nó tốt hơn tôi có thể:

C # RuntimeBinderException: 'Không thể gọi loại không ủy nhiệm'

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

Lỗi AutoHotkey : Một ngoại lệ đã bị ném.

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

Chỉnh sửa:

  1. loại bỏ một var
  2. -5 byte nhờ sữa

2
Đây là một ngoại lệ ngắn hơn một chút để ném vào C # : i+=i[-1]. System.IndexOutOfRangeException: 'Index nằm ngoài giới hạn của mảng.'
sữa

2
Hơi ngắn để sử dụng dynamic thay vì varvà ném Microsoft.CSharp.R nbBinder.R nbBinderException: 'Không thể gọi một loại không ủy nhiệm' với i().
sữa

2

PHP 7+ / JavaScript, 90 89 byte

Điều này sử dụng 2 ngôn ngữ với cú pháp rất giống nhau, cho phép viết mã này trên cả hai ngôn ngữ.

Việc phân tách ngôn ngữ được thực hiện bởi một thuộc tính không có trong JavaScript: PHP xem xét [] (mảng trống) là giá trị giả trong khi đó là sự thật trong JavaScript (vì đó là một đối tượng và các đối tượng luôn luôn trung thực, thậm chí new Boolean(false)).

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


Chấp hành:

Sẽ tập trung vào đoạn mã sau : ([]?console.log($X,'JavaScript'):printf($X,PHP))();.

Thuộc tính chuỗi hoạt động giống nhau trong cả hai ngôn ngữ.

Mã này sử dụng "toán tử ternary" ( Javascript , PHP ), hoạt động chủ yếu theo cùng một cách trong cả hai ngôn ngữ.

Javascript

Javascript sẽ chạy console.log($X,'JavaScript')phần, trả về undefined.

Sau này, khi bạn cố gắng thực hiện (...)() , bạn nhận được mộtUncaught TypeError: (intermediate value)(intermediate value)(intermediate value) is not a function (trong Google Chrome).

PHP

PHP sẽ thực thi printf($X,PHP) tác phẩm.

Trong PHP, printfhàm trả về độ dài của đầu ra .

PHP có một chức năng thú vị: nó có thể thực thi các chức năng mà tên của chúng được lưu trữ trong một biến (hoặc, kể từ PHP7, là kết quả của một biểu thức), giúp ngăn ngừa lỗi cú pháp.

PHP sau đó sẽ cố gắng chạy hàm mà tên của nó là kết quả của biểu thức []? ... :printf($X,PHP)(là số 33).
Nhưng chức năng thú vị đó có một cảnh báo: chỉ chấp nhận chuỗi (duh!).

Điều này gây ra một Fatal error: Function name must be a string, bởi vì 33là một int.


Cảm ơn Shieru Asakoto đã tiết kiệm cho tôi 1 byte!


1
[]ngắn hơn '0'và cũng được đánh giá khác nhau trong JS và PHP, vì vậy có lẽ một byte -1 ở đây?
Shieru Asakoto

Tôi có rất nhiều câu hỏi với vấn đề đó, mà []cần phải được sử dụng thay cho '0', '\0', '\0'=="0", và sử dụng mà []trước là tốt. Nhưng cảm ơn bạn đã phát hiện ra câu hỏi này.
Ismael Miguel

1

Perl 5 và C, 95 byte

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

//; về cơ bản là một NOP tính theo perl và là một nhận xét trong C.

Vì vậy, chương trình C có hiệu quả:

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

Mà in chuỗi yêu cầu, sau đó cố gắng chạy puts(32). Đây là hành vi không xác định về mặt kỹ thuật trong C, nhưng nó gây ra lỗi phân đoạn trên TIO và mọi hệ thống tôi có quyền truy cập.

Chương trình perl coi toàn bộ chương trình C là một chuỗi, sử dụng biểu thức chính quy /T.*n /để khớp This program errors out invà sau đó in nó và perl :P. dielàm cho chương trình bị lỗi với lỗi Died at script_name line 2.

Nếu bạn không thích đó là một lỗi, 1/0thì cùng một độ dài và gặp sự cố với một Illegal division by zerolỗi. Tôi chỉ thích dienhiều hơn;)

Hãy thử trực tuyến! (C)

Hãy thử trực tuyến! (Perl)


1

VBScript, JScript, 72 byte

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

VBScript sẽ in "Lỗi thời gian chạy Microsoft VBScript: Nhập không khớp: 'y'"
JScript sẽ in "Lỗi thời gian chạy Microsoft JScript: 'y' không xác định"


1

JavaScript & Python 3, 105 91 byte

Lỗi bởi NameError: name 'console' is not definedPython 3

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

Hãy thử trực tuyến!

... và bằng TypeError: console.log(...) is not a functionJavaScript.

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

Hãy thử trực tuyến!


1

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

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");}}}

Hãy thử trực tuyến! (Java)

Hãy thử trực tuyến! (JavaScript)

Đầu ra trong Java:

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

Đầu ra bằng JavaScript (tới stderr):

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

Điều này lợi dụng cách gõ yếu ( 1=='1') của JavaScript để phát hiện ngôn ngữ và các từ khóa tương tự trong Java và JavaScript ( var, class) và các hàm tạo lỗi tương tự ( new Error()) để tạo đa âm.


1

PowerShell v6 và PowerShell v2, 73 byte

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

Hãy thử trực tuyến!

Điều này sẽ gây ra lỗi phân tích cú pháp trên v2 vì -shlđã được giới thiệu trong v3. v3 + sau đó sẽ có thể dịch chuyển chính xác giá trị trước khi cố gắng chia nó cho 0, thuận tiện ném lỗi chia cho 0. Cả hai phiên bản đều có hashmap $ PSVersionTable chứa PSVersiontrường


0

C (gcc) trên Linux / C (gcc) trên Mac (160)

#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();}

Chưa được kiểm tra trên Mac; về cơ bản, John Cook đã chỉ ra (trong blog của mình ) rằng POSIX không định nghĩa gamma; Linux sử dụng nhật ký của hàm gamma (log (gamma (1)) sẽ trả về 0 sẽ kích hoạt ngoại lệ dấu phẩy động); OSX sử dụng chức năng gamma "thật", (được gọi chính thức là tgamma trên POSIX); cái này trả về 1 cái mà sau đó sẽ nhấn vào câu lệnh hủy bỏ; Tôi đã cố gắng để nó đưa ra một lỗi dấu phẩy động khác nhau (ví dụ: sqrt (-1) nhưng tôi quên cách làm cho lỗi đó bị lỗi so với chỉ trả về 0)


0

Perl, Bash (78 byte)

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

Đầu ra trong Perl:

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

Đầu ra trong Bash:

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

(Lưu ý rằng Bash thực sự đang hiển thị line 4lỗi, mặc dù thực tế là dòng 3 không kết thúc bằng nguồn cấp dữ liệu ...)



0

C (gcc)Haskell , 135 byte

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""]

Dùng thử trực tuyến (С)! Hãy thử trực tuyến (Haskell)!

Kết quả đạt được bằng cách đan xen các ý kiến, phiên bản C về cơ bản là thế này:

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

(Thất bại đạt được bằng cách viết trước khi bắt đầu chuỗi).

Phiên bản Haskell, mặt khác, giảm xuống như sau:

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 ""]

(Thất bại đạt được bằng cách lấy đuôi của một danh sách trống)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.