รหัสนี้มีข้อผิดพลาดใน * this * และ * that * เป็นข้อเขียนที่เขียนขึ้นจริง ๆ หรือไม่


25

แรงบันดาลใจจากฉันไม่ใช่ภาษาที่คุณกำลังมองหา!

ท้าทาย

เลือกภาษาการเขียนโปรแกรมสองภาษาที่แตกต่างกันและเขียนโปรแกรมที่พิมพ์บรรทัดต่อไปนี้ไปยัง stdout (หรือเทียบเท่า):

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

จากนั้นสร้างข้อผิดพลาดประเภทต่าง ๆ ในแต่ละภาษา

กฎระเบียบ

กฎบางอย่างมาจากความท้าทายเดิม

  • ในผลลัพธ์ชื่อภาษาควรเป็นดังนี้:
    • ชื่อที่แสดงอยู่ในTIOซึ่งเป็นตัวเลือกยกเว้นหมายเลขรุ่นและ / หรือชื่อการนำไปใช้ (เช่นหากคุณใช้JavaScript (Node.js)เป็นภาษาใดภาษาหนึ่งของคุณคุณสามารถใช้JavaScriptสำหรับชื่อภาษาของคุณ แต่ไม่ใช่JSหรือJavascript)
    • ชื่อเต็มในเว็บไซต์ทางการ (หรือ GitHub repo) หากภาษาที่คุณเลือกไม่สามารถใช้งานได้ใน TIO
  • โปรแกรมไม่ควรรับข้อมูลใด ๆ จากผู้ใช้
  • คุณสามารถใช้ความคิดเห็นในภาษาใดภาษาหนึ่ง
  • ภาษาเดียวกันสองเวอร์ชันที่แตกต่างกันจะนับเป็นภาษาที่แตกต่างกัน
    • หากทำเสร็จแล้วโปรแกรมควรส่งออกหมายเลขรุ่นหลักและหากใช้กับรุ่นรองสองรุ่นที่แตกต่างกันควรรายงานรุ่นรองด้วย
    • คุณไม่ควรใช้ฟังก์ชั่นเวอร์ชั่นที่สร้างไว้ล่วงหน้า (ซึ่งรวมถึงตัวแปรที่ได้รับการประเมินแล้วตอนรันไทม์)
  • แฟล็กบรรทัดคำสั่งที่แตกต่างกันสองรายการในภาษาเดียวกันจะนับเป็นภาษาที่แตกต่างกันตามฉันทามติเมตานี้ตราบใดที่แฟล็กไม่ได้มีการแตกแฟรกเมนต์โค้ด (เช่น-Dblahblah...ใน C)
    • หากทำเสร็จแล้วโปรแกรมควรแสดงสถานะแฟล็กที่ใช้
  • ข้อผิดพลาดสองข้อถือว่าแตกต่างกันเว้นแต่ว่าข้อผิดพลาดทั้งสองจะถูกสร้างขึ้นโดยซีแมนทิกส์เดียวกัน (เช่น "การหารด้วยศูนย์", "การแบ่งเซกเมนต์ผิด" หรือ "ดัชนีอยู่นอกช่วง")
    • หากรันไทม์ของภาษาไม่ออกหลังจากเกิดข้อผิดพลาด แต่รายงานข้อผิดพลาดในทางใดทางหนึ่งแก่ผู้ใช้นั่นเป็นข้อผิดพลาดที่ถูกต้อง
    • หากภาษาไม่แยกแยะข้อความแสดงข้อผิดพลาด แต่มีรายการสาเหตุที่ทำให้เกิดข้อผิดพลาดที่รู้จักคุณต้องระบุเหตุผลไม่ใช่ข้อความแสดงข้อผิดพลาด
      ตัวอย่างคือ><>ซึ่งมีข้อความแสดงข้อผิดพลาดเดียวsomething smells fishy...แต่หน้า esolangs wikiมีรายการข้อผิดพลาด
  • ไม่อนุญาตให้เกิดข้อผิดพลาดทางไวยากรณ์เว้นแต่ว่าจะเกิดจากการโทรeval()หรือที่คล้ายกัน
  • อนุญาตให้โยนบางสิ่งได้ด้วยตนเอง (ผ่านthrow(JS), raise(Python), die(Perl) หรือคล้ายกัน) แต่สิ่งเหล่านั้นทั้งหมดถือเป็นข้อผิดพลาดชนิดหนึ่ง
  • ข้อผิดพลาดโดยคำสั่งที่ไม่ถูกต้องใน 2D หรือ golflangs ก็อนุญาตเช่นกัน

ตัวอย่าง

Python และ Ruby

  • Python: This program errors out in Python :Pไปยัง stdout จากนั้นระบุไม่ได้กำหนด
  • Ruby: This program errors out in Ruby :Pไปที่ stdout จากนั้นสร้างดัชนีใหม่นอกขอบเขต

C89 และ C99

  • C89: This program errors out in C 89 :Pไปที่ stdout จากนั้นหารด้วยศูนย์
  • C99: This program errors out in C 99 :Pไปที่ stdout จากนั้นทำการแบ่งส่วนความผิดพลาด

โปรดทราบว่าหมายเลขรุ่นควรเสมอจะแยกออกจากชื่อภาษาด้วยช่องว่าง

Python 2.7.9 และ Python 2.7.10

  • Python 2.7.9: This program errors out in Python 2.7.9 :Pไปที่ stdout จากนั้นข้อผิดพลาดทางไวยากรณ์ของ eval
  • Python 2.7.10: This program errors out in Python 2.7.10 :Pไปยัง stdout แล้วกดคีย์ error บน dict

Perl และ Perl -n

  • Perl: This program errors out in Perl :Pเป็น stdout, จากนั้นรูปแบบเวลาที่ไม่ถูกต้อง
  • Perl -n: This program errors out in Perl -n :Pไปที่ stdout จากนั้นลองเปิดไฟล์ที่ไม่มีอยู่

สภาพการชนะ

นี่คือดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ แต่คุณควรโพสต์คำตอบที่สนุกหรือน่าสนใจเสมอแม้ว่าจะไม่สั้นมาก



ข้อผิดพลาดจำเป็นต้องหยุดโปรแกรมหรือไม่
Jo King

