รหัสสนามกอล์ฟ


55

แรงบันดาลใจจากค่าเริ่มต้นนี้สำหรับ IO

งาน

เขียนโปรแกรมที่ได้รับจำนวนเต็มใส่xระหว่าง 0 และ 255 xเกิดปัญหาด้วยรหัสทางออก

ข้อ จำกัด

  • คุณไม่สามารถเรียกสิ่งใด ๆ ที่มีไว้สำหรับส่งออกรหัสโดยตรง ( System.exit(x)ส่งคืนจากmainฯลฯ ) แต่โปรแกรมของคุณจะต้องทำให้เกิดข้อผิดพลาดหรือความผิดพลาดซึ่งจะทำให้เกิดความเป็นไปได้ที่ 1 คือโปรแกรมที่จะออกด้วยจำนวนเต็มอินพุท
    • ในกรณีนี้คำว่า "ผิดพลาด" และ "ผิดพลาด" หมายถึงโปรแกรมทำให้เกิดข้อยกเว้นที่ไม่คาดคิดร้ายแรงซึ่งในกรณีนั้นมีวิธีการใช้งานการดำเนินการหรือใช้งานอย่างไม่ถูกต้อง
    • คุณอาจไม่ทำให้เกิดข้อผิดพลาดโดยตรงโดยการโยนมันโดยตรง คุณต้องทำให้เกิดขึ้นโดยใช้วิธีการฟังก์ชั่นหรืออื่น ๆ ที่มีวัตถุประสงค์ให้บริการฟังก์ชั่นที่แตกต่างกัน (เช่นพยายามที่จะดำเนินการเขียนไฟล์ไปยังไดเรกทอรีอ่านอย่างเดียว)
  • คุณต้องมีรหัสทางออกอย่างน้อยสองรหัสในโปรแกรมของคุณ
  • การยุติกระบวนการด้วยการใช้สัญญาณถูกแบน (อาจพบเหตุผลในการสนทนานี้ )

เกณฑ์การให้คะแนน

คะแนนของโปรแกรมของคุณจะถูกกำหนดโดยจำนวนรหัสทางออกที่รองรับซึ่งการสรุปรหัสคือ tiebreaker จำนวนรหัสทางออกที่รองรับมากที่สุดจะเป็นผู้ชนะ!


เพื่อชี้แจงหากฉันแจ้งข้อผิดพลาดนั่นเป็นสิ่งผิดกฎหมายใช่หรือไม่
Anthony Pham

@AnthonyPham หากคุณยกมัน ( throw new Exception()สไตล์) โดยตรงนั่นเป็นสิ่งผิดกฎหมาย ถ้ามันเป็นผลพลอยได้จากการใช้ฟังก์ชั่นที่มีอยู่ผิดนั่นก็ถือว่าใช้ได้
Addison Crump

@VoteTo ปิดฉันเดาว่าฉันยังไม่ชัดเจนพอ ฉันเห็นด้วยกับคุณ แต่แนะนำให้พูดสี่เหลี่ยมแทนที่จะเป็นแฟคทอเรียล แต่อะไรก็ตามมันไม่สำคัญเลยมันเป็นแค่คำแนะนำ
Maltysen

8
การยอมรับการป้อนข้อมูลเป็นตัวเลขภาษาอังกฤษที่สะกดออกมา (เช่นone zero zeroสำหรับ 100) ยอมรับได้หรือไม่ ฉันมีความคิดสำหรับความท้าทายนี้ แต่ภาษานั้นมีความคิดแปลก ๆ เกี่ยวกับ I / O และนี่คือรูปแบบอินพุตที่เป็นธรรมชาติที่สุด

5
ฉันจะพิจารณาExit Code Golfingเป็นชื่อ clickbait แม้ว่ามันจะถูกต้องก็ตาม <(° _ ° <)
RaisingAgent

คำตอบ:


48

Unix Shell (+ ncurses + อรรถประโยชน์ BSD), 36, 26 ไบต์, 256 รหัสทางออก

แข็งแรงเล่นกอล์ฟ

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

หากใช้ตัวเลือก -S tput จะตรวจสอบข้อผิดพลาดจากแต่ละบรรทัดและหากพบข้อผิดพลาดใด ๆ จะตั้งรหัสทางออกเป็น 4 รวมถึงจำนวนบรรทัดที่มีข้อผิดพลาด หากไม่พบข้อผิดพลาดรหัสทางออกคือ 0 ไม่มีการระบุว่าสายใดที่ไม่สามารถให้ได้ดังนั้นรหัสทางออก 1 จะไม่ปรากฏขึ้น รหัสออก 2, 3 และ 4 จะยังคงมีการตีความตามปกติ

เมื่อรหัสการออกจากtputไปที่ 255 มันเป็นมากเกินดังนั้น 253 (ข้อผิดพลาดในการป้อนข้อมูล) จะส่งผลให้รหัสการออกของ 1 ฯลฯ จึงให้สถานะทางออกที่ต้องการสำหรับช่วงทั้งหมดของอินพุต

หมายเหตุ : tputจะล้มเหลวหรือไม่เมื่อตั้งค่า / รับความสามารถเฉพาะขึ้นอยู่กับประเภทของเทอร์มินัลฉันใช้:xterm with 256 colors

jotเป็นยูทิลิตี้BSDซึ่งพิมพ์ข้อมูลตามลำดับหรือแบบสุ่มและ (AFAIK) ก็มีให้ใช้งานในระบบ OSX เช่นกัน

หากระบบของคุณไม่jotพร้อมใช้งานคุณสามารถใช้เวอร์ชันที่ยาวกว่าเล็กน้อย (29 ไบต์):

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

ลองออนไลน์! (เวอร์ชั่น 29 ไบต์)


ว้าวนั่นมันค่อนข้างดี +1
Addison Crump

45

Bash 4.2 + พิเศษ, รหัสออก 24 รหัส

grep \#$1$ $0|sed 's:#.*::;s:T:tcc -run -<<<main=:;s:C:curl -L x.org/! :'|sh;exit
man#1
C-#2
C/#3
sed#4
C-x/#5
C_#6
C0#7
man /#16
C-f#22
C-o/#23
C-L3#35
C--capath /#60
C--max-filesize 1#63
C--cacert /#77
timeout 1e-9 w#124
/#126
-#127
T6\;#132
T204\;#133
$[2**63%-1]#136
{0..1000000000}#137
T0\;#139
exit _#255

ขอบคุณ @ KenY-N สำหรับรหัสทางออก 3 รายการ ขอบคุณ @ el.pescado สำหรับรหัสออก 1 อัน

การตรวจสอบ

