放射線検出器!


26

放射線耐性プログラムとは、コードの文字が削除された場合でも、プログラムは同じように機能するプログラムです。この質問のために、いつ照射されたかを検出するプログラムを作成します。

プログラムや関数、とき書く任意の単一のバイトが削除され、結果としてプログラムが出力されますが、そのバイトだけそのバイトを。(他のバイトを出力しない限り、そのバイトを複数回出力できます

ルール:

  • プログラムには、少なくとも2つの異なるバイトが含まれている必要があります。(0だけのソリューションはありません;)
  • 元のプログラムが何をするかは関係ありません
  • 独自のソースコードを読む必要はありません。
  • コードは、異なるバイト数でスコアリングされ、最大バイトが勝ちます。たとえば、abc= 3ポイント、ababba= 2ポイント、abc勝ちです。
    • タイブレーカーはバイト数が少なく、その後に送信時間が早くなります

がんばろう!



私はその行を逃した。恥を知れ!
メゴ

5
「コードは異なる文字の数で得点され、最高額が勝ちます。」ほとんどの(すべてではないにしても)ソリューションには、実際にソリューションを変更せずに任意の文字を埋め込むことができる何らかの形式の文字列があります(したがって、言語がASCII、拡張ASCIIまたはUnicodeに制限されているかどうかになります) 。
マーティンエンダー

3
...サンドボックスは完璧ではありません。:( /文字はエンコードやその他の問題に関連しているため、「個別の文字」ではなく「個別のバイト」を測定できます
。– user202729

1
プログラムは入力を受け付けますか?
gggg

回答:


15

05AB1E9 7バイト(3のスコア)

22'''rr

オンラインでお試しください!

削除する '

いずれかで'削除され、22''rr22がスタック上の最初のものであることとになります'二度の結果を逆転させ、スタック、上の最後のものであること'

の削除 r

任意でr除去し、22'''r22の結果はスタック上の最初のものである、'スタック上の第二のものであること、およびrスタック上の最後のものです。これはr、しかし、が付け加えられた'ことリテラル文字列になりた"r"(コマンドとは対照的に、reverse stack暗黙的に印刷されます)、。

削除する 2

いずれかで2削除され、2'''rrになり2、スタック上の第一のものであること'スタック上に第二のものであることと、最終的rに結果をいったん逆転スタック上で最後であること2

したがって、この答えは有効です。何も削除しないと'、それが出力しますが、これは無関係です。これは、2以外の数でも機能します。


有効性チェッカーを作成し、それを使用して05AB1E *で競うことができます。

* 05AB1Eで可能なソリューションの数が100%確実ではありません...


さらに悪い同じより有効なソリューション

  • 1ポイント(無効)
  • 2点
    • '''''''VV'''''''XXまたは'''''''<any command that pops a without pushing>x2
    • '3 を超える奇数の後にs1 を超える偶数が続く(EG '''''''''ssss)。
    • '''..1を超える任意の数の期間と'2 を超える任意の奇数
  • 3点
    • '\\'''rr-と同じ考え方22'''rrが、\「最後のスタック項目を削除」されます。

'あなたが言うように、の通常の出力はルールによって無関係です。ただし、異常を検出するという名目上の目標は無効になりますが、これは少しおかしいです。
gggg

1
@gggg私の代替案の少なくとも1つが何も印刷しないとかなり確信しています。
魔法のタコ

1
@MagicOctopusUrnどういたしまして。コメントする代わりに編集することもできると思った。
boboquack

@boboquackは元のタグ(@boboquack)を機能させましたか、または投稿を再度表示して見つけましたか?ユーザーが決してコメントしなかったときに、タグがどのように機能するかを理解しようとしています。
魔法のタコ

@boboquack「ありがとう」から通知をもらったということですか?また、「ようこそ」の私の+1までこのスレッドを削除する必要があります。
魔法のタコ

9

Brainfuck、スコア3

出力はメモリダンプを通してのみ表示されるため、競合しない可能性があります。

+++++++++++++++++++++++++++++++++++++++++++++,-

入力が空で、EOFがセルを変更しないと仮定します。このようなメモリを出力にダンプするインタープリターを使用します。

プラスを削除すると、メモリは "+"のUnicode値になり、そうでない場合は "、"のUnicode値になります。しかし、答えよりもルールベンダーの方が多い。「-」でもほぼ同じです。これらの3つの文字がunicode-characterset内で互いに後続しているという事実を悪用します。


賢く、完全に正直に言うと、抜け穴だとは思わないでください。
魔法のタコ

EOFはセルを変更しないと仮定していますか?
ジョーキング

うん、と長い入力がないとして、それは罰金😊あるべきとして
HåvardNygårdの

私はこれを許可したいのです、変更されたセルのみを出力し、EOFでセルを変更しないままにするメモリダンプを持つインタープリターがありますか?
ジョーキング

1
copy.sh/brainfuckこれは正常に動作するはずです。実行して、「メモリの表示」を押すだけです。
ホバードナイガード

9

Pear Tree、256の異なるバイト、975バイト

残念ながら、この質問には、どこかにNULバイトを含めるための最適なソリューションが必要です(256バイトすべてをどこかに含める必要があるため)。これは、a)TIOリンクを提供できないことを意味します(TIOはプログラムでNULが嫌いであるため、または少なくとも、ブラウザーが対応できるように入力する方法がわかりません)、およびb)私はStack Exchangeに文字通りプログラムを貼り付けることはできません。代わりに、xxd下の「コードスニペット」リンクの後ろに隠された可逆の16進ダンプを配置しました。

説明

このプログラムは、3つの同じ部分で構成されています。(プログラムの複数の同一部分を連結することは、プログラムのテーマの1つです。)すべてのナシの木は、プログラムのどの部分を実行するかをインタプリタに知らせるためにどこかにチェックサムが必要です。チェックサムが実行される前に、チェックサムが開始に成功したプログラムの任意の部分を回転します(またはa partridge、チェックサムが一致しない場合に出力します)。この場合、3つの部分のそれぞれにチェックサムがあるため、照射されていない部分は最初に移動します。したがって、プログラムは、変更されていない部分と、それに続く他の2つの部分(1つは変更されている可能性があります)で構成されていると想定できます。

各部分は改行で始まり、次のコードに続きます(以下に空白とコメントを追加しました)。

$z{$/}++;      # In the hash table %z, set the key "\n" to 1
$/=$\=$@;      # Turn off newline handling when reading ($/ = undef);
               # Also don't add newlines when printing ($\ = undef)
               # $@ is set to undef by default
!$z{$_}?       #   If the current character is not in the hash table %z
  $z{$_}=1:    #   place it in the hash table %z
  delete$z{$_} #   else remove it from the hash table %z
for split//,   # for each character in
    <DATA>;    # the text appearing from the line beneath __DATA__ to EOF
print          # Print the following (no newline because $\ was undefined):
  keys%z>5?    # if the hash table %z contains more than 5 elements:
  "\n":        #   a newline; otherwise
  keys%z;      #   every key of %z, separated by spaces
__DATA__       # Start a string literal running from after this line to EOF

その後、これまでプログラムで使用されていなかったすべてのオクテットのコピー(純粋にスコアを実行するため)と、最後にチェックサムが来ます。(末尾の改行はありません。パーツは改行で始まりますが、改行で終わらないでください。)

ここには3つの異なるケースがあります。

  • 改行以外の文字が削除されました。この場合、2番目と3番目の部分に奇数回表示されます。つまり%z、奇数回追加または削除され、最終的にハッシュテーブルになります。実際、それはハッシュテーブル内の唯一のキーになります(2番目の部分の改行の後から3番目の部分の終わりまで文字列が実行され、ハッシュテーブルは1つの改行だけで開始されるため)そのまま印刷するだけです。
  • 最初または3番目の改行が削除されました。この場合、プログラムは3番目の改行が欠落するように回転し、2番目と3番目の部分を1行に効果的にマージします。経由でアクセスされる文字列リテラルに<DATA>は、すべての文字が偶数回含まれているため、ハッシュテーブルには元のコンテンツと単一の改行が含まれ、印刷されます。
  • 2番目の改行が削除されました。この場合、プログラムは(最初の部分に有効なチェックサムがあるため)回転されないため、2番目の部分は最初の部分と同じ行に移動します。<DATA>以下の行からのみ読み取りを開始する__DATA__ため、3番目の部分のみが表示されます。これには奇数回出現する5文字以上があるため、改行を印刷する特別なケースがトリガーされます。

検証

耐放射線性が高いA Pear Treeプログラムについて確認する必要がある最後の1つは、削除によってコードの不要なセクションがランダムに正しくチェックサムされ、コードが間違った場所にローテーションされるかどうかです。32ビットのチェックサムを使用していることを考えると、これは可能性は低いですが不可能ではありません。次のブルートフォーススクリプトを使用して、削除が行われないようにしました。

use 5.010;
use IPC::Run qw/run/;
use warnings;
use strict;
use Data::Dumper;
$Data::Dumper::Useqq=1;
$Data::Dumper::Terse=1;
$Data::Dumper::Indent=0;
undef $/;
$| = 1;
my $program = <>;

for my $x (0 .. (length($program) - 1)) {
    my $p = $program;
    my $removed = substr $p, $x, 1, "";
    alarm 4;
    say Dumper($p);
    run [$^X, '-M5.010', 'apeartree.pl'], '<', \$p, '>', \my $out, '2>', \my $err;
    if ($out ne $removed) {
        print "Unexpected output deleting character $x ($removed)\n";
        print "Output: {{{\n$out}}}\n";
        print "Errors: {{{\n$err}}}\n";
        exit;
    }
}

say $program;
run [$^X, '-M5.010', 'apeartree.pl'], '<', \$program, '>', \my $out, '2>', \my $err;
if ($out ne '') {
    print "Unexpected output not mutating\n";
    print "Output: {{{\n$out}}}\n";
    print "Errors: {{{\n$err}}}\n";
    exit;
}

say "All OK!";

検証スクリプトは、このプログラムが正しく機能することを確認します。


7

Stax、11バイト(4のスコア)

'''cc'~~'dd

オンラインで実行してデバッグします!

4以上のスコアで、このチャレンジに対する最初の(年代順の)回答を得ることは、私の名誉です。しかし、スコアはさらに高くなる可能性があります。

Staxでは、単一の文字で構成される文字列リテラルはで記述され''', 'c, 'd, '~すべての文字列リテラルも同様です。対応するコマンドc d及び~手段は、メインスタックの上部を複製メインスタックの先頭をポップ、それぞれ、入力スタックにメインスタックプッシュの上部を開きます。この挑戦のために、入力スタックは、出力に影響を与えないし、重要ではありませんん、それゆえ我々は言うことができるd~同じです。

説明

コードをいくつかの部分に分割し、別々に検討するのが最善です。

改ざんされていない場合'''cc、リテラル'とリテラルcをメインスタックにプッシュし、上部を複製するため、スタックは(from to bottom)になりc,c,'ます。

改ざんされていない場合は'~~、リテラル~をプッシュしてからポップ(および入力スタックにプッシュ)します。これは基本的にメインスタックのノーオペレーションです。

改ざんされていない場合'dd、リテラルdをプッシュしてからポップします。これはメインスタックの別のノーオペレーションです。

プログラムの最後では、明示的な出力は行われないため、メインスタックの最上部が暗黙的に出力されます。

プログラムがそのまま実行されている場合、最終スタックはまだでc,c,'あり、出力されますc

最初の部分がになったら、''ccリテラル'と2つのコピー命令があり、最終スタックはになります',','。他の2つの部分がノーオペレーションの場合、結果はになります'

最初の部分がになった'''c場合、結果は基本的に改ざんされてcいないものと同じですが、複製されません。したがって、スタックはになりますc,'。2回のノーオペレーションの後、スタックのトップはcです。

したがって、最初の部分で放射線を検出できます。

2番目の部分と3番目の部分はまったく同じように機能します。例として3番目の部分を取り上げます。

3番目の部分が改ざんされている場合、最初の2つの部分はそのまま保持され、3番目の部分を実行する前のスタックは c,c,'

3番目の部分が'dになった場合、リテラルdがメインスタックの一番上にプッシュされ、それ以上何も行われません。メインスタックの一番上dが出力されます。

3番目の部分がになるとdd、2つの要素がメインスタックからポップされ、スタックの最上部'が出力されます。

したがって、3番目の部分で放射線を検出できます。同じ理由で、2番目の部分で放射線を検出できます。


5

05AB1E、スコア2、6バイト

„"""„„

削除された文字を2倍に印刷することがあります。が含まれていません'

使い方:

最初の削除

"""„„

オンラインでお試しください!

最初に、空の文字列リテラルをスタックにプッシュします。次に„„、暗黙的に印刷されるを押します。

削除する "

„""„„

オンラインでお試しください!

まず、命令で""スタックにプッシュします2-char string。次に、別の2文字の文字列を取得しようとしますが、これは中止され(理由は正確にはわかりません)、""印刷されます。

2番目または3番目の削除

„"""„

オンラインでお試しください!

まず、命令で""スタックにプッシュします2-char string。次に、暗黙的に印刷されるを押します。


5

ゼリー、5バイト、スコア2

”””ḷḷ

オンラインでお試しください!

いずれかで削除:

””ḷḷ

オンラインでお試しください!

文字は1バイト文字リテラルで始まります。このプログラムは””、文字列を生成することから始まりますダイアドは、それの左の引数を取ります。文字列はの2つのインスタンスを通過するだけです

いずれかで削除:

”””ḷ

オンラインでお試しください!

このプログラムで””は、文字”ḷ生成してから文字を生成し、これのみが出力されます。


その他の解決策

  • この投稿の代わりに、aまたはo代わりに働いていた他の多くのキャラクター
  • ⁾⁾⁾⁾FFF。これは同様の方法で機能します。似ていますが、2バイトの文字列リテラルを開始します。「照射された」プログラムは、コメントで有効と判断された削除されたバイトを2回出力しました。

Magic Octopus Urnの妥当性チェッカーの(はるかに派手はない)Jellyバージョンを以下に示します。出力の左側の列は削除された文字であり、右側の列は結果のプログラムの出力です。


私の妥当性チェッカーではありませんthaaat空想。投稿された他のソリューションでは失敗します;)。
魔法のタコ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.