ตอนแรกฉันคิดอย่างนั้น อย่างไรก็ตามหากมีบางภาษาที่อาจดำเนินการต่อ (อาจมีพฤติกรรมที่ไม่ได้กำหนด) หลังจากบางสิ่งบางอย่างเช่น "การหารด้วยศูนย์" ด้วยกลไกบางอย่างที่จะยอมรับว่าโปรแกรมพบข้อผิดพลาดนั้นฉันก็จะอนุญาตอย่างมีความสุข
Bubbler

ฉันคิดว่าฉันรู้คำตอบอยู่แล้ว แต่ในกรณี: ประโยคอาจThis program errors out in ...มีแท็บ / ช่องว่างแบบผสมแทนที่จะเป็นช่องว่างหรือไม่
Kevin Cruijssen

ที่เกี่ยวข้อง (พิมพ์สองข้อความที่แตกต่างกันในสองภาษาที่แตกต่างกัน)
Kevin Cruijssen

คำตอบ:


33

Python 2 / Python 3 , 60 ไบต์

print("This program errors out in Python %d :P"%(3/2*2))*1;a
  • Python 2 ได้รับแล้ว NameError: name 'a' is not defined
  • Python 3 ได้รับ unsupported operand type(s) for *: 'NoneType' and 'int'

Python 2:

  • /คือการหารจำนวนเต็ม 3/2 ได้ 1 int (3/2 * 2) คือ 2
  • พิมพ์เป็นคำสั่งดังนั้นคำสั่งแรกอ่านเป็นprint((...)*1)ที่นี่*1หมายถึงการทำซ้ำสตริงหนึ่งครั้ง
  • คำสั่งที่สองอ้างอิงถึงตัวแปรที่ไม่มีอยู่ซึ่งทำให้เกิดข้อผิดพลาด
  • ลองออนไลน์!

Python 3:

  • '/' คือการหารจำนวนลอยตัว, 3/2 ได้ 1.5; int (3/2 * 2) คือ 3
  • (print(...))*1พิมพ์เป็นฟังก์ชั่นเพื่อให้คำสั่งแรกอ่านเป็น
  • ฟังก์ชั่นprintผลตอบแทนNone; การคูณไม่ทำงานNone x intดังนั้นจึงรายงาน "ตัวถูกดำเนินการที่ไม่สนับสนุน"
  • ลองออนไลน์!

15

C และ C ++, 114 101 ไบต์

-13 ไบต์ขอบคุณl4m2 !

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

การแบ่งกลุ่มข้อบกพร่องใน C ++, ข้อยกเว้นจุดลอยใน C

autoจะผิดนัดไปintใน C เพื่อให้(int).5กลายเป็น0เพื่อพยายามที่จะหารด้วยมันเป็นพื้นหารด้วยศูนย์

ใน C ++ 1/dคือ 2 การเพิ่มไปยังที่อยู่ของdและพยายามที่จะเปลี่ยนค่าของที่อยู่นั้นส่งผลให้ segfault

ลองใช้ใน C ++!
ลองใน C!


1
ถ้าไม่แน่ใจว่ามันจะช่วยให้ แต่ถ้าคุณสามารถแม C / C ++ 2 และ 0, คุณสามารถใช้"++"+nที่nเป็น0สำหรับ C ++ และ2สำหรับ C
Conor โอไบรอัน

2
d?"++":""9 ถ่าน"++"+4*d8 ถ่าน แต่รับ C / C ++ ไปข้างหลัง ถอนหายใจ
Yakk

1
int main(){auto d=.5;printf("This program errors out in C%s :P",d?"++":"");2[&d]+=1/d;}(105) แม้ว่าฉันไม่รู้ว่าทำไม
l4m2

1
นอกจากนี้ยังintสามารถละเว้น
l4m2

แนะนำL"⬫"+!dแทนd?"++":""
ceilingcat

14

JavaScript + HTML / HTML + JavaScript ขนาด 160 ไบต์

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

ไม่แน่ใจว่านี่จะนับสองภาษา แต่มันตลกดี


ดังนั้นตัวแรกคือตัวระบุที่ไม่ได้กำหนดไว้ส่วนหลังคือการเรียกใช้ฟังก์ชันกับชนิดที่ไม่ใช่ฟังก์ชัน ในทางเทคนิคฉันจะพิจารณา HTML เดิมและ JavaScript หลัง แต่เป็นความคิดที่ดีจริงๆ
Bubbler

ใช้ดี<!-- ... -->เป็นเครื่องหมายแสดงความคิดเห็นบรรทัดเดียว (ฉันรู้ว่านี่เป็นข้อมูลจำเพาะสำหรับเหตุผลความเข้ากันได้แบบย้อนหลัง)
Shieru Asakoto

12

Java 8 & C99, 172 ไบต์

//\
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' และ 'CBA'ท้าทาย

ลองใน Java 8 - ผลในArrayIndexOutOfBoundsException: 1
ลองใช้ใน C - ผลในการลอยตัวยกเว้นจุด: หารด้วยศูนย์จะไม่ได้กำหนด

คำอธิบาย:

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

ดังที่คุณเห็นในโค้ดที่เน้นด้วย Java ด้านบนบรรทัดแรกเป็นความคิดเห็นเนื่องจาก//และรหัส C เป็นความคิดเห็นที่เกิดขึ้นเนื่องจาก/* ... */ทำให้:

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

ดังนั้นมันพิมพ์ไป STDOUT แล้วพยายามเข้าถึงที่สองโปรแกรมอาร์กิวเมนต์ (เมื่อไม่มีผู้ใดได้รับ) ดังนั้นจึงผลิตArrayIndexOutOfBoundsException


//\
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 ได้อย่างถูกต้องหรือไม่เนื่องจากlang-cผลลัพธ์ในการไฮไลต์เช่นเดียวกับ Java .. แต่//\จะใส่เครื่องหมายความคิดเห็นในบรรทัดถัดไปซึ่งเป็นโค้ด Java ซึ่งทำให้:

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

ดังนั้นมันจึงไปที่ STDOUT จากนั้นให้ค่าหารด้วยศูนย์ข้อผิดพลาด


ฉันคิดว่ามันจะทำงานกับทั้ง C89 และ C99 อย่ารั้งฉันไว้
SIGSTACKFAULT

//ถูกบันทึกอยู่ใน C ที่มี C99
betseg

C99ขอขอบคุณที่คุณทั้งสองผมได้เปลี่ยนไป
Kevin Cruijssen

ทำไมa[1]แทนa[0]?
xehpuk