การทดสอบทั้งหมดได้รับการดำเนินการใน openSUSE 13.2

$ for n in {0..255}; do bash exit.sh $n; (($? == $n)) && echo $n >&0; done &> /dev/null
0
1
2
3
4
6
7
16
22
23
35
60
63
77
124
126
127
132
133
136
137
139
255

1
รหัสทางออก 5:http_proxy=fafa curl http://example.org
el.pescado

1
@ el.pescado ฉันใช้เวลากว่าปี แต่ในที่สุดฉันก็ใช้คำแนะนำของคุณ ขอขอบคุณ!
Dennis

30

INTERCAL (C-INTERCAL), 15 รหัส, 313 + 2 = 315 ไบต์

        PLEASE WRITE IN .1
(8)     PLEASE CREATE .1 A
        PLEASE A
        PLEASE COME FROM #2$!1/#1'

        DO X
(123)   DO (123) NEXT
        DO COME FROM (222)
(222)   DO STASH .2
(240)   DO ,1 <- #0
(241)   DO ,1 SUB #0 <- #1
(19)    DO .2 <- #256 $ #0
(21)    DO .1 <- #2
(148)   DO GO BACK
(180)   DO RETRIEVE .2
        DO COME FROM (50)
(50)    DO WRITE IN .2
(109)   DO RESUME #0
(120)   DO RESUME #9
        MAYBE COME FROM (223)
(223)   DO COME FROM (223)
(121)   PLEASE NOT X

ลองออนไลน์!

ช่องว่างทั้งหมดที่นี่ไม่เกี่ยวข้อง (โปรแกรมต้นฉบับมีแท็บ แต่ฉันแปลงมันเป็นช่องว่างเพื่อให้มันเข้าแถวได้อย่างถูกต้องใน SE มันเป็นเรื่องธรรมดาที่จะใช้ความกว้างของแท็บที่ 8 สำหรับ INTERCAL ฉันได้ทดสอบเวอร์ชันของโปรแกรมด้วยแท็บทั้งหมดเว้นวรรค และลบบรรทัดใหม่แล้ว แต่ก็ใช้ได้ดี)

คอมไพล์ด้วย-abm(การลงโทษ 2 ไบต์เนื่องจาก-bจำเป็นสำหรับคอมไพเลอร์ที่จะกำหนดขึ้น)

ในฐานะที่เป็นปกติสำหรับ INTERCAL นี้จะใช้เวลาการป้อนข้อมูลที่เป็นตัวเลขในรูปแบบเช่นสำหรับONE TWO THREE123

คำอธิบาย

เมื่อโปรแกรม C-INTERCAL ผิดพลาดสถานะทางออกคือรหัสข้อผิดพลาดมอดูโล 256 ดังนั้นเราจึงสามารถเขียนโปรแกรมที่สามารถสร้างข้อผิดพลาดรันไทม์ให้ได้มากที่สุด โปรแกรมนี้ละเว้นข้อผิดพลาดรันไทม์สองรายการเท่านั้นที่ไม่ได้ระบุปัญหาคอมไพเลอร์ภายใน: ICL200I เนื่องจากการทำซ้ำต้องใช้ไลบรารีภายนอกที่เข้ากันได้กับโปรแกรมแบบเธรดเดียวเท่านั้น (และโปรแกรมแบบมัลติเธรดมีข้อผิดพลาดเพิ่มเติม) และ ICL533I เนื่องจาก 533 มีค่าโมดูโล 256 เช่นเดียวกับ 277 และโปรแกรมของความสามารถในการผลิต ICL277I

โปรแกรมเริ่มต้นด้วยวิธีเดียวกันเสมอ ครั้งแรกที่เราป้อนข้อมูล ( WRITE IN) .1ค่าสำหรับตัวแปร จากนั้นเราใช้CREATEคำสั่งที่คำนวณเพื่อสร้างไวยากรณ์ใหม่ (ที่นี่A); .1แต่เพราะมันคำนวณความหมายของไวยากรณ์ที่แตกต่างกันไปขึ้นอยู่กับมูลค่าของ ในที่สุดกรณีส่วนใหญ่เราเรียกใช้Aคำสั่งใหม่ของเราซึ่งได้รับการกำหนดให้ผลิตข้อผิดพลาด; ตารางคำจำกัดความที่เป็นไปได้ที่เรามีมีคำจำกัดความสำหรับข้อผิดพลาดรันไทม์ที่เป็นไปได้แต่ละข้อ (นอกเหนือจากข้อยกเว้นที่ระบุไว้ด้านบน)

ครั้งแรกมีข้อยกเว้นสองประการสำหรับโครงการทั่วไปนี้ (0)ไม่ใช่หมายเลขบรรทัดที่ถูกต้องดังนั้นหากผู้ใช้ป้อนZEROเราจะข้ามจากบรรทัดที่สอง (หมายเลข(8)) ไปยังบรรทัดที่สี่โดยใช้COME FROMคำสั่งที่คำนวณ นี้จากนั้นจะตกผ่านลงในไวยากรณ์ผิดพลาดซึ่งก่อให้เกิดข้อผิดพลาดDO X ICL000I(ใน INTERCAL ข้อผิดพลาดทางไวยากรณ์เกิดขึ้นที่รันไทม์เนื่องจากแนวโน้มของคำสั่งที่จะปิดการใช้งานไวยากรณ์ที่จะถูกกำหนดใหม่ภายใต้คุณ ฯลฯ ) COME FROMคำสั่งนอกจากนี้ยังมีผลข้างเคียงแม้ว่าจะไม่มีเกิดขึ้นจริงCOME FROMที่เกิดขึ้นสร้างเกินตัวถูกดำเนินการจาก.1ไป#1เมื่อใดก็ตามที่สอดคล้องกับจำนวนเส้นจะถูกดำเนินการ; สิ่งนี้จะถูกใช้ในภายหลังเมื่อผลิตผลลัพธ์ 21. (ผลข้างเคียงจากการสุ่มทั่วโลกนั้นค่อนข้างเป็นสำนวนใน INTERCAL)

ยกเว้นในกรณีอื่น ๆ ONE TWO NINEคือมีการป้อนข้อมูล ไม่มีหมายเลขบรรทัดเป็นในโปรแกรมเพื่อให้เราได้รับข้อผิดพลาดสำหรับจำนวนเส้นที่ขาดหายไปซึ่งเป็น(129) ICL129Iดังนั้นฉันไม่ต้องเขียนโค้ดใด ๆ เพื่อให้ครอบคลุมกรณีดังกล่าวเลย

