โปรแกรมตรวจซ่อมตนเองผิดพลาด


14

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

ตัวอย่างเช่นหากโปรแกรมของคุณเป็นRadiationHardenedและได้รับการแก้ไขRadiaionHardenedแล้วโปรแกรมของคุณจะต้องแสดงผลว่ามีการปรับเปลี่ยนไบต์ที่ 5 (ดัชนี 0) และแหล่งที่มาของโปรแกรมจะต้องRadiationHardenedทันทีหลังจากดำเนินการ

หมายเหตุและกฎ

  • คุณอาจสมมติว่าลบหนึ่งตัวอักษรในซอร์สโค้ดก่อนการดำเนินการ พฤติกรรมสำหรับโปรแกรมที่ไม่ได้แก้ไขไม่ได้กำหนดไว้
  • คุณอาจสันนิษฐานว่าไบต์ที่ถูกเปลี่ยนจะถูกลบไม่ย้ายใส่หรือแทนที่
  • ในกรณีที่มีการทำงานของตัวละครเดียวกันหลายตัวคุณอาจรายงานดัชนีแรกหรือดัชนีสุดท้ายของการทำงาน แต่จะสอดคล้องกับที่คุณใช้ ตัวอย่างเช่นbaaadการลบเพื่อbaadสามารถรายงาน 1 หรือ 3 (ศูนย์ดัชนี) แต่จะต้องเหมือนกันตลอดทั้งโปรแกรม
  • คุณไม่จำเป็นต้องเขียนแหล่งที่มาทั้งหมดลงในไฟล์ของตัวเอง คุณต้องใส่ไบต์ที่ถูกลบอีกครั้งเท่านั้น
  • ซึ่งแตกต่างจากกฎทั่วไปสำหรับ quines รังสีแข็งการตรวจสอบไบต์ที่เปลี่ยนแปลงจากการอ่านซอร์สโค้ดของโปรแกรมเป็นเกมที่ยุติธรรม
  • คุณสามารถส่งออกดัชนี byte ที่เปลี่ยนแปลงผ่านรูปแบบที่เหมาะสม สอดคล้องกันไม่ว่าจะเป็นดัชนี 0 หรือดัชนี 1 หรือสัญลักษณ์อื่น ๆ คุณยังสามารถส่งออกตัวเลขภายในสตริงแม่แบบ

นี่คือเพื่อให้โปรแกรมที่สั้นที่สุดชนะ

โชคดี!

EDIT1: เปลี่ยนความต้องการจากการเปลี่ยนเป็นการลบ

EDIT2: เพิ่มกฎสำหรับการทำซ้ำ


4
นี้เป็นมากยิ่งกว่าการจัดการโดยพลการลบ เห็นได้ชัดว่าไม่ใช่ esolangs ส่วนใหญ่จะออก (มักจะเป็นไปไม่ได้ที่จะเขียนโปรแกรมใด ๆที่ยังคงถูกต้อง syntactially ภายใต้การปรับเปลี่ยนหนึ่งไบต์ใด ๆ ) แม้ Fungeoids ส่วนใหญ่จะถูกขัดขวาง (พวกเขาไม่สามารถทำอะไรได้ถ้า 0th ไบต์เปลี่ยนเป็นคำสั่งออกจากโปรแกรม ) ฉันคิดว่าบางทีหนึ่งในสอง IP สามารถอยู่รอดในบางสิ่งบางอย่างเช่นฟิชชันแต่*คำสั่งของมันจะฆ่า IP ทั้งหมด พระคาร์ดินัล@ไม่สามารถทำอย่างใดอย่างหนึ่งเพราะ
ลินน์

นี่อาจกลายเป็นcode-challengeที่ที่แต่ละโปรแกรมได้รับอนุญาตให้ประกาศรายการของไบต์ที่ได้รับการป้องกันจากรังสี (แต่ไม่เกิน 50% ของขนาดทั้งหมด) ระบบให้คะแนนอย่างง่ายอาจนับจำนวนไบต์ที่มีการป้องกันรังสีแต่ละตัวเป็น 10 ไบต์หรืออย่างนั้น
Arnauld

( แต่ที่อาจนำไปสู่คำตอบบางอย่างที่น่ารำคาญและไม่น่าสนใจมาก.)
Arnauld

1
@JoKing การรายงานว่าหายไปนั้นถือว่าใช้ได้ตราบใดที่มันสอดคล้องกัน
Beefster

2
"คุณอาจต้องการไฟล์ที่จะตั้งชื่อบางชื่อและเรียกใช้จากไดเรกทอรีที่ระบุ" - ระวังบางคนอาจต้องการให้ชื่อไฟล์เป็นโปรแกรมที่ถูกต้อง ...
ASCII-only

คำตอบ:


9

Befunge-98 (FBBI) , 344 296 248 ไบต์

20020xxnngg33%%!!2200gg''00--3300gg33%%!!4400gg55%%!!22kk++55##rr55kk::00gg\\11pp00gg\\11++11pp22++00::pp00gg\\11++00gg--!!zz!!22**++00::gg00gg8844**--!!55++jj..''gg::00rr00::gg\\--..''220011''0011::''002211''223311''00441144kkppgg11001100::99oo@@

ลองออนไลน์!

ตรวจสอบ!

Befunge-98 เป็นภาษาลึกลับตัวแรกที่ฉันพบว่าเป็นทั้ง 2D และมีเอาต์พุตไฟล์ นี่คือโซลูชันเต็มรูปแบบ (ที่มีบรรทัดใหม่ต่อท้าย) เก็บไว้ในไฟล์ชื่อเป็นอักขระแท็บ มันส่งออกเป็นดัชนี 0 และส่งออกดัชนีแรกในการทำงานของตัวละคร (แม้ว่าจะมีเพียงคู่ที่เคย)

มีสนามกอล์ฟบางแห่งที่ต้องทำโดยเฉพาะอย่างยิ่งเมื่อไม่มีรหัส 15 ตัวในตอนนี้เพียงหนึ่งสนามเท่านั้น! ฉันจะพยายามทำให้เรื่องนี้สั้นลงโดยมีเป้าหมายในการไปถึงหรือต่ำกว่า 200 ไบต์


โอ้ว้าว! ฉันไม่คิดว่ามันเป็นไปได้
MilkyWay90

3

Unefunge-98 (PyFunge) , 118 ไบต์

22xx00##rr33kk::gg\\11--pp22++00ppgg\\11++gg--!!zz!!22**--00gg::gg8844**--!!22++jj##''rr++..gg''2200pp0011--00::99oo@@

ลองออนไลน์!

ตรวจสอบ!

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

คำอธิบาย (ยกเลิกการทำซ้ำ):

2x        Set the delta of the movement to 2
          This means the pointer moves 2 cells every step
          This will also initialise a counter as 2 (unless a 2 has been removed)
  0       Create the cell counter  (This will be stored at cell 0)
   #r     Enter the loop
     3k:                 Create 3 more copies of the counter
        g                Get the cell at the counter's position
         \1-p            Put it in the cell before that position
             2+0p        Add 2 to the counter and put it in cell 0
                 g       Get the cell at the counter's position
                  \1+g   Get the next cell
                      -!z!2*      If they are identical, push two, else 0
                            --    Subtract it from the total counter
                              0g:g84*-!   If the next character is a space
                                       2+j  r   Exit loop
                                         j#'    Else jump back to the start

Once the loop is over
+      Add the negative counter to the total counter
 .     And print
   '20p          Replace the 2 in cell 0 that was overwritten
             o   Write to a file named
            9    Tab
       01-       The cells from -1 to
  g              The total number of cells
              @  And exit the program
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.