@xehpuk ไม่มีเหตุผลพิเศษ มันไม่สำคัญว่าฉันจะใช้เลขอะไรและฉันได้กรอก1ตั้งแต่ต้นแล้ว จะได้ใช้0, 9และอื่น ๆ ได้เป็นอย่างดี หากฉันมีบางอย่างที่ต้องแก้ไขเกี่ยวกับโพสต์นี้ฉันจะเปลี่ยน0เป็นในเวลาเดียวกัน
Kevin Cruijssen

11

Java 8 & Whitespace , 439 431 428 408 ไบต์

                         






























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













ลองใน Java 8 - ผลในArrayIndexOutOfBoundsException: 0
ลองในช่องว่าง - ผลในข้อผิดพลาดของผู้ใช้ (ไม่สามารถทำผูกพลัส)

คำอธิบาย:

Java 8:

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

ดังนั้นมันพิมพ์ไป STDOUT และจากนั้นพยายามที่จะเข้าถึงคนแรกที่โปรแกรมอาร์กิวเมนต์ (เมื่อไม่มีผู้ใดได้รับ) ดังนั้นจึงผลิตArrayIndexOutOfBoundsException


ช่องว่าง:

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

เพิ่มตัวอักษรS(ช่องว่าง), T(แท็บ) และN(บรรทัดใหม่) เป็นการเน้นเท่านั้น
[..._some_action]เพิ่มเป็นคำอธิบายเท่านั้น

ลองรุ่นที่เน้นสีนี้

ช่องว่างเป็นภาษาสแต็กที่ละเว้นทุกอย่างยกเว้นช่องว่างแท็บและบรรทัดใหม่ นี่คือโปรแกรมเดียวกันในรหัสหลอก:

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

มันจะเกิดข้อผิดพลาดทันทีที่ทำการพิมพ์ค่าทั้งหมดและสแต็กต์ว่างเปล่าเมื่อพยายามเพิ่ม ( TSSS) ซึ่งต้องใช้สองรายการในสแต็ก

ฉันได้สร้างค่าคงที่111ด้วยโปรแกรม Java นี้ซึ่งฉันได้ใช้กับความท้าทายที่เกี่ยวข้องกับ ASCII ก่อนหน้านี้ที่ฉันทำในช่องว่าง นอกจากนี้ฉันใช้สำเนาบางส่วนเพื่อให้มีที่ว่างเพื่อบันทึกไบต์

สิ่งสำคัญที่ควรทราบคือเคล็ดลับที่ฉันใช้ในการวางโปรแกรม Java ภายในคำตอบของ Whitespace ให้ฉันเริ่มต้นด้วยการอธิบายวิธีการผลักจำนวนในช่องว่าง:

Sที่จุดเริ่มต้น: เปิดใช้งานการจัดการกองซ้อน;
S: กดสิ่งต่อไปนี้เป็น Number;
SหรือT: บวกหรือลบตามลำดับ
บางส่วนSและ / หรือTตามด้วยNจำนวนเป็นไบนารีที่และT=1S=0

นี่คือตัวอย่าง:

  • กดค่า 1 จะเป็นSSSTN;
  • กดค่า -1 จะเป็นSSTTN;
  • ผลักดันมูลค่า 111 SSSTTSTTTTNจะเป็น
  • การผลักดันค่า 0 สามารถSSSSN, SSTSN, SSSN, SSTN, SSSSSSSSSSSSNฯลฯ (เมื่อคุณใช้SSSN(หรือSSTN) เราไม่ได้มีการระบุส่วนไบนารีเพราะมันโดยปริยาย 0 หลังจากที่เราได้ระบุไว้เครื่องหมาย.)

ดังนั้นก็SSSNเพียงพอแล้วสำหรับการผลักดันค่า0(ใช้สำหรับตัวอักษรoในกรณีนี้) แต่ในการวางโปรแกรม Java ในโปรแกรม Whitespace นี้ฉันต้องการพื้นที่เพิ่มเติมดังนั้นจึงoผลักสองตัวแรกด้วยSSSNแต่อันที่สามถูกผลักด้วยSSSSNดังนั้นเราจึงมีที่ว่างเพียงพอสำหรับประโยคของโปรแกรม Java


10

CBM BASICและรหัสเครื่อง 6502 (C64), 142 144 ไบต์

ต้องเพิ่ม 2 ไบต์หลังจากพบข้อผิดพลาดทางไวยากรณ์ที่ไม่ได้รับอนุญาต ....


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ดังแสดงรายการในเครื่องมือแก้ไข 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

รายชื่อเดิม

ข้อควรสนใจ : เป็นไปไม่ได้ที่จะเข้าสู่โปรแกรมนี้อย่างถูกต้องในเครื่องมือแก้ไขพื้นฐาน อย่าแม้แต่จะพยายามแก้ไขโปรแกรมนี้ในโปรแกรมแก้ไขพื้นฐาน แต่มันก็จะพัง ยังเป็นโปรแกรมพื้นฐานที่รันได้;)


มุมมองรหัสเครื่อง 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

การสาธิตออนไลน์พิมพ์runเพื่อรันเป็น BASICsys 2049เพื่อเรียกใช้เป็นรหัสเครื่องlistเพื่อแสดงการตีความเป็นรหัสพื้นฐาน

การเรียกใช้ในฐานะ BASIC จะสร้าง a division by zero error in 1โดยใช้เป็นรหัสเครื่อง acan't continue error

ภาพหน้าจอ


คำอธิบาย:

สองไบต์แรกของ.prgไฟล์คือที่อยู่โหลดใน endian น้อยนี่คือ$0801(ทศนิยม2049) ที่นี่ซึ่งเป็นที่อยู่เริ่มต้นสำหรับโปรแกรมพื้นฐานใน C64 runเริ่มต้นโปรแกรมนี้ในล่ามขั้นพื้นฐานในขณะที่เป็นคำสั่งเพื่อเรียกใช้โปรแกรมรหัสเครื่องที่อยู่sys 20492049

อย่างที่คุณเห็นบรรทัดแรกในมุมมองพื้นฐานคือความคิดเห็น ( rem) ที่มี "ขยะ" และเป็นส่วนหนึ่งของสตริงเอาต์พุตที่ต้องการ นี่คือโปรแกรมรหัสเครื่องและบางฟิลเลอร์ไบต์ คุณเห็นคำสั่ง "สุ่ม" พื้นฐานบางอย่างที่นั่นเนื่องจากโปรแกรม CBM-BASIC มีคำสั่ง "โทเค็น" เป็นค่าไบต์เดียวและค่าเหล่านี้บางส่วนเหมือนกับ opcodes ที่ใช้ในรหัสเครื่อง รหัสเครื่องจะนำสตริงที่มีอยู่ในบรรทัดที่สองของรหัสออกมา