นี่คือข้อผิดพลาดอื่น ๆ และสิ่งที่ทำให้พวกเขา:

  • 123คือNEXTสแต็กล้น ( DO (123) NEXT) NEXTคำสั่งปรับเปลี่ยนความต้องการอื่น ๆ ( FORGETหรือRESUME) เพื่อให้มีผลย้อนหลังกำหนดประเภทของคำสั่งการควบคุมมันเป็น ไม่มีปัญหาเหล่านั้นที่ทำให้เกิดข้อผิดพลาด ICL123I เมื่อมี 80 คำสั่ง NEXT ที่ยังไม่ได้แก้ไข
  • 222เป็น stash overflow ( DO STASH .2ในCOME FROMลูป) ที่เก็บถูก จำกัด ด้วยหน่วยความจำที่มีอยู่เท่านั้น แต่จะหมดในที่สุดทำให้เกิดข้อผิดพลาด ICL222I
  • 240คือขนาดของอาร์เรย์ที่มีขนาดเป็นศูนย์ นั่นคือสิ่งที่DO ,1 <- #0หมายถึงและมันทำให้เกิดข้อผิดพลาด ICL240I
  • 241เกิดจากการกำหนดนอกขอบเขตของอาร์เรย์ ในกรณีนี้,1ยังไม่ได้รับการจัดสรร ( ,ใช้สำหรับตัวแปรประเภทอาร์เรย์ใน INTERCAL) ดังนั้นการจัดทำดัชนีจะทำให้เกิดข้อผิดพลาด ICL241I
  • 19กำหนด 65536 ( #256 $ #0) .2ให้กับตัวแปร ไม่พอดีทำให้เกิดข้อผิดพลาด ICL275I
  • 21ได้รับมอบหมายไป#2 .1นั่นอาจดูเหมือนการมอบหมายที่ง่าย แต่เราโหลดมากเกินไป.1เพื่อหมายถึง#1ก่อนหน้านี้และพยายามเปลี่ยนค่า 1 โดยไม่มี-vตัวเลือกในบรรทัดคำสั่งทำให้เกิดข้อผิดพลาด ICL277I
  • 148ความพยายามที่จะกลับไปที่รายการด้านบนของ choicepoint stack ( GO BACK) ซึ่งไม่มีอยู่ในจุดนี้ในโปรแกรม (เราไม่ได้เรียกใช้คำสั่งใด ๆ เพื่อจัดการกับ stack pointpoint ดังนั้นจึงยังว่างอยู่) ที่ทำให้เกิดข้อผิดพลาด ICL404I
  • 180ความพยายามในRETRIEVE .2การซ่อนที่ไม่มีอยู่ (เนื่องจากเราไม่ได้ซ่อนอะไรในโปรแกรมนี้ในสาขานี้) ทำให้เกิดข้อผิดพลาด ICL436I
  • อินพุตคำขอ50รายการ ( WRITE IN) ตลอดไปในการCOME FROMวนซ้ำ ในที่สุดเราจะจบการอ่าน EOF ที่ผ่านมาทำให้เกิดข้อผิดพลาด ICL562I
  • 109รันคำสั่งDO RESUME #0ซึ่งไม่มีความหมายและจัดทำเป็นเอกสารโดยเฉพาะว่าทำให้เกิดข้อผิดพลาด (ICL621I)
  • 120DO RESUME #9วิ่งคำสั่ง เรายังไม่ได้เรียกใช้NEXTงบจำนวนมากดังนั้นเราจึงได้รับข้อผิดพลาด ICL120I (น่าประหลาดใจข้อผิดพลาดนี้ถูกกำหนดไว้ในเอกสาร INTERCAL ว่าออกจากโปรแกรมตามปกติแล้วทำให้เกิดข้อผิดพลาดแทนที่จะออกจากโปรแกรมด้วยข้อผิดพลาดฉันไม่เชื่อว่าทั้งสองกรณีนี้แตกต่างกันอย่างเห็นได้ชัด)
  • 223นั้นโดยทั่วไปแล้วมีความซับซ้อนของมัลติเธรดมัลติเธรดที่ทุกจุดกลับสู่บรรทัดที่ 223 ทำให้เกิดการวนซ้ำไม่สิ้นสุดที่ทำให้หน่วยความจำหมด ในที่สุดมีหน่วยความจำหมดในระบบย่อยแบบมัลติเธรดซึ่งนำไปสู่ข้อผิดพลาด ICL991I
  • จริง ๆ แล้ว121เป็นคำสั่งที่ถูกต้อง (มันเป็นความคิดเห็น) แต่จะปรากฏที่ส่วนท้ายของโปรแกรม ด้วยเหตุนี้การเรียกใช้จะหยุดการทำงานของโปรแกรมทันทีหลังจากดำเนินการแล้วทำให้เกิดข้อผิดพลาด ICL633I

การตรวจสอบ

ข้อผิดพลาดบางอย่างเกี่ยวข้องกับการรันโปรแกรมโดยไม่ใช้หน่วยความจำดังนั้นฉันขอแนะนำให้ตั้งค่าขีด จำกัด หน่วยความจำขนาดเล็กพอสมควร นี่คือคำสั่งเชลล์ที่ฉันใช้ในการทดสอบโปรแกรม (โดยเพิ่มบรรทัดใหม่เพื่อให้สามารถอ่านได้ให้ลบออกหากคุณรันด้วยตัวเอง):

for x in "ZERO" "ONE NINE" "TWO ONE" "FIVE ZERO" "ONE ZERO NINE"
         "ONE TWO ZERO" "ONE TWO ONE" "ONE TWO THREE" "ONE TWO NINE"
         "ONE FOUR EIGHT" "ONE EIGHT ZERO" "TWO TWO TWO"
         "TWO TWO THREE" "TWO FOUR ZERO" "TWO FOUR ONE";
do  echo;
    echo $x;
    echo $x | (ulimit -Sd 40000; ulimit -Sv 40000; ulimit -Ss 40000;
               ./errors; echo $?);
done

และนี่คือผลลัพธ์ (ที่มีหมายเลขบรรทัดและข้อความ "โปรดแก้ไขแหล่งที่ถูกลบ" เพื่อประหยัดพื้นที่) ซึ่งฉันได้เพิ่มบางส่วนเพื่อสาธิตการทำงานของโปรแกรม แต่ส่วนใหญ่จะแสดงข้อความผิดพลาดของ INTERCAL:

ZERO
ICL000I PLEASEWRITEIN.1(8)PLEASECREATE.1APLEASEAPLEASECOMEFROM#2$!1/#1'DOX(123)DO(123)NEXTDOCOMEFROM(222)(222)DOSTASH.2(240)DO,1<-#0(241)DO,1SUB#0<-#1(19)DO.2<-#256$#0(21)DO.1<-#2(148)DOGOBACK(180)DORETRIEVE.2DOCOMEFROM(50)(50)DOWRITEIN.2(109)DORESUME#0(120)DORESUME#9MAYBECOMEFROM(223)(223)DOCOMEFROM(223)(121)PLEASENOTX
0

ONE NINE
ICL275I DON'T BYTE OFF MORE THAN YOU CAN CHEW
19

TWO ONE
ICL277I YOU CAN ONLY DISTORT THE LAWS OF MATHEMATICS SO FAR
21

FIVE ZERO
ICL562I I DO NOT COMPUTE
50

ONE ZERO NINE
ICL621I ERROR TYPE 621 ENCOUNTERED
109

ONE TWO ZERO
ICL632I THE NEXT STACK RUPTURES.  ALL DIE.  OH, THE EMBARRASSMENT!
120

ONE TWO ONE
ICL633I PROGRAM FELL OFF THE EDGE
121

ONE TWO THREE
ICL123I PROGRAM HAS DISAPPEARED INTO THE BLACK LAGOON
123

ONE TWO NINE
ICL129I PROGRAM HAS GOTTEN LOST
129

ONE FOUR EIGHT
ICL404I I'M ALL OUT OF CHOICES!
148

ONE EIGHT ZERO
ICL436I THROW STICK BEFORE RETRIEVING!
180

TWO TWO TWO
ICL222I BUMMER, DUDE!
222

TWO TWO THREE
ICL991I YOU HAVE TOO MUCH ROPE TO HANG YOURSELF
223

TWO FOUR ZERO
ICL240I ERROR HANDLER PRINTED SNIDE REMARK
240

TWO FOUR ONE
ICL241I VARIABLES MAY NOT BE STORED IN WEST HYPERSPACE
241

4
นี่อาจเป็นโปรแกรม INTERCAL ที่ยิ่งใหญ่ที่สุดที่ฉันเคยเห็น
Skyler

27

Perl, 108 ไบต์, 256 รหัสทางออก

โปรแกรมนี้ (ab) ใช้การทดสอบ ::โมดูลเพิ่มเติม มันพยายามที่จะเปิดไฟล์ชื่อ"" nครั้งที่ได้รับnเป็นอาร์กิวเมนต์บรรทัดคำสั่ง มันล้มเหลวทุกครั้งและการขอร้องแต่ละครั้งจะถือเป็นแบบทดสอบ ทดสอบ :: จำนวนส่งคืนเพิ่มเติมของการทดสอบที่ล้มเหลวเป็นรหัสออก plan tests => $ARGV[0]%255จำเป็นต้องใช้เพื่อรับรหัสทางออก 255

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

Golfed:, perl -MTest::More -e'plan tests,$%%255if$%=<>;ok 0for 1..$%'51 ไบต์ (38 ไบต์ + 13 ไบต์สำหรับ-MTest::More<space>) ใช้อินพุตบน stdin
ThisSuitIsBlackNot

27

C90 (gcc), รหัสทางออก 256, 28 27 18 ไบต์

main(){getchar();}

ฉันไม่แน่ใจว่านี้เป็นคนฉลาดหรือ cheaty แต่ผมไม่คิดว่ามันฝ่าฝืนกฎระเบียบที่เขียนมันในทางเทคนิคไม่ได้ใช้exit, returnหรือข้อผิดพลาดใด ๆ ขว้างปากลไก แต่เพียงอาศัยไม่ได้กำหนดพฤติกรรมและความจริงที่ว่า GCC ทำสิ่งที่ค่อนข้างสะดวกเท่าที่ความท้าทายนี้จะไป

ลองออนไลน์!

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

นี่ใช้getcharเพื่ออ่านหนึ่งไบต์จาก STDIN โดยตัวมันเองมันไม่ทำอะไรเลย

อย่างไรก็ตามโปรแกรม C90 ที่เข้ากันได้จะต้องจบด้วยreturnคำสั่งหรือสิ่งที่เทียบเท่า ทุกอย่างอื่นคือพฤติกรรมที่ไม่ได้กำหนด gcc จะจบชุดประกอบที่สร้างขึ้นด้วยretดังนั้นค่าใดก็ตามที่ตั้งใจในการลงทะเบียน EAX จะได้รับคืนโดยโปรแกรม โชคดีที่ glibc getcharเก็บข้อมูลไบต์ที่อ่านจาก STDIN ใน EAX ดังนั้นค่าของไบต์นั้นคือรหัสทางออกของโปรแกรมของเรา


มันจะน่าสนใจเพื่อดูว่านี้สามารถแก้ไขได้จะฝ่าอุปสรรค 8 บิตโดยใช้เปลือกเช่น JSHset -o fullexitcodeซึ่งสนับสนุน
เรือเหาะ

1
นั่นฉลาด แต่โปรแกรมไม่ได้ผิดพลาดจริง ๆ แล้ว จะส่งกลับตามปกติไม่ว่าข้อมูลจำเพาะจะ "ทำให้เกิดข้อยกเว้นร้ายแรง / ความล้มเหลว / การแก้ไขที่ไม่สามารถย้อนกลับคืนมาได้"
dim

ไม่ว่าจะด้วยวิธีใดมันยอดเยี่ยมมาก
เควนติ

4
@dim ฉันเดาว่าขึ้นอยู่กับคำจำกัดความของความผิดพลาดของคุณ ไม่สิ้นสุดหลักด้วยreturnหรือexitเป็นข้อผิดพลาดเท่าที่มาตรฐาน C90 ไปและจะส่งผลให้รหัสทางออกที่บ่งชี้ความล้มเหลว นั่นคือทั้งหมดที่ความผิดพลาดทำที่หัวใจ
Dennis

ความผิดพลาดคือโปรแกรมหยุดทำงานอย่างถูกต้อง โปรแกรมของคุณทำทุกอย่างที่คุณบอกให้ทำอย่างถูกต้องโปรแกรมจะอ่านอักขระหนึ่งตัวจากอินพุตแล้วหยุด ดังนั้นแม้ว่ารหัสออกจะบ่งบอกถึงข้อผิดพลาด แต่ก็ไม่ได้ผิดพลาด
findusl

19

C (gcc) ภายใต้ bash shell บน x86, 230 ไบต์, 8 รหัสทางออก

เพิ่มบรรทัดใหม่เพื่อช่วยในการอ่าน ความคิดเห็นถูกละเว้นในคะแนน

main(int c, char **v){
int p[2];
switch(atoi(v[1])-128){
case 2:__asm("UD2");        /* SIGILL: x86 undefined instruction */
case 5:__asm("int $3");     /* SIGTRAP: x86 breakpoint instruction */
case 6:abort();             /* SIGABRT: raise() is called under the covers */
case 8:c/=c-2;              /* SIGFPE: divide by 0 (c-2) */
case 11:c=*(int *)c;        /* SIGSEGV: dereference of invalid pointer */
                            /* SIGPIPE: write() to a pipe closed at the other end */
case 13:socketpair(1,1,0,p);close(p[1]);write(p[0],v,1);
case 14:alarm(1);sleep(2);  /* SIGALRM: kernel will send alarm signal after 1 sec */
}
}

คุณสมบัติของ bash shell:

เมื่อคำสั่งสิ้นสุดลงที่สัญญาณร้ายแรง N, bash จะใช้ค่า 128 + N เป็นสถานะออก

ดังนั้นสิ่งที่เราต้องทำคือกระตุ้นสัญญาณต่าง ๆ จากภายในโปรแกรม ac ณ จุดนี้ฉันคิดว่าเพียงทำkill(n-128);ถูกแบน ดังนั้นเราจึงเรียกใช้รหัสที่ก่อให้เกิดสัญญาณต่าง ๆ ซึ่งทำให้รหัสข้อผิดพลาดที่สอดคล้องกันจะสามารถใช้ได้ที่เปลือกเรียก

รหัสทางออกคือ 0, 130, 133, 134, 136, 139, 141, 142

ลองมันออนไลน์ ขยายส่วน "Debug" เพื่อดูโค้ดส่งคืน

นี้สามารถตีกอล์ฟได้ลึกขึ้นอย่างแน่นอน แต่ฉันสนใจที่จะเพิ่มสัญญาณมากขึ้น


ฉันจะถูกต้องหรือไม่ที่จะสมมติว่าสัญญาณเกิดขึ้นนอกรหัสของคุณด้วยฟังก์ชั่นหรือการทำงานที่มีอยู่
Addison Crump

1
@VoteToClose ใช่แล้วถูกต้อง ตัวอย่างเช่น__asm("UD2")รัน x86 "คำสั่งที่ไม่ได้กำหนด" ซึ่งจะทำให้เกิดข้อยกเว้นของ CPU ซึ่งจะถูกส่งผ่านโดยเคอร์เนลไปยังโปรแกรมในรูปแบบของสัญญาณ SIGILL สำหรับsocketpairตัวอย่างเช่น SIGPIPE จะถูกส่งโดยเคอร์เนลหรือ glibc ในขณะที่เรากำลังพยายามที่จะwrite()ไปยังท่อที่เป็นclose()วันที่ส่วนอื่น ๆ
บาดเจ็บทางดิจิตอล

1
จากนั้นฉันก็ไม่มีปัญหากับมัน : P
Addison Crump

1
คุณสามารถตี 1) ตัวละครสองตัวถ้าคุณใช้int3และไม่int $3และ 2) ตัวละครตัวหนึ่งถ้าคุณประกาศvว่าint**เนื่องจากคุณไม่ได้พึ่งพาความcharสำคัญของประเภทข้อมูลในตัวชี้ทางคณิตศาสตร์ของคุณบวก 3) ตัวละครสองตัวถ้าคุณใช้*pแทนที่จะเป็นp[0]หรือ 4) หกตัวอักษรหากคุณเต็มใจใช้fdตัวเลขที่คาดเดาได้ซึ่งส่งคืนโดย syscalls ทั้งหมดที่สร้างขึ้นมาและแทนที่p[0]และแทนที่p[1]ด้วยค่าที่ใกล้เคียง สุดท้ายpipe(fd)นี้สั้นกว่ามากsocketpair(...)และสร้างข้อผิดพลาดเดียวกันเมื่อปิดfd[0]และเขียน fd[1].
Iwillnotexist Idonotexist

