ทำ Geiger Counter


29

Geiger counter เป็นอุปกรณ์ที่ใช้ตรวจจับรังสี

เราจะสร้างโปรแกรมตัวนับ Geiger

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

คำตอบจะได้คะแนนเป็นไบต์ด้วยจำนวนไบต์ที่น้อยลง คำตอบต้องมีอย่างน้อย 1 ไบต์

โปรแกรมของคุณอาจพิมพ์beepด้วยการขึ้นบรรทัดใหม่หรือพิมพ์ขึ้นบรรทัดใหม่เดียวเพื่อให้ได้ผลลัพธ์ที่ว่างเปล่าตราบใดที่มันทำอย่างสม่ำเสมอ โปรแกรมของคุณยังอาจใช้เป็นกรณีที่แตกต่างกันสำหรับbeepเช่นBEEP, bEEPหรือBeepตราบใดที่มันไม่ให้อย่างต่อเนื่อง



7
เราสามารถใช้ตัวควบคุม BEL เพื่อส่งเสียงบี๊บจริงได้หรือไม่?
Jo King

2
@ โจกิ้งฉันเล่นกับความคิดมันสนุก แต่ฉันต้องบอกว่าไม่ มันแตกต่างกันมากเกินไป
ข้าวสาลีตัวช่วยสร้าง

2
ฉันต้องการเห็นวิธีแก้ปัญหาในจอประสาทตา
mbomb007

3
ฉันกำลังพยายามหาวิธีการทำสิ่งนี้ในSMBF ... แต่วิธีเดียวที่จะเปรียบเทียบสองเซลล์ที่เกี่ยวข้องกับการเปลี่ยนแปลงพวกเขา และใน SMBF เซลล์ที่คุณต้องตรวจสอบคือเซลล์ที่โปรแกรมกำลังทำงานอยู่ ดังนั้นมันก็เหมือนกับหลักการความไม่แน่นอนของไฮเซนเบิร์ก ดังนั้นคุณต้องพิจารณาว่ามีอะไรเปลี่ยนแปลงโดยใช้โฟลว์การควบคุมเท่านั้นหรือไม่
mbomb007

คำตอบ:


24

แพ้ , 303 293 263 253 238 228 ไบต์

