检错自我修复程序


14

您的任务是创建一个程序,在该程序中,如果删除了任何一个字符,它将检测到删除了哪个字符,然后将删除的字符重新插入其自己的源文件中。

例如,如果您的程序已RadiationHardened被修改为RadiaionHardened,则您的程序必须输出第5个字节(索引为0)已被修改,然后程序源必须RadiationHardened在执行后立即执行。

注释和规则

  • 您可以假设执行前在源代码中删除了一个字符。未修改程序的行为是不确定的。
  • 您可以假定更改后的字节将被删除,不转置,插入或替换。
  • 如果有多个相同字符的运行,则可以报告运行的第一个或最后一个索引,但要使用的一致。例如,baaad被删除baad可以报​​告1或3(零索引),但是在整个程序中必须相同。
  • 您无需将整个源写到其自己的文件中。您只需要重新插入已删除的字节。
  • 与典型的辐射硬化Quines规则不同,通过读取程序自身的源代码来检测更改的字节是公平的。
  • 您可以通过任何合理的格式输出更改后的字节索引。关于它是0索引还是1索引或任何其他符号,请保持一致。您甚至可以在模板字符串中输出数字。

这是因此最短的程序为准。

祝好运!

EDIT1:将要求从替换更改为删除

EDIT2:为重复运行添加了规则


4
这比处理任意删除要困难得多。显然,大多数非eolang语言都已用完(通常无法编写在任何一字节修改后仍保持语法有效的任何程序)。甚至Fungeoid也受挫(如果将第0个字节更改为退出程序命令,它们将无能为力)。我以为两个IP之一可能会在诸如Fission之类的东西中幸存下来,但是它的命令会杀死所有IP。由于,枢机主教也无法做到。*@
林恩

这可能会变成code-challenge允许每个程序声明防辐射字节列表(但不超过总大小的50%)。一个简单的评分系统可以将每个受辐射保护的字节计为10字节,或类似的数字。
Arnauld

(但这可能会带来一些琐碎且不太有趣的答案。)
Arnauld

1
@JoKing,如果一致,则报告为丢失都可以。
Beefster '19

2
“您可能需要将文件命名为特定名称并从特定目录运行”-注意,有人可以只要求文件名是正确的程序...
仅ASCII

Answers:


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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.