2
ไม่กี่ข้อเสนอแนะการเล่นกอล์ฟเพิ่มเติม: 1) ใช้แทน&63 -1282) แทนที่ด้วยsleep(2) for(;;)3) แทนที่ด้วยc=*(int*)c atoi(0)4) แทนที่ด้วยc/=c-2 c/=0
nwellnhof

10

Python 2, 13 Bytes, 2 รหัสการออก

1/(input()-1)

หากคุณป้อน 0 จะพยายามพิมพ์1/-1ซึ่งเป็น -1 ซึ่งดีอย่างสมบูรณ์ดังนั้นรหัสทางออก 0 หากคุณป้อน 1 คุณจะได้รับ1/0ซึ่งเพิ่ม a ZeroDivisionErrorซึ่งมีรหัสทางออก 1 ด้วย IDE ของฉันมีเพียง 0 และ 1 สำหรับรหัสทางออก ...

ขาออก:


ป้อนคำอธิบายรูปภาพที่นี่


ป้อนคำอธิบายรูปภาพที่นี่


10

PHP, 15 ไบต์, 2 รหัสทางออก

หากไม่มีdie/ exit, PHP จะไม่สามารถคืนสิ่งใดนอกจาก0หรือ255(afaik; อาจจะ~1) ดังนั้น ...

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