v^"peeb"<\>"beepvv"((>@@>>%%>>(((((([[[[[[\
>>>>>>>>>//>>>>>>>>>>>>>>/>>/>>>>>>>>>>>>>\\
>>>>>>>>//>>>>\>>>>>>>>>>/>>>>>>>>>>>>>>>>>\\
>/>>>>>>>/>>>>>>>>>>>>\>>>>>>>>>>>>>>>>>>>>>\\
>>>>>>>>>>>>>>>>>>>>>>\\>>>>\>>>>>>>>>>>>>>>>\

ลองออนไลน์!

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

อุ๊ยนี่เป็นสิ่งที่ยากมาก ฉันจะอ้างอิงคำตอบที่ถูกลบของ WW:

อาจเป็นภาษาที่น่าสนใจที่สุดสำหรับความท้าทายนี้ ในการสูญเสียตำแหน่งเริ่มต้นและทิศทางของตัวชี้เป็นแบบสุ่มทั้งหมดดังนั้นในการกำหนดโปรแกรมที่กำหนดไว้คุณต้องคำนึงถึงทุกตำแหน่งและทิศทางการเริ่มต้นที่เป็นไปได้ ในเวลาเดียวกันด้วยลักษณะของความท้าทายนี้คุณจะต้องคำนึงถึงการลบไบต์เดียว

น่าเสียดายที่คำตอบของเขาไม่ได้คำนึงถึงการลบบรรทัดใหม่ซึ่งทำให้ทุกอย่างสับสน

คำอธิบาย:

(โปรดทราบว่าอาจมีบางไบต์ที่นี่และที่นั่น)

ก่อนอื่นเรามาพูดถึงโครงสร้างทั่วไปของรหัส:

v^^"peeb"<<\/"beepvv"((>>>@@>>%%>>(((((([[[[[[[\       Processing line
>>>>>>>>>>>//>>>>>>>>>>>>>>>>>>>/>>>>>>>>>>>>>>\\      Beep line
>>>>>>>>>//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\\     Back-up beep line
>//>>>>>>>>>>>>>>>>>>>>\\>>>>>>>>>>>>>>>>>>>>>>>>\\    Back-up return line
>>>>>>>>>>>>>>>>>>>>>>>>\\>>>>>>\>>>>>>>>>>>>>>>>>\    Return line

ทุกอย่าง แต่สายการประมวลผลจะต้องประกอบด้วยทั้งหมดของทั้งสองหรือหนึ่ง> \/ทำไม? ตัวอย่างเช่นลองลบ newline:

v^^"peeb"<<\/"beepvv"((>>>@@>>%%>>(((((([[[[[[[\>>>>>>>>>>>//>>>>>>>>>>>>>>>>>>>/>>>>>>>>>>>>>>\\
>>>>>>>>>//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\\
>//>>>>>>>>>>>>>>>>>>>>\\>>>>>>>>>>>>>>>>>>>>>>>>\\
>>>>>>>>>>>>>>>>>>>>>>>>\\>>>>>>\>>>>>>>>>>>>>>>>>\

บรรทัดแรกคือตอนนี้วิธีที่นานกว่าส่วนที่เหลือของบล็อก ถ้าพอยน์เตอร์วางไข่บน>\/ตัวละครที่ไม่มีการเคลื่อนไหวแนวดิ่งมันจะติดอยู่ในวงวนไม่สิ้นสุด


ส่วนเครื่องตรวจจับรังสีที่ใหญ่ที่สุดคือส่วนที่ส่วนท้ายของแต่ละบรรทัด

 \
 \\
 >\\
 >>\\
 >>>\

โดยทั่วไป IP ที่ผ่านสิ่งนี้จากบรรทัดแรกจะออกจากบรรทัดสุดท้าย อย่างไรก็ตามหากอักขระใด ๆ บนบรรทัดถูกลบออกไปบรรทัดนั้นจะเลื่อนลงหนึ่งอักขระเช่น:

 \
 \\
 >\\
 >\\
 >>>\

และ IP จะออกจากบรรทัดที่ไม่มีไบต์แทน (ยกเว้นบรรทัดสุดท้ายที่ออกจากวินาทีไปจนสุด)

จากตรงนั้นแต่ละสี่บรรทัดแรกจะเปลี่ยนเส้นทางไปยังบรรทัดที่สอง:

v
>>>>>>>>>>
>>>>>>>>//
>/

ซึ่งจะนำไปสู่หนึ่งในสองอย่างใดอย่างหนึ่งbeepERS

v^"peeb"<<\/"beepvv"((>
>>>>>>>>>>//

หากไบต์ใด ๆ ในbeeper แรกถูกลบออกไปมันจะไปที่วินาทีแทน:

v^^"peb"<<\/"beepvv"((>
>>>>>>>>>>>//

beepจากนั้นทั้งคู่นำกลับไปที่บรรทัดแรกและการยกเลิก@กลับมาแล้วนำไปสู่การบรรทัดแรกและยุติ

ชิ้นส่วนเบ็ดเตล็ดอื่น ๆ :

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

\และ/s กระจัดกระจายไปทั่วสายจะมีการกอล์ฟไบต์ในบรรทัดด้านบนของรหัสโดยเปลี่ยนเส้นทางตัวชี้ไปยังสายที่ถูกต้อง เนื่องจากบรรทัดล่างส่วนใหญ่เป็นเพียงฟิลเลอร์เท่านั้นบรรทัดบนสุดจึงสามารถเล่นกอล์ฟได้ หากใครมีความคิดใด ๆ สำหรับการป้องกันรังสีที่สั้นกว่าชัดเจนกว่าสิ่งที่ฉันมีตอนนี้รู้สึกอิสระที่จะแสดงความคิดเห็น


ฉันเพิ่งโพสต์ในการแชทด้วยความอยากรู้อยากเห็นเพียงไร ฉันเห็นความคล้ายคลึงกันบางอย่างในรุ่นก่อนหน้านี้และฉันต้องการทราบว่าฉันอยู่ในเส้นทางที่ถูกต้องหรือไม่
ตัวช่วยสร้างข้าวสาลี

@WW ฉันได้ดำเนินการแล้ว แต่\/เพื่อแยกการbeepผลักดันและความจริงที่ว่ามีเพียงหนึ่งในคำพูดที่จำเป็นต้องมีประโยคออกช่วย
Jo King

20

Hexagony , 38 ไบต์

.....;p;<>b;e;/<b;e;;p...@@.......;@..

ลองออนไลน์!

โปรแกรมตรวจสอบ


คำอธิบาย

เราใช้ประโยชน์จากการตรวจจับอัตโนมัติของ Hexagony ด้านยาวหกเหลี่ยมที่นี่

หากไม่มีการลบไบต์โปรแกรมจะมีความยาวด้าน 4 และมีลักษณะดังนี้:

Program without any bytes removed

หากอย่างไรก็ตามไบต์จะถูกลบออก มี 2 ​​กรณี

  1. <ไบต์ที่ถูกลบคือหลังจากที่สอง

    การไหลของการดำเนินการจะเป็น:

    Program with last byte removed

    มี 2 ติดต่อกัน@ในบรรทัดที่ 5 ดังนั้นแม้ว่าหนึ่งของพวกเขาจะถูกลบออกได้อย่างปลอดภัย IP @ที่จะตี

  2. <ไบต์ที่ถูกนำออกที่หรือก่อนที่สอง

    จากนั้นช่วงครึ่งปีหลังจะยังคงอยู่เหมือนเดิมและ IP <จะไม่เปลี่ยนเส้นทางขึ้นไปโดยที่ รูปภาพของโฟลว์การประมวลผล:

    Program with the second <code><</code> removed


19

Hexagony , 34 29 ไบต์

//..>;e;<b@;p;/|/;e;;\.b@;p<@

ลองออนไลน์! ตรวจสอบ!

คำอธิบาย:

นี่คือรหัสปกติที่จัดรูปแบบเป็นรูปหกเหลี่ยมที่เหมาะสมโดยใช้HexagonyColorer :

No Cancer...

สองครั้ง//ที่จุดเริ่มต้นทำให้มั่นใจได้ว่าเส้นทางนี้จะได้รับเสมอ หากอักขระใด ๆ ถูกลบออกอักขระนั้นจะถูกลบ@ออกจากพา ธ ไม่ว่าจะถูกเลื่อนไปด้านหลังหรือถูกลบออก:

Cancer!

ในกรณีนี้เราได้ลบอักขระหลังจาก|ที่ทำให้มันเป็นไปตามเส้นทางนี้โดยการพิมพ์beep:

First beep

หากเราลบอักขระออกจากก่อนหน้า|(หรือ|ตัวของมันเอง) เราจะติดตามเครื่องพิมพ์เสียงบี๊บอื่น ๆ :

Second beep

เราได้คำนึงถึงความเป็นไปได้ทั้งหมดและเราbeepใช้ส่วนที่ไม่ผ่านการฉายรังสีของโปรแกรมเท่านั้น


13

Brainfuck ที่แก้ไขตัวเอง , 73 63 ไบต์

<<[[[[<<]]>[[.>>..>>.[,>]]]]   bbeepp+[<<<]>>[[>]>>>.>>..>>.,+]

ลองออนไลน์! ตรวจสอบ!

ช่องว่างที่อยู่ตรงกลางของรหัสเป็นตัวแทนของ NUL ไบต์

คำอธิบาย:

รหัสจะแบ่งออกเป็นสองส่วนโดย 3 NUL ไบต์ที่อยู่ตรงกลาง โดยพื้นฐานแล้วทั้งคู่ก็พิมพ์beepหากส่วนอื่นได้รับการฉายรังสี (ยกเว้นสองสามข้อ)

ประการแรก<<[[จุดเริ่มต้นคือเพื่อให้แน่ใจว่าทุกคน]จะถูกจับคู่ได้ตลอดเวลา [s จะไม่พยายามที่จะมองหาการจับคู่]ถ้าเซลล์เป็นบวกในขณะ]ที่ทำ หากมีการ]กระโดดกลับไปที่หนึ่งในวงเล็บเหล่านี้ก็มักจะกระโดดกลับทันทีเพราะเซลล์เป็น0กระโดดกลับไปยังหนึ่งในวงเล็บเหล่านี้ก็มักจะกระโดดกลับทันทีเพราะมือถือเป็น

ส่วนถัดไป[[<<]]>จากนั้นตรวจสอบว่าความยาวของส่วนที่ 2 เป็นเลขคู่หรือไม่ ถ้าเป็นเช่นนั้นมันจะดำเนินการอีกครึ่งหนึ่งของส่วนที่ 1 ซึ่งพิมพ์beepโดยใช้bbeeppที่จุดเริ่มต้นของส่วนที่ 2

[[.>>..>>.[,>]]]]

จากนั้นจะล้างส่วนที่ 2 ทั้งหมดจึงไม่ดำเนินการ

ในส่วนที่ 2 เราตรวจสอบว่าความยาวของส่วนที่ 1 และไบต์ NUL หาร3ด้วย+[<<<]>>หรือไม่

[[>]>>>.>>..>>.,+]

beepในทำนองเดียวกันเราพิมพ์


10

Z80Golf , 53 36 34 bytes

-16 ไบต์ขอบคุณ @Lynn
-2 ไบต์ขอบคุณ @Neil

เนื่องจากนี่เป็นเพียงรหัสเครื่อง Z80 จึงมี unprintables จำนวนมากในนี้จึงมีxxd -rhexdump ที่กลับมาได้อีกครั้ง:

00000000: ddb6 2120 10dd b615 280c 003e 62ff 3e65  ..! ....(..>b.>e
00000010: ffff 3e70 ff76 003e 62ff 3e65 ffff 3e70  ..>p.v.>b.>e..>p
00000020: ff76                                     .v

ลองออนไลน์! (เครื่องทดสอบครบถ้วนสมบูรณ์ใน Python)

คำอธิบาย

z80golf เป็นเครื่อง Z80 สมมุติของอนาธิปไตยกอล์ฟซึ่งcall $8000เป็น putchar call $8003เป็น getchar haltทำให้การออกล่ามโปรแกรมของคุณถูกวางไว้ที่$0000และหน่วยความจำอื่น ๆ เต็มไปด้วยเลขศูนย์ การสร้างโปรแกรมป้องกันรังสีในชุดประกอบนั้นค่อนข้างยาก แต่เทคนิคที่มีประโยชน์โดยทั่วไปใช้คำแนะนำ idempotent หนึ่งไบต์ ตัวอย่างเช่น,

or c        ; b1    ; a = a | c

เป็นเพียงไบต์เดียวและa | c | c == a | cดังนั้นจึงสามารถป้องกันรังสีได้โดยเพียงแค่ทำตามคำสั่งซ้ำ บน Z80 โหลดแบบทันทีขนาด 8 บิตคือสองไบต์ (โดยที่แบบทันทีเป็นแบบไบต์ที่สอง) ดังนั้นคุณสามารถโหลดค่าบางค่าลงในรีจิสเตอร์ได้อย่างน่าเชื่อถือ นี่คือสิ่งที่ฉันทำตอนเริ่มต้นของโปรแกรมเพื่อให้คุณสามารถวิเคราะห์ตัวแปรที่ยาวกว่าที่ฉันเก็บไว้ที่ด้านล่างของคำตอบได้ แต่จากนั้นฉันก็รู้ว่ามีวิธีที่ง่ายกว่า

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

ก่อนอื่นเราต้องออกหากไม่พบรังสี:

    or a, (ix+endbyte) ; dd b6 21 ; a |= memory[ix+0x0021]
    jr nz, midbyte     ; 20 10    ; jump to a halt instruction if not zero

หากมีการลบไบต์ใด ๆ ไบต์ทั้งหมดจะเลื่อนและ$0020จะมีครั้งสุดท้าย76ดังนั้น$0021จะเป็นศูนย์ เราสามารถจ่ายค่าเริ่มต้นของโปรแกรมได้แม้ว่าจะไม่มีความซ้ำซ้อน:

  • หากการชดเชยการกระโดด$10ถูกลบออกจะมีการตรวจจับรังสีอย่างถูกต้องการกระโดดจะไม่ถูกนำมาใช้และการชดเชยจะไม่สำคัญ ไบต์แรกของคำสั่งถัดไปจะถูกใช้ไป แต่เนื่องจากมันถูกออกแบบมาให้ทนทานต่อการลบไบต์จึงไม่สำคัญ
  • หากการข้าม opcode $20ถูกลบออกแล้วออฟเซ็ตการข้าม$10จะถอดรหัสเป็นdjnz $ffe4(ใช้คำสั่งไบต์ถัดไปเป็นออฟเซ็ต - ดูด้านบน) ซึ่งเป็นคำสั่งวนรอบ - ลดค่า B และกระโดดถ้าผลลัพธ์ไม่เป็นศูนย์ เพราะffe4-ffffเต็มไปด้วยเลขศูนย์nopและตัวนับโปรแกรมล้อมรอบสิ่งนี้จะรันจุดเริ่มต้นของโปรแกรม 256 ครั้งจากนั้นจึงดำเนินการต่อในที่สุด ฉันประหลาดใจกับงานนี้
  • การลบ$ddส่วนที่เหลือจะทำให้ส่วนย่อยของข้อมูลถอดรหัสเป็นor (hl) / ld ($1020), hlแล้วเลื่อนไปที่ส่วนถัดไปของโปรแกรม orจะไม่เปลี่ยนแปลงการลงทะเบียนใด ๆ ที่สำคัญและเพราะ HL เป็นศูนย์ที่จุดนี้เขียนยังจะยกเลิกการออก
  • การลบ$b6จะทำให้การถอดรหัสที่เหลือเป็นld ($1020), ixและดำเนินการตามข้างต้น
  • การถอด$21จะทำให้ตัวถอดรหัสกิน$20และทำให้เกิดdjnzพฤติกรรม

โปรดทราบว่าการใช้or a, (ix+*)บันทึกสองไบต์มากกว่าld a, (**) / and a / and aต้องขอบคุณการตรวจสอบแบบรวมศูนย์

ตอนนี้เราต้องตัดสินใจว่าในสองส่วนใดของ payload ที่จะดำเนินการ:

    or (ix+midbyte)  ; dd b6 15
    jr z, otherimpl  ; 28 0c
    nop              ; 00
    ; first payload
    ld a, 'b'        ; 3e 62
    rst $0038        ; ff
    ld a, 'e'        ; 3e 65
    rst $0038        ; ff
    rst $0038        ; ff
    ld a, 'p'        ; 3e 70
    rst $0038        ; ff
midbyte:
    halt             ; 76
otherimpl:
    nop              ; 00
    ld a, 'b'        ; 3e 62
    ; ...            ; ...
    rst $0038        ; ff
endbyte:
    halt             ; 76

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

  • การลบจะทำให้อีกสองไบต์ถอดรหัสเป็น$dd or (hl) / dec dClobbers D. ไม่มีเรื่องใหญ่
  • การลบจะสร้างที่ไม่มีเอกสารอีกต่อไปสำหรับการเข้ารหัส$b6 dec dเช่นเดียวกับข้างต้น
  • การลบ$15จะอ่าน$28แทนเป็นการชดเชยและการดำเนินการจะดำเนินการที่$0cดังต่อไปนี้
  • เมื่อ$28หายไปที่ถอดรหัสเป็น$0c น้ำหนักบรรทุกไม่สนใจเกี่ยวกับinc cc
  • การลบ$0c- นั่นคือสิ่งที่ nop ใช้ มิฉะนั้นไบต์แรกของเพย์โหลดจะถูกอ่านเป็นการข้ามออฟเซ็ตและโปรแกรมจะข้ามไปยังหน่วยความจำที่ไม่ได้กำหนดค่าเริ่มต้น

เพย์โหลดเองนั้นค่อนข้างง่าย ฉันคิดว่าสตริงที่มีขนาดเล็กทำให้วิธีนี้เล็กกว่าลูปและมันง่ายกว่าที่จะทำให้ตำแหน่งเป็นอิสระด้วยวิธีนี้ eในซ้ำดังนั้นฉันสามารถโกนหนึ่งbeep ld aนอกจากนี้เนื่องจากหน่วยความจำทั้งหมดระหว่าง$0038และ$8000จะกลายเป็นศูนย์ผมสามารถตกผ่านและใช้งานสั้นrstแตกต่างจากcallการเรียนการสอนซึ่งทำงานเฉพาะสำหรับ$0,$8 , $10และอื่น ๆ ขึ้นไป$38ขึ้นไป

แนวทางที่เก่ากว่า

64 ไบต์

00000000: 2e3f 3f2e 3f3f 7e7e a7a7 201f 1e2b 2b1e  .??.??~~.. ..++.
00000010: 2b2b 6b00 7ea7 2814 003e 62cd 0080 3e65  ++k.~.(..>b...>e
00000020: cd00 80cd 0080 3e70 cd00 8076 003e 62cd  ......>p...v.>b.
00000030: 0080 3e65 cd00 80cd 0080 3e70 cd00 8076  ..>e......>p...v

58 ไบต์

00000000: 2e39 392e 3939 7e7e a7a7 2019 3a25 00a7  .99.99~~.. .:%..
00000010: 2814 003e 62cd 0080 3e65 cd00 80cd 0080  (..>b...>e......
00000020: 3e70 cd00 8076 003e 62cd 0080 3e65 cd00  >p...v.>b...>e..
00000030: 80cd 0080 3e70 cd00 8076                 ....>p...v

53 ไบต์

สิ่งนี้มีคำอธิบายในประวัติการแก้ไข แต่ไม่แตกต่างกันเกินไป

00000000: 3a34 00a7 a720 193a 2000 a728 1400 3e62  :4... .: ..(..>b
00000010: cd00 803e 65cd 0080 cd00 803e 70cd 0080  ...>e......>p...
00000020: 7600 3e62 cd00 803e 65cd 0080 cd00 803e  v.>b...>e......>
00000030: 70cd 0080 76                             p...v

เกิดอะไรขึ้นถ้า: เอาท์พุทที่ไม่ว่างเปล่าก็ดีกว่าเสียงบี๊บ

1 ไบต์

v

haltเป็นโปรแกรมปกติ แต่ถ้าการเอารังสีออกไปหน่วยความจำก็จะเต็มไปด้วยเลขศูนย์ทำให้$8000มีจำนวนครั้งที่ไม่สิ้นสุดพิมพ์จำนวนมากเป็นโมฆะ


ตั้งแต่aเริ่มต้นที่ศูนย์คุณไม่สามารถใช้or a, (N);แทนได้ld a, (N); and a;หรือไม่ ดูเหมือนว่าคุณสามารถบันทึกสองสามไบต์ทางนั้น
Neil

@ Neil คำถามที่ดี! น่าเสียดายที่ Z80 คำแนะนำในการโหลดเท่านั้นที่สามารถทำได้เช่นนี้
NieDzejkob

ฮึมันนานเกินไปแล้วตั้งแต่ฉันเขียนโปรแกรม Z80 ... บางทีฉันอาจจะนึกถึงor a, (ix + N)?
Neil

@Neil จริงที่มีอยู่และทรงเครื่องเริ่มต้นที่ศูนย์เกินไป ... น่าเสียดายที่ประหยัดไบต์ในพื้นที่ที่ทำให้ไบต์การเปลี่ยนแปลงในลักษณะที่เป็น20 19จุดเริ่มต้นจะกลายเป็น20 18และลบ20สร้างถอยหลังกระโดดไม่มีเงื่อนไขดังนั้น nop จะต้องมีการเพิ่มหลังจากการกระโดดครั้งแรกในโปรแกรมการย้อนกลับบันทึกไบต์
NieDzejkob

อานั่นเป็นความอัปยศ ขอบคุณสำหรับการตรวจสอบว่า!
Neil


4

Kleinหนึ่งในแต่ละทอพอโลยีรวมเป็น 291 ไบต์

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

ตรวจสอบ!

(ฉันยังคิดเกี่ยวกับการเขียนโปรแกรมที่เป็นตัวนับ Geiger ที่ถูกต้องในทอพอโลยีทั้งหมด แต่อาจต้องรอถ้าใครต้องการลองอีกครั้งฉันจะให้เงิน 500 ค่าแทน)

000 และ 010, 21 ไบต์

<<@"peeb"/
.@"peeb"<\

ลองออนไลน์ 000! และลอง 010 ออนไลน์!

นี่คือรังเพลิงจากของฉัน ><>การแก้ปัญหา เห็นได้ชัดว่ามันใช้งานได้000เนื่องจากเป็นโทโพโลยีเริ่มต้นสำหรับภาษา 2D ส่วนใหญ่ แต่ฉันก็แปลกใจที่มันใช้งาน010ได้เช่นกัน

001 และ 011, 26 ไบต์

!.<<@"peeb"/
.@"peeb"..<..

ลอง 001 ออนไลน์!และลอง 011 ออนไลน์!

อันนี้ถูกคัดลอกโดยตรงจาก คำตอบของ WWคำตอบของขอบคุณ!

100, 21 ไบต์

//@"peeb"\
@"peeb".</

ลองออนไลน์!

101, 21 ไบต์

//@"peeb"/
@"peeb".<!

ลองออนไลน์!

110, 26 ไบต์

<.<@"peeb"\\
.\@."peeb".\<

ลองออนไลน์!

111, 24 ไบต์

<<@"peeb"<\
...@"peeb"//

ลองออนไลน์!

200, 21 ไบต์

<<@"peeb"\
@"peeb".!/

ลองออนไลน์!

201, 31 ไบต์

\\.\.@"peeb"</./
./...@"peeb"<\

ลองออนไลน์!

โดยไกลที่น่ารำคาญที่สุด

210, 26 ไบต์

/\\@"peeb"</\
/@.."peeb"<\

ลองออนไลน์!

211, 27 ไบต์

\\."peeb"((</
!/@@<"peeb"<\

ลองออนไลน์!

คนเดียวที่ฉันต้องจัดการกับการป้อน beeper ผ่านทางด้านขวา


ฉันจะดีใจอย่างที่สองที่ได้รับรางวัล
ข้าวสาลีตัวช่วยสร้าง


2

Runic Enchantmentsขนาด 29 ไบต์

>>yyLL@"peeb"/
     @"peeb"L\

ลองออนไลน์!

โดยพื้นฐานแล้วเหมือนกับ Klein 000 คำตอบหรือ> <> คำตอบ (ฉันเริ่มด้วย Klein หนึ่งคำตอบ) เพียงการเปลี่ยนแปลงที่จำเป็นจริงๆที่จะเปิด<เข้ามาLและ.เข้า (แปลของสัญลักษณ์คำสั่ง) ใส่จุดเข้า IP (2 จำเป็นต้องมิฉะนั้นการลบจะส่งผลให้โปรแกรมที่ไม่ใช่การรวบรวม) และแทรก dela ที่yคำสั่งที่จะได้รับ IP สองตัวที่จะผสาน (ดังนั้นจึงพิมพ์เพียงครั้งเดียวbeep) และต้องการอีกสองรายการ ต้องใส่ NOP เพิ่มเติมเพื่อรักษาความยาวบรรทัด ไคลน์ใช้@สำหรับ "พิมพ์และยกเลิก" ได้อย่างสะดวก

ไม่มีความสามารถในการใช้ช่องว่างในด้านซ้ายล่างเนื่องจากตัวสะท้อนแสงใด ๆ เปลี่ยนทิศทางยับยั้งความสามารถในการตรวจจับรังสี เช่น (26 ไบต์ฉายรังสีy ):

/yLL@"peeb"/
\<<  @"peeb"L\

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



1

Wumpus , 37 34 32 31 ไบต์

777*7..@ $o&4"beep"|"@peeb"4&o@

ลองออนไลน์! ตรวจสอบ!

วิธีนี้ใช้ความจริงที่ว่า .กระโดดไปยังโมดูลัสตำแหน่งความยาวของโปรแกรม

อีกทางเลือกหนึ่งสำหรับจำนวนไบต์เดียวกัน


" @o&4"beep"}@
@o&4"beep"}$}  

ลองออนไลน์! ตรวจสอบ!

อันนี้ใช้ประโยชน์จากความแตกต่างในทิศทางของตัวชี้สำหรับความยาวเส้นคี่และคู่ (ฉันไม่รู้จริงๆว่าวิธีแรก"ใช้งานได้จริงอย่างไรเมื่อลบ newline ออก)


1

ไคลน์ (001), 26 ไบต์

!.<<@"peeb"/
.@"peeb"..<..

ลองออนไลน์!

ตรวจสอบ!

คำอธิบาย

โปรแกรมนี้ใช้ประโยชน์จากโครงสร้างเฉพาะของไคลน์โดยเฉพาะอย่างยิ่ง001 topology ซึ่งเป็นขวด Klein

ไม่มีการแก้ไขโปรแกรมตามเส้นทางการดำเนินการ:

เส้นทางสีส้ม

การลบไบต์ออกจากโปรแกรมสามารถทำให้โปรแกรมมีผลกระทบได้ 4 วิธี (แต่ละสีจะแตกต่างกัน):

ส่วนของโปรแกรม

สิ่งแรกที่ควรทราบคือ<<จะหันเห IP ไปทางซ้ายของจุดเริ่มต้นเสมอ หากหนึ่งใน<s ถูกลบอีกอันก็เข้าแทนที่ ดังนั้นหากมีการลบไบท์ออกจากส่วนสีแดงจะมีการติดตามพา ธ การทำงานต่อไปนี้:

เส้นทางสีแดง

หากลบสีน้ำเงินออกเราจะได้เส้นทางที่ง่ายมาก:

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

หากบรรทัดใหม่ถูกลบเราจะได้รับเส้นทาง:

เส้นทางสีเขียว

เส้นทางสีเหลืองนั้นซับซ้อนกว่าเล็กน้อย เนื่องจากบรรทัดล่างยาวกว่าบรรทัดบนสุดหนึ่งบรรทัดเมื่อโปรแกรมกำลังสองที่จุดเริ่มต้นของการเรียกใช้งานอักขระเสมือนจึงถูกเพิ่มเข้าที่ท้ายบรรทัดแรกเพื่อให้มีขนาดเท่ากัน หากไบต์ใด ๆ บนบรรทัดที่สองถูกลบออกบรรทัดนั้นจะสั้นลงและไม่ได้เพิ่มอักขระเสมือนนั้น สิ่งนี้มีความสำคัญเนื่องจาก!ปกติจะข้ามอักขระเสมือนจริง แต่ในกรณีที่ไม่มีมันจะข้ามไป/แทน

เส้นทางสีเหลือง


1
คุณสามารถพอร์ตของฉัน><>ในการแก้ปัญหา000สำหรับ21 ไบต์
โจกษัตริย์

@ โจกิ้งฉันคิดว่ามันจะดีกว่าตามคำตอบของมัน
ตัวช่วยสร้างข้าวสาลี

1

แบ็คแฮนด์ , 25 21 ไบต์

vv""ppeeeebb""jjHH@

ลองออนไลน์! ตรวจสอบ!

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

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