$0850ทั้งสองไบต์แรกของบรรทัดของโปรแกรมพื้นฐานเป็นตัวชี้ไปยังบรรทัดถัดไปที่นี่ สิ่งนี้ถูกเลือกอย่างระมัดระวังเพราะ50 08เป็นคำสั่งสาขา 6502 ที่กระโดดข้าม 8 ไบต์ถัดไปเมื่อไม่ได้ตั้งค่าสถานะโอเวอร์โฟลว์ - สิ่งนี้ใช้เพื่อข้ามบางส่วนที่อยู่ตรงกลางบรรทัด "ความคิดเห็น" นี้เมื่อดำเนินการเป็นรหัสเครื่อง นี่50คือ opcode ที่ใช้ที่นี่ดังนั้นบรรทัดที่สองต้องเริ่มต้น0850เพื่อให้ได้เคล็ดลับในการทำงาน นั่นเป็นเหตุผลที่คุณเห็นลำดับ 5 20ไบต์ (อักขระเว้นวรรค) เพื่อเติม รหัสเครื่องกระโดดข้ามไปที่รูทีนการจัดการข้อผิดพลาด ROM อย่างแข็งขันเพื่อให้ข้อผิดพลาด "ไม่สามารถดำเนินการต่อ"

รหัสพื้นฐานนั้นค่อนข้างตรงไปตรงมา เป็นอาร์กิวเมนต์ที่สองของ "print" ตัวแปรสองตัวที่ไม่มีการกำหนดค่าเริ่มต้น (มีค่าเป็น0CBM พื้นฐาน) จะถูกแบ่งออกทำให้เกิดข้อผิดพลาด "การหารด้วยศูนย์"


2
คุณครับเป็นโปรแกรมเมอร์ตัวจริง คุณคิดอย่างไรกับสิ่งนี้ การเขียนโปรแกรมอาตาริ?
Orion

@Orion ขอบคุณ :) โดยทั่วไปฉันเริ่มต้นด้วยบรรทัดที่สองที่ป้อนตามปกติ BASIC ย้ายมันออกไปโดยใช้การตรวจสอบรหัสเครื่องที่สร้างขึ้นเป็นรอง (จำลอง) ประกอบรหัสเครื่องโดยตรงกับ ram และซ่อมแซมตัวชี้บรรทัดของ โปรแกรมพื้นฐาน ...
เฟลิกซ์ Palmen

9

> <>และFooขนาด 42 ไบต์

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

ลองใช้ใน> <>!

ลองใน Foo!

ฟูพิมพ์ทุกอย่างใน"เอกสารอย่างดีและพยายามหารด้วยศูนย์ในตอนท้าย '><>'มันไม่สนใจ

><>ดัน "ฟู" เพื่อกองทันที pแต่ปรากฏว่ามันใช้ หลังจากที่มันพิมพ์ทุกอย่างไปยังสแต็กโดย#o<จะออกเมื่อสแต็กต์ว่างเปล่าพร้อมกับข้อความแสดงข้อผิดพลาดเท่านั้นที่รู้something smells fishy...


เหตุผลของข้อผิดพลาดมีความสำคัญไม่ใช่ข้อความแสดงข้อผิดพลาด หน้า esolang บนมีรายชื่อของเหตุผลข้อผิดพลาดดังนั้นผมเชื่อว่าคุณควรระบุหนึ่งของพวกเขาไม่ได้><> something smells fishy...
Bubbler

2
@Bubbler ข้อผิดพลาดเกิดจากการ popping จาก stack ที่ว่างเปล่า
ผลไม้แยกแยะ

3
การใช้pเพื่อป็อปFooมันฉลาดมาก!
ผลไม้แยกแยะ

6

C และ Python ขนาด126 116 ไบต์

-10 ไบต์ขอบคุณ @Bubbler!

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

ใน Python print () เป็น None ดังนั้นการพยายามลบมันก็ไม่สมเหตุสมผลดังนั้น Python จึงพ่นข้อผิดพลาดออกไป

ใน C printf () จะคืนค่า int ดังนั้นการหารด้วยศูนย์จะทำให้เกิดข้อยกเว้นจุดลอยตัว

ลองใน C!
ลองใช้งานใน Python!


1
คุณสามารถใช้-print(...)เพื่อยกระดับเป็นTypeErrorPython และจากนั้นคุณมีอิสระที่จะทำให้ข้อผิดพลาด Floating Point (หารด้วยศูนย์) ใน C รวมกับการขึ้นบรรทัดใหม่ซ้ำซ้อนบางส่วนนี่คือ 116 ไบต์ ( Python , C )
Bubbler

5

Attache + Wolfram Language (Mathematica) , 82 ไบต์

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

ลองใช้ทูตออนไลน์! ลอง Mathematica ออนไลน์!

pivots นี้ขึ้นอยู่กับความหมายของผู้ประกอบการ=ในสองภาษา ใน Attache จะเปรียบเทียบกับความเท่าเทียมกัน แต่ใน Mathematica จะทำการกำหนดตัวแปร :=ทำการกำหนดตัวแปรในทั้งสองภาษา

ในตอนนี้ใน Attache Printส่งคืนอาร์เรย์ของสตริงที่พิมพ์และการลบไม่สามารถทำได้ด้วยสตริงและจำนวนเต็ม (กล่าวคือ0) ดังนั้นข้อผิดพลาดประเภทถูกโยน ในมาติกาPrintผลตอบแทนNullและ Mathematica เป็นเพียงแค่ปรับการลบ0จากการที่ แต่เราโยนโมฆะนั้นด้วยตนเองThrowทำให้เกิดnocatchข้อผิดพลาด


หมายเหตุ: วิธีนี้ใช้ไม่ได้กับ attache รุ่นปัจจุบันเนื่องจากจุดบกพร่อง ฉันจะพยายามแก้ไขมันในไม่ช้า
Conor O'Brien

5

Python (2)และQB64 , 82 ไบต์

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

ในการทดสอบเวอร์ชัน Python คุณสามารถลองออนไลน์ได้! ในการทดสอบรุ่น QB64 คุณจะต้องดาวน์โหลด QB64

สิ่งที่หลามเห็น

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

บรรทัดแรกเป็นเพียงการแสดงออกเปลือย1(no-op) ตามด้วยความคิดเห็น