ถ้าอาร์กิวเมนต์บรรทัดคำสั่ง falsy ก็ประเมินและออกด้วย1 ถ้าไม่ได้ก็พยายามที่จะเรียกฟังก์ชั่นและออกด้วย0<b>Fatal error</b>: Uncaught Error: Call to undefined function p()

-rทำงานด้วย


5
ที่ไม่เป็นความจริง. exit()กำหนดสถานะการออก ... ซึ่งคุณไม่สามารถใช้สำหรับการท้าทายนี้ได้ แต่รหัสของคุณยังไม่ถูกต้อง ตั้งค่าสถานะทางออกเป็น 255
aross

@aross: 1อืมฉันมักจะผิดพลาดสันนิษฐานว่าจะออกด้วย ฉันค้นหารายการรหัสทางออก แต่ไม่สามารถหารหัสได้
ติตัส

10

Excel VBA, 414 514 533 + 3 ไบต์, 14 รหัสทางออก

จะเข้าเป็นConditional Compilation Argument, n=[input value]และผลิตจำนวนที่รหัสข้อผิดพลาดที่เกี่ยวข้อง

Sub e()
Dim a As Application, b As Byte, s As String, v(), x
Set a=Application
#If n=3 Then
Return
#ElseIf n=5 Then
b=a.CommandBars("")
#ElseIf n=6 Then
b=2^8
#ElseIf n=7 Then
ReDim v(9^9)
#ElseIf n=9 Then
v=Sheets("")
#ElseIf n=10 Then
v=Array(1)
For Each x In v
ReDim v(9)
Next
#ElseIf n=11 Then
b=1/0
#ElseIf n=13 Then
Debug.?Int("X")
#ElseIf n=14 Then
Debug.?String(9E8,1)
#ElseIf n=20 Then
Resume
#ElseIf n=28 Then
f 256
#ElseIf n=35 Then
Call c
#ElseIf n=92 Then
For Each x In v
ReDim v(9)
Next
#ElseIf n=94 Then
b=Null
#End If
End Sub

