エラー検出自己修復プログラム


14

あなたの仕事は、1つの文字が削除された場合、どの文字が削除されたかを検出し、削除された文字を独自のソースファイルに再挿入するプログラムを作成することです。

たとえば、プログラムがにRadiationHardened変更された場合、プログラムはRadiaionHardened5バイト目(0インデックス)が変更されたことを出力し、プログラムソースはRadiationHardened実行直後でなければなりません。

注意事項と規則

  • 実行前に、ソースコードで1文字だけが削除されたと仮定することができます。変更されていないプログラムの動作は未定義です。
  • 変更されたバイトは、転置、挿入、または置換ではなく、削除されると想定できます。
  • 同じ文字の複数の実行の場合、実行の最初または最後のインデックスを報告できますが、使用するものについては一貫性があります。たとえば、baaad削除されるとbaad、1または3(ゼロインデックス)のいずれかを報告できますが、プログラム全体で同じである必要があります。
  • ソース全体を独自のファイルに書き出す必要はありません。削除されたバイトを再挿入するだけです。
  • 耐放射線強化されたクインの典型的なルールとは異なり、プログラム自身のソースコードの読み取りから変更されたバイトを検出することは公正なゲームです。
  • 適切な形式で、変更されたバイトインデックスを出力できます。0インデックス付きか1インデックス付きか、その他の表記法について一貫性を保ちます。テンプレート文字列内に数値を出力することもできます。

これはので、最短のプログラムが勝ちます。

幸運を!

EDIT1:要件を置換から削除に変更しました

EDIT2:重複の実行のルールを追加


4
これは、任意の削除を処理するよりもはるかに困難です。ほとんどの非エソランは明らかに外にあります(通常 1バイトの変更で構文的に有効なプログラムを書くことは不可能です)。Fungeoidでさえほとんど妨害されています(0番目のバイトがプログラム終了コマンドに変更された場合、何もできません)。2つのIPのうちの1つがFissionのようなもので生き残ることができると思いましたが、そのコマンドはすべてのIPを殺します。枢機も、それができないのです。*@
リン

これはcode-challenge、各プログラムが放射線から保護されたバイトのリストを宣言することを許可される場所に変わる可能性があります(ただし、合計サイズの50%以下)。単純なスコアリングシステムは、放射線で保護された各バイトを10バイトなどとしてカウントすることです。
アーナルド

(しかし、それは、ささいであまり面白くない答えになるかもしれません。)
アーナルド

1
@JoKingは、一貫している限り、どちらかが欠落していると報告しても問題ありません。
ビーフスター

2
「あなたは、特定の名前を命名するために、特定のディレクトリから実行されたファイルを必要とするかもしれない」 -気をつけて、誰かがファイル名だけが正しいプログラムであることを要求することができます...
ASCIIのみ

回答:


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のノーオペレーションがあり、ノーオペレーションは 1つだけなので、いくつかのゴルフをする必要があります!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.