ชุดที่สองสายsสตริงแต่บรรทัดที่สามทันทีเปลี่ยนแปลงไป"QB64" "Python"บรรทัดที่สี่พิมพ์ข้อความตามนั้น

บรรทัดที่ห้าเป็นอีกหนึ่งการแสดงออกเปลือย แต่มันยกเพราะชื่อไม่ได้กำหนดNameErrorCLS

สิ่งที่ QB64 เห็น

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

บรรทัดแรกที่มีหมายเลข1#กำหนดตัวแปรทุกตัวที่มีชื่อขึ้นต้นด้วยS(ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่) เป็นตัวแปรสตริง ซึ่งหมายความว่าเราไม่จำเป็นต้องใช้s$ซึ่งจะเป็นข้อผิดพลาดทางไวยากรณ์ใน Python

ชุดที่สองสายสตริงs เริ่มแสดงความคิดเห็นใน QB64 ดังนั้นบรรทัดที่สามจึงไม่ทำอะไรเลย บรรทัดที่สี่พิมพ์ข้อความตามนั้น"QB64"'

บรรทัดที่ห้าพยายามที่จะCLS(หน้าจอที่ชัดเจน) -1ที่มีการโต้แย้งของ แต่เนื่องจากCLSยอมรับเฉพาะการขัดแย้งของ0, 1หรือนี้ผลิตข้อผิดพลาด2 Illegal function callข้อผิดพลาดสร้างกล่องโต้ตอบถามผู้ใช้ว่าพวกเขาต้องการดำเนินการต่อหรือยกเลิก ในทางเทคนิคหมายความว่าข้อผิดพลาดนั้นไม่ร้ายแรง (ในกรณีนี้คุณสามารถเลือก "ดำเนินการต่อ" และโปรแกรมจะสิ้นสุดลงโดยไม่มีปัญหาเพิ่มเติม) แต่ OP มีภาษาที่อนุญาตอย่างชัดเจนซึ่งสามารถดำเนินการต่อหลังจากเกิดข้อผิดพลาดดังนั้นพฤติกรรมของ QB64 น่าจะใช้ได้


3

Perl 5และJavaScript (Node.js) , 96 ไบต์

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

สิ่งนี้ทำให้การใช้งานความจริงที่ว่า(...)เป็นรายการใน Perl ที่printfจะใช้องค์ประกอบด้านซ้ายของและความจริงที่ว่ามันเป็นผู้ประกอบการเครื่องหมายจุลภาคใน JavaScript ซึ่งจะส่งกลับอาร์กิวเมนต์ที่ถูกต้องที่สุด

ทำให้การหารด้วยศูนย์ข้อผิดพลาดใน Perl และ ReferenceError เพราะ$ไม่ได้กำหนดไว้ใน JavaScript

ลองใช้ Perl ออนไลน์!

ลอง JavaScript ออนไลน์!


3

ระดับแปดเสียงและ MATLAB ขนาด 67 ไบต์

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

ลองออนไลน์!

หมายเหตุ: รหัสถือว่า MATLAB ถูกติดตั้งโดยไม่มีกล่องเครื่องมือ (หรือชื่อของกล่องเครื่องมือใด ๆ ที่ติดตั้งไม่ได้ขึ้นต้นด้วยตัวอักษร A ถึง M)

มันทำงานอย่างไร:

รหัสที่ได้รับข้อมูลที่เป็นเวอร์ชันสำหรับล่ามและ Toolboxes verใช้ วิ่งv(1).Nameแยกชื่อของผลิตภัณฑ์แรกนี้จะกลับมาOctaveหรือMATLABสมมติว่าบันทึกข้างต้นถือเป็นจริง

จากนั้นโปรแกรมจะแสดงสตริงที่ต้องการพร้อมด้วยOctaveหรือMATLABตามที่ต้องการ

v(--pi)สุดท้ายที่เราทำ

ใน Octave --เป็นโอเปอเรเตอร์การลดค่าล่วงหน้า เช่นนี้จะพยายามลดค่าลงล่วงหน้าซึ่งล้มเหลวเนื่องจากpiไม่มีตัวแปรอยู่ ( piเป็นฟังก์ชันจริงไม่ใช่ตัวแปร)

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

ใน MATLAB ไม่มีตัวดำเนินการลดค่าล่วงหน้า ในฐานะที่เป็นคำสั่งดังกล่าวจะถูกตีความว่าเป็นซึ่งเท่ากับเพียงv(-(-pi)) v(pi)อย่างไรก็ตามpiไม่ใช่จำนวนเต็มดังนั้นไม่สามารถใช้เพื่อจัดทำดัชนีลงในvอาร์เรย์ทำให้เกิดข้อผิดพลาด

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 ไบต์

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

ลองออนไลน์! (C ++ 14)

ลองออนไลน์! (C ++ 17)


สมมติว่า<cstdio>ประกาศprintfในเนมสเปซส่วนกลาง (นอกเหนือจากstd) และชุดอักขระการดำเนินการพื้นฐานใช้ค่า ASCII ซึ่งทั้งสองเป็นจริงโดยใช้ g ++ บน Linux

การจับขั้นพื้นฐานในที่นี้คือ C ++ 17 กำจัดตรีโกณมิติออกจากภาษา

ใน C ++ 14 "??/0"มี trigraph "\0"และเทียบเท่ากับ ดังนั้น*"??/0"เป็นศูนย์และcตั้งค่าเป็นศูนย์ หมายเลข 4 ถูกส่งผ่านเป็นอาร์กิวเมนต์ไปprintfแล้วหารด้วยcสาเหตุการทำงานที่ไม่ได้กำหนด บน Linux นี้เกิดขึ้นก่อนที่จะเข้ามาในภาพและโปรแกรมที่ได้รับ*pSIGFPE

ใน C ++ 17 "??/0"เท่ากับความยาวของสตริง 4 ที่มันปรากฏ ดังนั้น*"??/0"เป็น'?'หรือ 63 และcมีการตั้งค่า 3. จำนวน 7 จะถูกส่งผ่านเป็นอาร์กิวเมนต์ไปยังprintfและในครั้งนี้ส่วนโดยcถูกต้อง เนื่องจากpเป็นสมาชิกเนมสเปซจึงได้รับการกำหนดค่าเริ่มต้นเป็นศูนย์เมื่อเริ่มต้นโปรแกรมและมีค่าพอยน์เตอร์พอยน์เตอร์ดังนั้นจึง*pเป็นพฤติกรรมที่ไม่ได้กำหนด บน Linux SIGSEGVเพราะความพยายามในการโปรแกรมการปรับเปลี่ยนหน่วยความจำที่อยู่ที่ศูนย์โปรแกรมที่ได้รับ