Sub f(n):DoEvents:f n-1:End Sub

+3 สำหรับn=[Value]การเรียกการคอมไพล์ตามเงื่อนไข

จัดการอินพุตที่ n=

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

หมายเหตุ: VBA ไม่ได้มีรหัสออกหรือ0 1ฉันได้รวมวิธีแก้ปัญหาสำหรับ3และ5ซึ่งเป็นรหัสทางออกสองหมายเลขต่ำสุดที่ VBA ใช้แทน


1
ฉันจะไม่ปฏิเสธคำตอบนี้เพราะมันไม่เหมือนกันสำหรับฉันไม่อนุญาตเนื่องจากความสามารถทางภาษาสำหรับประเภทผลลัพธ์
Addison Crump

1
อะไร#ทำที่นี่?
BruceWayne

#ifและ#ElseIfเป็นงบรวบรวมเงื่อนไขหมายความว่างบที่เป็นไปตามที่มันเป็นข้อมูลที่รวบรวมเฉพาะถ้าเงื่อนไขเป็นจริง
เทย์เลอร์สกอตต์

1
ดังนั้นหากพวกเขาไม่เป็นความจริงงบจะไม่ถูกรวบรวม ... ซึ่งแตกต่างจากที่ไม่ได้ใช้#ซึ่งพวกเขาจะรวบรวมว่างบนั้นเป็นจริงหรือไม่? ฉันรู้ว่าIfข้อความทำงานอย่างไร แต่ฉันยังใหม่กับการรวบรวมสิ่งที่จริง ๆ แล้วขออภัยสำหรับคำถามง่ายๆเช่นนี้
BruceWayne

1
@ BruceWayne ใช่นั่นคือกรณี เนื่องจากบรรทัดเหล่านี้ออกแบบมาเพื่อโยนข้อผิดพลาดเฉพาะจึงจำเป็นต้องมีเฉพาะบรรทัดที่สร้างรหัสข้อผิดพลาดที่ต้องการในเวลาที่ให้ เมื่อต้องการทำเช่นนี้#ifจะใช้แทนIfหรือSelect Caseเป็นเพียงtruthyคำสั่งตามเงื่อนไขเท่านั้นที่จะถูกรวบรวมจริง ในกรณีนี้โดยเฉพาะนี้ทำให้โปรแกรมจากออกด้วยรหัสข้อผิดพลาด3, Return without GoSubในทุกการดำเนินการ แต่เพียงออกด้วยรหัสนี้เมื่อn=3
เทย์เลอร์สกอตต์

7

Turtlèd, 4 ไบต์, 2 รหัสการออก

ฉันไม่รู้ว่ามีวิธีใดบ้างที่จะได้รหัสการออกเพิ่มเติม ... มีวิธีอื่น ๆ อีกมากมายในภาษาล่าม

ฉันพบคำตอบยาวสี่สามข้อ

' ?;

ลองออนไลน์!