mainสามารถละเว้นประเภทส่งคืนของได้ดังนั้น -3 ไบต์
Max Yekhlakov

2

Perl 5และPerl 6 , 55 ไบต์

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

ลอง Perl 5 ออนไลน์! (การแบ่งที่ผิดกฎหมายเป็นศูนย์)

ลอง Perl 6 ออนไลน์! (ไม่มีวิธีการดังกล่าว)

คำนำหน้า~คือการทำให้เป็นสตริงใน Perl 6 และโดยพื้นฐานแล้วจะไม่มีตัวเลือกในโปรแกรมข้างต้น ใน Perl 5 มันไม่ bitwise แปลง -1 เป็น 0

. เป็นไวยากรณ์การเรียกใช้เมธอดใน Perl 6 และการต่อข้อมูลใน Perl 5


2

C (gcc) / Stax , 109 ไบต์

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

ลองออนไลน์! (C (gcc))

ลองออนไลน์! (Stax)หรือRun และ debug! (สแตกซ์)

Segfault ใน C. การดำเนินการที่ไม่ถูกต้องใน Stax ฉันชอบที่ทุกอย่างที่ไม่ใช่ความคิดเห็นถูกใช้จริงในสแตกซ์

C

นี่คือวิธีที่ C เห็นมัน บรรทัดแรกคือไม่มีการใช้งาน บรรทัดที่สองพิมพ์ข้อความด้วยprintfแล้ว segfaults =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 สิ้นสุดลงเมื่อใดก็ตามที่พยายามป๊อปหรือแอบดูจากสแต็กเปล่า มันทำให้ยุ่งยากเล็กน้อยและเราต้องเตรียมสแต็กที่ไม่ว่างเปล่า AA=~1;ทำเช่นนี้ในขณะที่ยังคงอยู่คำสั่งที่ถูกต้องใน 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 (**)

สิ่งที่มีประโยชน์จริงๆคือ~มันเตรียมสแต็กอินพุตที่ไม่ว่างเพื่อให้;สามารถเรียกใช้งานได้โดยไม่ต้องออกจากโปรแกรม อย่างไรก็ตามทั้งสองตัว1บนสแต็กหลักยังถูกใช้ในภายหลัง

บรรทัดที่สองเริ่มต้นด้วยแท็บและเริ่มแสดงความคิดเห็นใน 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

การดำเนินการที่ไม่ถูกต้องพยายามดำเนิน/การกับสตริงเป็น TOS (ตัวถูกดำเนินการที่ 2) และหมายเลข1จาก (*) เป็นตัวถูกดำเนินการที่ 1 ซึ่งไม่ถูกต้อง

หากตัวถูกดำเนินการทั้งสองถูกสลับมันจะเป็นการดำเนินการที่ถูกต้องใน Stax


2

JellyและMขนาด 39 ไบต์

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

ลองในเยลลี่!

ลองใน M!

ทั้งสองภาษาใช้ผกผันİไป0ซึ่งผลลัพธ์ในinfสำหรับวุ้นและzooเอ็มผมไม่ทราบว่าทำไมzooหมายถึงอินฟินิตี้เอ็มขอให้เดนนิส