!.(0

ลองออนไลน์!

?;(*

ลองออนไลน์!

วิธีการใช้งานเหล่านี้:

' ?;

ในล่ามของฉันมีคุณสมบัติบั๊กที่ทำให้เกิดข้อผิดพลาดเมื่อกริดในหน่วยความจำมีมากกว่าหนึ่งบรรทัดและไม่มีอักขระที่ไม่ใช่ช่องว่าง โปรแกรมนี้ลบ * บนเซลล์ต้นกำเนิด'[space]รับอินพุตจำนวนเต็มไม่เป็นลบ?(0 หรือ 1 จริง ๆ ) และเลื่อนลงไปมาก;ถ้าเป็นศูนย์ตารางจะมีเพียงหนึ่งบรรทัดเท่านั้นและไม่มีข้อผิดพลาดมิฉะนั้นจะเลื่อนลง และข้อผิดพลาดจะเกิดขึ้น

!.(0

วงเล็บและสิ่งที่ไม่ได้รับการแยกวิเคราะห์พวกเขาเพิ่งได้รับการดำเนินการในเวลาทำงานเพื่อหมายถึง: "ข้ามไปยัง paren ที่ตรงกันถ้าสัญลักษณ์เซลล์ไม่ถูกต้อง" ในโปรแกรมนี้การอินพุต ( !) ทำให้โปรแกรมเขียนลงในเซลล์ ( .) เรียกใช้ paren ซึ่งตรวจสอบว่าสัญลักษณ์เซลล์เป็น 0 ลองข้ามไปที่ paren ที่ตรงกัน แต่แทนที่จะโยนข้อผิดพลาดเนื่องจากไม่มี . ถ้ามันเป็นศูนย์มันเขียนมันลงตรวจสอบวงเล็บค้นหาตัวเองใน 0 แล้วละเว้นมันและโปรแกรมเสร็จสิ้น

?;(*

มีองค์ประกอบของคำตอบก่อนหน้าและข้อแรก มันใช้อินพุตที่ไม่เป็นลบจำนวนมากเลื่อนลงไปมากและตรวจสอบว่าเซลล์เป็น '*' เพื่อค้นหา paren พิเศษที่ไม่มีอยู่หากไม่ได้อยู่ ถ้าอินพุตเป็น 1 มันจะย้ายออกจากพื้นที่เริ่มต้นและค้นหาเซลล์เป็นช่องว่างและข้อผิดพลาดหากเป็นศูนย์จะอยู่ในพื้นที่เริ่มต้นและละเว้นค่าพาเรน


7

Javascript (โหนด), 19 ไบต์, 2 รหัสการออก

โปรแกรมเต็มรูปแบบ:

+process.argv[2]&&a

ฟังก์ชั่น:

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

process.argvคืออาร์เรย์ที่มีพา ธ ไปยังโหนดที่เรียกทำงานได้พา ธ ไปยังไฟล์ javascript ที่ถูกเรียกใช้งานและอาร์กิวเมนต์บรรทัดคำสั่ง ในกรณีนี้จะเป็นอย่างใดอย่างหนึ่งหรือ"1" "0"สตริงถูกแปลงเป็นตัวเลขด้วยตัวดำเนิน+การunary หากจำนวนนั้นเป็นศูนย์ตัว&&ดำเนินการคนขี้เกียจจะไม่ประเมินทางด้านขวามือถ้าจำนวนนั้นเป็นจริง (ไม่เป็นศูนย์) ทางด้านขวาของ&&จะถูกประเมินและข้อผิดพลาดจะถูกส่งออกไปเนื่องจากมีการอ้างอิงตัวแปรที่ไม่ได้กำหนด ด้วยรหัสทางออก 1

ฟังก์ชันคาดว่าอินพุตเป็นตัวเลข หากอินพุตเป็นจริงฟังก์ชันจะเรียกใช้ตัวเองและขัดข้องโหนดรันไทม์ด้วยสแต็กล้น หากอินพุตเป็น 0 ตัว&&ดำเนินการขี้เกียจจะส่งกลับ 0 โดยไม่ต้องประเมินทางด้านขวามือ


@VoteToClose เปลี่ยนเป็นตัวแปรที่ไม่ได้กำหนด
corvus_192

ที่ได้ผล : P
Addison Crump

+process.argv[2]&&aโปรแกรมเต็มรูปแบบที่สามารถลงไป
2428118

@ user2428118 คุณถูกต้อง
corvus_192

เพิ่งออกมาจากความอยากรู้จะReferenceError.prototype.name=process.argv[2]?a:0ถูกต้องหรือไม่
แพทริคโรเบิร์ตส์

6

Perl 6 , 57 ไบต์, 256 รหัสทางออก

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

ลองใช้
นี่คือตัวอย่างการแปลของ Perl 5

ขยาย

use Test;  # bring in 「plan」 and 「ok」

plan $_ = @*ARGS[0]; # plan on having the input number of tests
                     # only actually needed for the 255 case
                     # if the plan is greater than the number of tests
                     # it fails with exitcode 255


  ok                 # increment the failure counter if the following is False
    try {            # don't let this kill the whole program
      open ""        # fails to open a file
    }

for                  # repeatedly do that

  ^(                 # upto Range
    $_ % 255         # either the input number of times, or 0 times for 255
  )

5

สกาลา, 19 ไบต์, 2 รหัสทางออก

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

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

JVM ที่สนับสนุนเพียง 1 คนและ 0 System.exitเป็นรหัสออกถ้าคุณไม่ได้เรียก

โปรแกรมแรกพยายามที่จะคำนวณ1/0ว่าอาร์กิวเมนต์แรกคือ1ซึ่งจะทำให้ JVM ผิดพลาดโดยมีรหัสการออกเป็น 1 หากอาร์กิวเมนต์เป็น 0 มันจะจบการทำงานอย่างประสบความสำเร็จ

โปรแกรมที่สองเพื่อแปลงอาร์กิวเมนต์เป็นจำนวนเต็มลบหนึ่งและพยายามหาร 1 ด้วยหมายเลขนั้น ถ้าอาร์กิวเมนต์ถ้า 1 ก็จะคำนวณ1/0ดังนั้น JVM จะผิดพลาด ถ้าอาร์กิวเมนต์เป็น 0 มันจะคำนวณ1/-1และออก


5

Python 3 , 15 ไบต์, 2 รหัสการออก

เห็นได้ชัดว่านี้มีความยาวมากกว่าการแก้ปัญหางูหลาม 2เพราะในหลาม 3 evalเราไม่สามารถใช้การป้อนข้อมูลที่แท้จริงโดยไม่ต้องโทร อย่างไรก็ตามเราสามารถใช้เทคนิคการเปรียบเทียบสตริงที่น่าสนใจ ...

1/(input()<'1')

อินพุตจะเป็นสตริง0หรือ1- ถ้าเป็น 1 เงื่อนไขจะประเมินเป็น 0 (เท็จ) ทำให้เกิดความพยายามในการคำนวณ1 / 0ซึ่งจะเห็นได้ชัดว่าขัดข้อง (รหัสทางออก 1) มิฉะนั้นจะไม่มีอะไรเกิดขึ้นและ Python ออกจากด้วยรหัสทางออกปกติ 0

เท่าที่ฉันทราบ Python ไม่สามารถชนกับรหัสทางออกอื่นได้


5

Java, 71 66 ไบต์, 2 รหัสทางออก

บันทึกได้ 4 ไบต์ด้วย Holger

โปรแกรมเต็มรูปแบบ:

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

ฟังก์ชันรับค่า int เป็นอาร์กิวเมนต์:

i->1/(i-1)

โปรแกรมใช้อักขระตัวแรกของอาร์กิวเมนต์แรก (อย่างใดอย่างหนึ่ง'0'หรือ'1'และลบ 48 (ค่า ascii ของ'0') เพื่อรับจำนวนเต็ม (0 หรือ 1) จากนั้นพยายามตั้งค่าอาร์กิวเมนต์ที่ตำแหน่งของจำนวนเต็มนั้นเป็นสตริงว่างถ้า อินพุตคือ 1, โปรแกรมขัดข้องด้วยArrayIndexOutOfBoundsException, เพราะอาร์เรย์อาร์กิวเมนต์มีเพียงองค์ประกอบเดียวที่ตำแหน่ง 0 (zero-indexed)


คุณสามารถกำหนดค่าหรือใช้ในลักษณะอื่นใดเช่นเป็นดัชนีอาร์เรย์ซึ่งเป็นที่ตราไว้กับa[a[0].equals("1")?1/0:1]=""; int x=a[0].equals("1")?1/0:1;แต่เปลี่ยนโปรแกรมเพิ่มเติมเพื่อกระตุ้นArrayIndexOutOfBoundsExceptionแทนการArithmeticExceptionบันทึกไม่กี่ไบต์:interface I{static void main(String[]a){a[a[0].charAt(0)-'0']="";}}
Holger

4

Python 2, 11 ไบต์, 2 รหัสการออก

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

โซลูชัน 11 ไบต์ที่แตกต่างกันสามข้อสำหรับข้อผิดพลาดที่แตกต่างกันสามแบบ! (เพื่อความสนุกนี่ไม่ได้ให้คะแนน) โดยค่าเริ่มต้น Python มีรหัสการออก 0 สำหรับการออกที่สำเร็จและ 1 สำหรับข้อผิดพลาด การรันที่สำเร็จจะไม่ส่งออกอะไร

 1>>-input()

ในอินพุต 1 ให้ "ValueError: จำนวนกะลบ" ในอินพุต 0 การนับการเลื่อนศูนย์เป็นผลสำเร็จและให้ 1

1/~-input()

บนอินพุต 1 ให้ "ZeroDivisionError: การหารจำนวนเต็มหรือโมดูโลตามศูนย์" เนื่องจาก~-input(), หรือinput()-1ที่ 0 ในอินพุต 1, 1/-1ให้ -1 0**-input()ก็จะทำงานเช่นกัน

0<input()<x

บนอินพุต 1 ให้ "NameError: name 'x' ไม่ได้ถูกกำหนด" บนอินพุต 0 ความไม่เท่าเทียมกันแรกเหล่านี้0<0ถูกประเมินเป็นเท็จดังนั้นส่วนที่เหลือจะไม่ถูกประเมินและผลลัพธ์จะเป็นเท็จ



2

เยลลี่ , รหัสออก 4 รหัส, 18 ไบต์

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

รองรับรหัสทางออก0 , 1 , 137 (ถูกฆ่า) และ139 (ข้อผิดพลาดการแบ่งกลุ่ม)

ลองออนไลน์!

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

RÇĿỌḊ?R  Main link. Argument: n (integer)

R        Range; yield [1, ..., n] if n > 1 or [] if n = 0.
    Ḋ?   If the dequeued range, i.e., [2, ..., n] is non-empty:
 Ç         Call the third helper link.
  Ŀ        Execute the k-th helper link, where k is the the integer returned by Ç.
         Else, i.e., if n is 0 or 1:
   Ọ       Unordinal; yield [] for n = 0 and "\x01" for n = 1.
      R  Range. This maps [] to [] and causes and error (exit code 1) for "\x01".


Ṁ¹Ŀ      Third helper link. Argument: r (range)

Ṁ        Maximum; retrieve n from r = [1, ..., n].
 ¹Ŀ      Call the n-th helper link (modular).
         When n = 139, since 139 % 3 = 1, this calls the first helper link.
         When n = 137, since 137 % 3 = 2, this calls the second helper link.


2*       Second helper link. Argument: k

2*       Return 2**k.
         Since 2**137 % 3 = 174224571863520493293247799005065324265472 % 3 = 2,
         ÇĿ in the main link will once again call the second helper link.
         Trying to compute 2**2**137, a 174224571863520493293247799005065324265472-
         bit number, will get the program killed for excessive memory usage.


߀       First helper link. Argument: k

߀       Recursively map the first helper link over [1, ..., k].
         This creates infinite recursion. Due to Jelly's high recursion limit,
         a segmentation fault will be triggered.

2

SmileBASIC, 640 ไบต์, 39 รหัสออก (จาก 52)

SPSET.,0INPUT C$GOTO"@"+C$@0
STOP@3
A
@4
CLS.@5@A
GOSUB@A@7?1/A@8
X$=3@9
A%=POW(2,31)@10
BEEP-1@11
DIM B[#ZL*#R]@13
READ A
@15
V"OPTION STRICT?X
@16
CALL@D@17
V@A*2
@18
V"VAR A,A
@19
V"DEF A:END:DEF A
@20
V"FOR I=0TO
@21
V"NEXT
@22
V"REPEAT
@23
V"UNTIL
@24
V"WHILE.
@25
V"WEND
@26
V"IF.THEN
@27
V"IF.THEN"+CHR$(10)+"ELSE
@28
V"ENDIF
@29
V"DEF X
@30
RETURN@31
DIM E[-1]@32
V"DEF A:DEF
@34
GOTO"|
@36
XOFF MIC
MICSTOP
@37
XOFF MOTION
GYROSYNC
@38
PRGDEL
@39
DIM F[66]SPANIM.,1,F
@40
DIM G[2]SPANIM.,1,G
@42
MPSTART 2,@A@L
MPSEND"A"GOTO@L@44
PROJECT
@46
USE"PRG1:A
@47
BGMPLAY"`
@48
X=
@51
DLCOPEN"
DEF V C
PRGEDIT 1PRGDEL-1PRGSET C
EXEC 1
END

นี่อาจทำให้สั้นลงอย่างแน่นอน SB มีรหัสข้อผิดพลาดตั้งแต่ 0 ถึง 51 เท่านั้นและบางรหัสไม่สามารถเรียกได้


0

ZX81 พื้นฐาน> 255 รหัสทางออก - 52 ไบต์ (รายการ)

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

ในทางเทคนิคNอาจเป็นจำนวนจุดลอยตัว 24 บิตภายในช่วง แต่เราจะสมมติว่าเป็นจำนวนเต็มที่นี่ บรรทัดที่ 2 นั้นเทียบเท่ากับIF N>0 AND N <=255 THEN GOTO 3: ELSE GOTO 1ZX81 BASIC ที่มีIF/ELSEอยู่ในคำแนะนำเชิงสัญลักษณ์


3
สิ่งนี้ทำให้พอใจได้the program caused some fatal unintended exceptionอย่างไร เพียงพิมพ์ข้อความและดำเนินการเสร็จสิ้น
AdmBorkBork

คุณพูดถูก - ฉันต้องตื่นตัวมากขึ้นในตอนเช้า
Shaun Bebbers

RAND USR Nจะทำให้เกิดเอฟเฟ็กต์ที่ไม่ตั้งใจเนื่องจากการเรียกส่วนของ ROM จากสถานที่ที่ไม่คาดคิดไม่ใช่ความคิดที่ดีดังนั้นจึงRAND USR 0ถูกแยกออกเนื่องจากมีความสง่างามเกินไป
Shaun Bebbers

คุณช่วยอธิบายเพิ่มเติมเกี่ยวกับวิธีที่ทำให้โปรแกรมพังได้จริงหรือไม่? ฉันไม่คุ้นเคยกับ ZX81 BASIC อย่างใกล้ชิด
AdmBorkBork

ROM อยู่ในช่วง 0x0000 - 0x1fff การเรียกใช้งานรูทีน ROM จะทำงานได้ถ้าคุณเริ่มต้นในที่ที่ถูกต้อง การเริ่มต้นอย่างน้อยหนึ่งไบต์ในรูทีนรหัสเครื่องใน Z80 จะทำให้เกิดผลที่ไม่คาดคิด หากคุณมีแบบง่ายLD BC, 0000 RST 10 RETที่ 0x1000 แต่เรียกใช้RAND USR 4097แล้วคุณจะพลาดตัวถูกดำเนินการ LD และรหัสเครื่องจึงจะเบ้ ฉันจำการโทร ROM ทั้งหมดไม่ได้ แต่ฉันจะทำงานให้เสร็จสิ้นตามกฎหมาย / สิ้นสุดได้อย่างสุภาพและยกเว้นในภายหลัง
Shaun Bebbers
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.