ความแตกต่างที่สำคัญคืออินฟินิตี้ของเจลลี่นั้นมีค่าเท่ากับตัวของมันเองในขณะที่อินฟินิตี้ของ M นั้นไม่ได้เป็นเช่นนั้น ดังนั้น "เท่ากับตัวเอง" =`ผลผลิตmonad 1ใน Jelly และ0M จากที่นี่:

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

EOFError: EOF when reading a lineข้อผิดพลาดเป็นวุ้น

ข้อผิดพลาดของ M TypeError: '>' not supported between instances of 'str' and 'int'คือ


1
คุณยังเริ่มทำเช่นนี้ในสอง esolangs ได้อย่างไร?
Magic Octopus Urn

2

Foo / CJam , 51 50 ไบต์

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

สิ่งนี้ออกจากข้อผิดพลาดหารด้วยศูนย์ใน Foo และNumberFormatExceptionใน CJam

ถึง CJam:

  • สตริงตัวอักษร (ระหว่างคำพูด) ผลักดันตัวเองไปยังกอง รายการจากสแต็กจะถูกพิมพ์โดยอัตโนมัติโดยไม่มีตัวคั่นเมื่อโปรแกรมสิ้นสุด
  • /พยายามที่จะแยกสตริงในอักขระย่อยThis program errors out in Fooเนื่องจากสตริงไม่มีสตริงย่อยสิ่งนี้จะให้ผลลัพธ์อาร์เรย์เดี่ยวที่มีสตริงต้นฉบับซึ่งแสดงในลักษณะเดียวกัน
  • 'xเป็นตัวอักษรสำหรับxซึ่งพิมพ์ในลักษณะเดียวกับสตริงอักขระหนึ่งตัว ด้วยวิธีนี้เราสามารถผลักดันข้อมูลสำหรับ CJam ที่ไม่ได้รับอนุญาตจาก Foo (ฉันไม่ได้คิดวิธีการสร้างลูปที่ไม่ได้ดำเนินการใน Foo)
  • Liพยายามที่จะส่งสตริงว่างให้เป็นจำนวนเต็มซึ่งล้มเหลว ทุกอย่างจากสแต็กถูกพิมพ์

เพื่อฟู:

  • สตริงตัวอักษร (ระหว่างคำพูด) พิมพ์ตัวเอง
  • /พยายามแบ่งเซลล์ปัจจุบันด้วยองค์ประกอบสแต็คด้านบน (ซึ่งเป็นนัย0) ด้วยเหตุผลบางอย่างข้อผิดพลาดหารด้วย 0 จะไม่ร้ายแรงใน Foo ดังนั้นนี่เป็นเพียงพิมพ์ข้อความ
    Only Chuck Norris can divide by zero.
    ถึง STDERR และเดินหน้าต่อไป
  • อักขระที่ไม่รู้จัก ( 'C'J'a'mและLi) ถูกละเว้น

2
ไม่ใช่ 50 ไบต์หลังหรือไม่
Bubbler

@Bubler ลืมที่จะแก้ไขขออภัย
แยกผลไม้

7
ฉันคิดว่ามีข้อผิดพลาดในล่าม Foo เห็นได้ชัดว่าควรมีข้อผิดพลาดกับOnly Jon Skeet can divide by zero. meta.stackexchange.com/a/9138

2

PythonและLua , 111 110 102 98 95 85 ไบต์

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

ข้อผิดพลาด: 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 ?

ชัดเจน

ละเมิดความแตกต่างหลายประการ:

  • <var>=<a>,<b>,... สร้าง tuple ใน Python แต่ใน Lua มันจะสร้างรายการอาร์กิวเมนต์ซึ่งจะมีเฉพาะสมาชิกแรกเท่านั้น
  • #เริ่มความคิดเห็นใน Python แต่เป็นตัวดำเนินการความยาวใน Lua อุปกรณ์ประกอบฉากเพิ่มเติมให้งูหลามสำหรับอนุญาตให้ tuples สิ้นสุดในเครื่องหมายจุลภาค
  • [[...]]เป็นไวยากรณ์สตริงหลายบรรทัดของ Lua ซึ่งหมายความว่ามันจะไม่เห็นฟังก์ชั่นการพิมพ์ของ Python นี้เป็นเพราะความจำเป็นที่จะต้องใช้ Lua ..สำหรับ concatenation +สตริงและไม่ได้
  • Python error หลังจากเห็นaตัวแปรที่ไม่ได้กำหนด z=#print(x.."Lua :P")หลังจาก Lua การใช้เพียง#print(x.."Lua :P")Lua นั้นใช้ไม่ได้เพราะนั่นทำให้เกิดข้อผิดพลาดก่อนที่จะมีการเรียกใช้โค้ด

การแก้ไข:

  • ไม่จำเป็นต้องใช้"".joinใน Python -1 ไบต์
  • สร้างxสตริงในทั้งสองภาษาและวางPythonในสตริงตัวอักษรในฟังก์ชันการพิมพ์ -8 ไบต์
  • การใช้#[[]]สั้นกว่า#""และ--[[]]-4 ไบต์
  • ไม่จำเป็นต้องใช้#1เป็นคีย์ตาราง, -3 ไบต์
  • โจคิงทำสิ่งนี้ -9 ไบต์
  • การเอาความยาวของมูลค่าprint(x.."Lua :P")งานคืนกลับมา -1 ไบต์


2

Java และ 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]/**/;}}

การใช้การหลีกเลี่ยงที่แตกต่างกันระหว่างจาวาและ C # (การหลบหนีแบบยูนิโค้ดจะถูกแยกวิเคราะห์ก่อนการแยกวิเคราะห์โค้ดในจาวาและไม่ใช่ใน c #) ในรูปแบบของตัวประมวลผลล่วงหน้านั่นคืองานของ\u0027เวทย์มนตร์

แก้ไข: Golfed off 8 ไบต์ด้วยตัวชี้ของ @KevinCruijssen

แก้ไข: แก้ไขกฎของ derp


คุณสามารถเล่นกอล์ฟ 6 ไบต์ได้โดยเปลี่ยนทั้งสองอย่างStringในvar(Java 10 รองรับสิ่งนี้) (หรือ 5 โดยการเปลี่ยนString s="...";เป็นString s="...",x;และลบStringด้านหน้าx=ใน Java 9 หรือก่อนหน้า)
Kevin Cruijssen

1
การใช้งาน S-string ซ้ำอีกครั้งเช่นเดียวกับ java99 และก่อนหน้านี้ @KevinCruijssen
masterX244

2

AutoHotKey / C #, 155 133 128 122 ไบต์

การเน้นไวยากรณ์อธิบายได้ดีกว่าที่ฉันทำได้:

C # RuntimeBinderException: 'ไม่สามารถเรียกใช้ประเภทที่ไม่ใช่ผู้รับมอบสิทธิ์'

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

ข้อผิดพลาดAutoHotkey : มีข้อผิดพลาดเกิดขึ้น

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

การแก้ไข:

  1. ลบ var
  2. -5 ไบต์ต้องขอบคุณนม

2
ต่อไปนี้เป็นข้อยกเว้นที่สั้นลงเล็กน้อยที่จะโยนใน C i+=i[-1]#: System.IndexOutOfRangeException: 'ดัชนีอยู่นอกขอบเขตของอาร์เรย์'
นม

2
เล็กน้อยสั้นยังคงที่จะใช้dynamicแทนvarและโยน Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: i()'ไม่สามารถเรียกไม่ใช่ประเภทผู้ร่วมประชุมด้วย
นม

2

PHP 7+ / JavaScript, 90 89 ไบต์

สิ่งนี้ใช้ 2 ภาษาที่มีไวยากรณ์คล้ายกันมากทำให้สามารถเขียนโค้ดนี้ได้ทั้งสองภาษา

การแยกภาษาจะกระทำโดยคุณสมบัติที่ไม่ได้อยู่ในจาวาสคริปต์: PHP พิจารณา[](อาร์เรย์ที่ว่างเปล่า) เพื่อเป็นค่า falsy ขณะที่มันเป็น truthy ใน JavaScript (เพราะมันเป็นวัตถุและวัตถุเสมอ truthy แม้new Boolean(false))

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


การดำเนินการ:

([]?console.log($X,'JavaScript'):printf($X,PHP))();จะมุ่งเน้นไปที่ชิ้นต่อไปนี้รหัส:

การระบุแหล่งที่มาของสตริงจะทำงานเหมือนกันในทั้งสองภาษา

รหัสนี้ใช้ "ผู้ประกอบการที่สาม" ( Javascript , PHP ) ซึ่งทำงานเหมือนกันทั้งสองภาษา

จาวาสคริ

จาวาสคริปต์จะทำงานชิ้นซึ่งผลตอบแทนconsole.log($X,'JavaScript')undefined

ต่อมาเมื่อคุณพยายามที่จะดำเนินการ(...)()คุณจะได้รับUncaught TypeError: (intermediate value)(intermediate value)(intermediate value) is not a function(ใน Google Chrome)

PHP

PHP จะดำเนินการprintf($X,PHP)ชิ้นส่วน

ใน PHP ที่printfฟังก์ชั่นส่งกลับความยาวของการส่งออก

PHP มีฟังก์ชั่นที่น่าสนใจ: มันสามารถเรียกใช้ฟังก์ชั่นที่ชื่อของมันถูกเก็บไว้ในตัวแปร (หรือตั้งแต่ PHP7 เป็นผลมาจากการแสดงออก) ซึ่งป้องกันข้อผิดพลาดทางไวยากรณ์

PHP จะพยายามเรียกใช้ฟังก์ชั่นที่ชื่อนั้นคือผลลัพธ์ของนิพจน์[]? ... :printf($X,PHP)(ซึ่งเป็นตัวเลข33)
แต่ฟังก์ชั่นที่น่าสนใจนั้นมีข้อแม้: ยอมรับเฉพาะสตริง (duh!)

นี้ทำให้เกิดFatal error: Function name must be a stringเพราะเป็น33int


ขอบคุณShieru Asakoto ที่ช่วยฉัน 1 ไบต์!


1
[]สั้นกว่า'0'และประเมินแตกต่างกันใน JS และ PHP ดังนั้นอาจเป็น -1 ไบต์ที่นี่
Shieru Asakoto

ฉันมีคำถามมากมายเกี่ยวกับปัญหาที่ซึ่ง[]ความต้องการที่จะนำมาใช้แทน'0', '\0', '\0'=="0"และใช้ว่า[]ก่อนที่จะได้เป็นอย่างดี แต่ขอขอบคุณที่พบคำถามนี้
Ismael Miguel

1

Perl 5 และ C, 95 ไบต์

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

//; เป็นพื้น NOP ใน perl และเป็นความคิดเห็นใน C.

ดังนั้นโปรแกรม C จึงมีประสิทธิภาพ:

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

puts(32)ซึ่งพิมพ์สตริงที่จำเป็นแล้วพยายามที่จะวิ่ง นี่เป็นพฤติกรรมที่ไม่ได้กำหนดทางเทคนิคใน C แต่มันทำให้เกิดความผิดพลาดในการแบ่งส่วนบน TIO และทุกระบบที่ฉันเข้าถึง

ถือว่าโปรแกรม Perl โปรแกรมทั้งหมด C เป็นสตริงใช้ regex ไม่/T.*n /ให้ตรงแล้วพิมพ์ที่และThis program errors out in ทำให้โปรแกรมที่ผิดพลาดกับข้อผิดพลาดperl :PdieDied at script_name line 2

หากคุณไม่ชอบสิ่งนั้นเป็นข้อผิดพลาด1/0ความยาวเท่ากันและขัดข้องด้วยIllegal division by zeroข้อผิดพลาด ฉันชอบdieมาก;)

ลองออนไลน์! (C)

ลองออนไลน์! (Perl)


1

VBScript, JScript, 72 ไบต์

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

VBScript จะพิมพ์ "Microsoft VBScript runtime error: ชนิดไม่ตรงกัน: 'y'"
JScript จะพิมพ์ "Microsoft JScript runtime error: 'y' ไม่ได้ถูกกำหนด"


1

JavaScript & Python 3, 105 91 ไบต์

ข้อผิดพลาดโดยNameError: name 'console' is not definedใน Python 3

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

ลองออนไลน์!

... และโดยTypeError: console.log(...) is not a functionใน JavaScript

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

ลองออนไลน์!


1

Java (JDK) / JavaScript (Node.js), 154 ไบต์

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

ลองออนไลน์! (Java)

ลองออนไลน์! (จาวาสคริปต์)

ผลผลิตใน Java:

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

เอาต์พุตใน JavaScript (ไปยัง stderr):

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

สิ่งนี้ใช้ประโยชน์จากการพิมพ์ที่อ่อนแอของ JavaScript ( 1=='1') เพื่อตรวจจับภาษาและคำหลักเดียวกันใน Java และ JavaScript ( var, class) และตัวสร้างข้อผิดพลาดที่คล้ายกัน ( new Error()) เพื่อสร้างรูปหลายเหลี่ยม


1

PowerShell v6 และ PowerShell v2, 73 ไบต์

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

ลองออนไลน์!

สิ่งนี้จะทำให้เกิดข้อผิดพลาดในการวิเคราะห์คำใน v2 เพราะ-shlถูกนำมาใช้ใน v3 v3 + จะสามารถเปลี่ยนค่าได้อย่างถูกต้องก่อนที่จะพยายามหารด้วย 0 ทำให้การแบ่งข้อผิดพลาดเป็นศูนย์สะดวกขึ้น ทั้งสองเวอร์ชันมีแฮชแมป $ PSVersionTable ซึ่งมีPSVersionฟิลด์


0

C (gcc) บน Linux / C (gcc) บน 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();}

ยังไม่ทดลองบน Mac; โดยพื้นฐานแล้ว John Cook ชี้ให้เห็น (ในบล็อกของเขา ) ว่า POSIX ไม่ได้กำหนดแกมม่า Linux ใช้บันทึกของฟังก์ชันแกมม่า (บันทึก (แกมม่า (1)) จะส่งกลับ 0 ซึ่งจะทำให้เกิดข้อยกเว้นจุดลอยตัว); OSX ใช้ฟังก์ชันแกมม่า "จริง" (ซึ่งเรียกอย่างเป็นทางการว่า tgamma ต่อ POSIX) ส่งกลับค่า 1 ซึ่งจะกดคำสั่งยกเลิก ฉันพยายามทำให้มันเกิดข้อผิดพลาดในจุดลอยตัวที่แตกต่างกัน (เช่น sqrt (-1) แต่ฉันลืมวิธีที่จะทำให้เกิดข้อผิดพลาดนั้นเทียบกับเพิ่งกลับศูนย์)


0

Perl, Bash (78 ไบต์)

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

ผลผลิตใน Perl:

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

เอาต์พุตใน Bash:

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

(โปรดทราบว่า Bash แสดงline 4ข้อผิดพลาดอย่างแท้จริงแม้จะมีความจริงที่ว่าบรรทัดที่ 3 ไม่ได้จบลงด้วยการป้อนบรรทัด ... )



0

C (gcc)และHaskell , 135 ไบต์

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

ลองออนไลน์ (С)! ลองออนไลน์ (Haskell)!

ผลลัพธ์ที่ได้นั้นเกิดจากการรวมความคิดเห็นเข้าด้วยกันซึ่งเวอร์ชั่น C นั้นเป็นสิ่งนี้:

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

(ความล้มเหลวเกิดจากการเขียนก่อนจุดเริ่มต้นของสตริง)

ในทางกลับกันเวอร์ชันของ Haskell จะลดลงดังนี้:

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

(ความล้มเหลวเกิดขึ้นได้จากการทำให้รายการว่าง)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.