ガイガーカウンターを作る


29

ガイガーカウンターは、放射線の検出に使用されるデバイスです。

ガイガーカウンタープログラムを作成します。

ご存じのとおり、放射線がコンピュータープログラムに当たると、ランダムに正確に1バイトが削除されます。したがって、ガイガーカウンタープログラムは、それ自体は何もしませんが、いずれかのバイトが削除されると、変更されたプログラムがを出力してbeep、放射線の存在を示します。

回答はバイト単位でスコアリングされ、バイト数が少ないほど優れています。回答は少なくとも1バイトでなければなりません。

プログラムbeepは、一貫してそうである限り、改行を末尾に出力したり、空の出力用に単一の改行を出力したりできます。またごとに異なるケースを使用することができ、あなたのプログラムbeepのようなBEEPbEEPまたはBeep、それがとても一貫して行うように。



7
BEL制御文字を使用して、実際のビープ音を出力できますか?
ジョーキング

2
@JoKing私はこのアイデアをいじりました、それは面白いですが、私はノーと言わなければなりません。それはあまりにも大きく異なります。
小麦ウィザード

2
Retinaで解決策を見たい。
mbomb007

3
私はSMBFでこれを行う方法を理解しようとしていますが、2つのセルを比較する唯一の方法はそれらを変更することです。また、SMBFでは、チェックする必要があるセルは、プログラムが現在実行されているセルです。だから、ハイゼンベルクの不確実性の原理のようなものです。そのため、制御フローのみを使用して、何かが変更されたかどうかを判断する必要があります。
mbomb007

回答:


24

失われた303の293 263 253 238 228バイト

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

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

検証スクリプトユーザー202729の回答から借用)。残念ながら、これは一度にコードの半分しかテストできませんが、プログラム全体をテストしたので安心です。

痛い、これは大変だった。WWの削除された回答を引用します。

Lostは、おそらくこのチャレンジにとって最も興味深い言語です。Lostでは、ポインターの開始位置と方向は完全にランダムであるため、確定的なプログラムを作成するには、考えられるすべての開始位置と方向を考慮する必要があります。同時に、この課題の性質上、削除される単一バイトも考慮する必要があります。

残念なことに、彼の答えは、改行を削除することを考慮していませんでした。

説明:

(数バイトはあちこちにあることに注意してください)

最初に、コードの一般的な構造について説明しましょう。

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

処理ライン以外のすべては、のいずれか>またはいずれかで完全に構成されている必要があります\/。どうして?さて、例として、改行を削除しましょう:

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

最初の行は、今あるブロックの残りの部分よりも長いです。ポインターが>\/垂直方向に移動する非キャラクター上にスポーンすると、無限ループに陥ります。


最大の放射線検出器部分は、各ラインの終わりのセクションです。

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

通常、最初の行からこれを通過するIPは最後の行から出ます。ただし、行の文字が削除されると、その行は1つ下にシフトします。例:

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

そして、IPは代わりに、バイトが欠落している行を終了します(最後の行を除き、最後から2番目の行を終了します)。

そこから、最初の4行はそれぞれ2行目にリダイレクトされます。

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

これは、2つのbeeperのいずれかにつながります。

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

最初のbeeperのバイトのいずれかが削除されている場合、代わりに2番目に移動します。

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

beepその後、両方のersは最初の行と終端に戻ります@

その他のその他のパーツ:

(((((([[[[[[[ポインタがスタックに全体最初の行をプッシュアップ引用符と一対の端部の内側に開始したときにスタックをクリアするために使用されます。残念ながら、最初の改行を削除して最初の行のサイズを2倍にすることができるため、長くする必要があります。beep引用符の代わりに算術を使用して生成する実験は、より長くなりました。

\sおよび/線散らばっSはゴルフにある正しい行へのポインタをリダイレクトすることによって、コードの先頭行のバイト。ボトムラインのほとんどは単なるフィラーであるため、トップラインのみがゴルフできます。誰かが私が今持っているものよりも短い放射線耐性スタックのアイデアを持っているなら、気軽にコメントしてください。


好奇心から、チャットに投稿した部分的な回答はどれほど役に立ちましたか?以前のバージョンにはいくつかの類似点がありましたが、正しい方向に進んでいるかどうかを知りたいと思います。
小麦ウィザード

@WWそれまでにすでに作業を行っていましたが、プッシュと引用符の1つだけが終了句を必要とするという事実\/を分離するのにbeep役立ちました
ジョーキング

20

六角形、38バイト

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

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

検証プログラム。


説明

ここでは、六角形の辺の長さのHexagonyの自動検出を使用します。

バイトが削除されない場合、プログラムの辺の長さは4で、次のようになります。

バイトが削除されていないプログラム

ただし、バイトが削除された場合。2つのケースがあります。

  1. 削除されたバイトは2番目のバイトの後<です。

    実行フローは次のとおりです。

    最後のバイトが削除されたプログラム

    @5行目に2つの連続があるので、それらの1つが削除されても、IPは安全にヒットし@ます。

  2. 削除されたバイトは、2番目またはそれ以前<です。

    その後、後半はそのまま残り、IPはそれによって上方にリダイレクトされなくなり<ます。実行フローの画像:

    2番目の<code> << / code>が削除されたプログラム


19

六角形34 29バイト

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

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

説明:

HexagonyColorerを使用して適切な六角形にフォーマットされた通常のコードは次のとおりです。

がんなし...

//先頭のダブルは、このパスが常に使用されるようにします。文字が削除@されると、パスから削除され、1つ後ろにシフトされるか、それ自体が削除されます。

癌!

この場合、の後に文字を削除しました|。これにより、このパスに沿って印刷されbeepます:

最初のビープ音

代わりに|(または|それ自体)の前から文字を削除する場合、他のビーププリンターに従います。

2回目のビープ音

その後、すべての可能性を考慮しbeep、プログラムの未照射部分のみを使用しました。


13

自己修正Brainfuck73 63バイト

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

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

コードの中央のスペースは、実際にはNULバイトを表しています。

説明:

コードは、中央の3 NULバイトによって2つのセクションに分割されます。基本的にbeep、他のセクションが照射された場合、それらは両方とも印刷されます(いくつかの例外があります)。

まず、<<[[最初は、すべて]のがいつでも一致することを確認することです。セルが正の場合、s は[一致を検索しようとしません]が、]s は実行します]これらのブラケットの1つにジャンプして戻る場合は、セルが0

次の部分で[[<<]]>は、セクション2の長さが偶数かどうかを確認します。その場合、セクション1の残りの半分を実行し、セクション2の先頭でbeepを使用して印刷しbbeeppます。

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

次に、セクション2をすべてクリアして、実行されないようにします。

セクション2では、セクション1とNULバイトの長さがで割り切れるかどうかを確認3+[<<<]>>ます。

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

同様に、印刷しますbeep


10

Z80Golf53 36 34バイト

@Lynnのおかげで-16バイト@Neilのおかげで
-2バイト

これは単なるZ80マシンコードであるため、このコードには多くの印刷できないものがあるため、xxd -r-reversible hexdumpがあります。

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はAnarchy Golfの架空のZ80マシンでcall $8000、putchar、call $8003getchar、haltインタープリターを終了し、プログラムはに配置され$0000、他のすべてのメモリはゼロで埋められます。アセンブリでプログラムを耐放射線性にすることは非常に困難ですが、一般的に有用な手法は1バイトのべき等命令を使用することです。例えば、

or c        ; b1    ; a = a | c

は1バイトでa | c | c == a | c、命令を繰り返すだけで耐放射線性を実現できます。Z80では、8ビットの即時ロードは2バイト(即値が2番目のバイトにある)であるため、一部の値を確実にレジスターにロードすることもできます。これはもともとプログラムの最初に行ったことであるため、回答の最後にアーカイブした長い亜種を分析できますが、より簡単な方法があることに気付きました。

このプログラムは2つの独立したペイロードで構成されており、そのうちの1つは放射線によって損傷を受けた可能性があります。いくつかの絶対メモリアドレスの値をチェックすることにより、バイトが削除されたかどうか、および削除されたバイトがペイロードの2番目のコピーの前にあったかどうかを確認します。

最初に、放射線が観測されなかった場合は終了する必要があります。

    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が削除されると、放射は正しく検出され、ジャンプは行われず、オフセットは問題になりません。次の命令の最初のバイトが消費されますが、バイトの削除に耐えるように設計されているため、これは重要ではありません。
  • ジャンプオペコード$20が削除されると、ジャンプオフセット$10djnz $ffe4(次の命令バイトをオフセットとして消費します-上記を参照)、ループ命令-Bをデクリメントし、結果がゼロでない場合はジャンプします。のでffe4-ffffゼロ(充填されているnopS)、およびプログラムカウンタはラップアラウンド、これはプログラムの冒頭256回を実行し、最終的には継続します。この作品には驚かされます。
  • を削除する$ddと、スニペットの残りの部分がとしてデコードされor (hl) / ld ($1020), hl、プログラムの次の部分にスライドします。orすべての重要なレジスタを変更しないだろう、とHLは、この時点ではゼロであるので、書き込みも相殺されます。
  • を削除する$b6と、残りがデコードされld ($1020), ix、上記のように進みます。
  • を削除する$21と、デコーダーがを食べ$20djnz動作がトリガーされます。

ゼロの統合チェックにより、使用するとor a, (ix+*)2バイト以上節約されることに注意してくださいld a, (**) / and a / and a

ここで、ペイロードの2つのコピーのどちらを実行するかを決定する必要があります。

    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

2つのコピーは、相対ジャンプを使用して選択するため、nopで区切られています。また、放射線は、ジャンプ後の最初のバイトをスキップするようにプログラムをシフトしている可能性があります。さらに、nopはゼロとしてエンコードされるため、シフトされたバイトを簡単に検出できます。スイッチ自体が破損している場合、両方のコピーが安全であるため、どちらのペイロードを選択するかは重要ではありません。ただし、初期化されていないメモリにジャンプしないようにしましょう。

  • 削除$ddすると、次の2バイトがとしてデコードされor (hl) / dec dます。Clobbers D.大したことはありません。
  • 削除$b6すると、のドキュメント化されていない長いエンコードが作成されdec dます。同上。
  • 削除$15すると、$28代わりにオフセットとして読み込まれ、$0c以下のように、実行が続行されます。
  • $28消えると、$0cはとしてデコードされinc cます。ペイロードは気にしませんc
  • 削除$0c-それがnopの目的です。そうしないと、ペイロードの最初のバイトがジャンプオフセットとして読み取られ、プログラムが初期化されていないメモリにジャンプします。

ペイロード自体は非常に単純です。文字列のサイズが小さいと、このアプローチはループよりも小さくなり、この方法で位置に依存しないようにする方が簡単だと思います。ebeep繰り返しなので、私は1つをオフに剃ることができます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

What if:空ではない出力はビープ音ではなく正常でした

1バイト

v

halts通常はプログラムを実行しますが、放射によって削除された場合、メモリはゼロでいっぱいになり$8000、無限の回数実行され、多くのヌルバイトが出力されます。


aゼロから始まるので、or a, (N);代わりに使用できませんld a, (N); and a;か?そのようにして数バイトを節約できるように見えます。
ニール

@ニール良い質問!残念ながら、Z80では、ロード命令のみがこのようなアドレスを取得できます。
NieDzejkob

うーん、Z80プログラミングをしてから長い時間が経っていますor a, (ix + N)
ニール

@Neilは実際に存在し、IXもゼロから始まります...残念ながら、その領域にバイトを保存する20 1920 18、先頭がになるようにバイトがシフトし、を削除20すると無条件ジャンプが後方に作成されるため、 nopは、プログラムの最初のジャンプの後に追加する必要があり、バイトの保存を逆にします。
NieDzejkob

ああ、それは残念だ。チェックしてくれてありがとう!
ニール


4

Klein、各トポロジの1つ、合計291バイト

WWの答えを見た後001トポロジを使用しを、各トポロジでガイガーカウンタを実行することがどれほど難しいかを確認することにしました。(ネタバレ:非常に難しい。どちらの手が私の左であるかを把握しているように見える手のジェスチャーなしでは、ポインタがどこに行くかを把握するのは難しい)

検証!

(すべてのトポロジーで有効なガイガーカウンターであるプログラムを書くことも考えましたが、待つ必要があるかもしれません。他の誰かが試してみたい場合は、私は500の報奨金を提供しています)

000および010、21バイト

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

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

これは私の><>ソリューションから移植されています。これは明らかに000、ほとんどの2D言語のデフォルトトポロジであるため、ますが、でも動作することに驚きました010

001および011、26バイト

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

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

これはWWのanswerから直接コピーされます。ありがとう!

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"<\

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

右側からブザーを入力する必要があった唯一の場所。


私はその賞金を喜んで2番目にします。
小麦ウィザード

3

自己修正Brainfuck144 102バイト

印刷できないものは、エスケープシーケンスとして表示されます(例:)\x01

\xa8<<[[<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[[[.<-]>[>-]\x01qffb\x00\x00beep\x00]]]<[>]<<[>[-<+>]+<<]>[[>]>>[.>]]\x01

検証!


2

ルーン文字のエンチャント、29バイト

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

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

基本的に、Klein 000の回答または> <>の回答と同じです(私はKleinの回答から始めました)。本当に必要な唯一の変更は有効にした<Lして. IPエントリポイント(必要性2、そうでない場合は削除が非コンパイルプログラムにつながる)とDELAの挿入挿入し、(コマンドのシンボルの翻訳)yを取得するためのコマンドをマージする2つのIP(したがってbeep、1つだけを印刷する)、これも2つ必要です。また、行の長さを同じに保つために追加のNOPを挿入する必要がありました。Klein @は「印刷と終了」にも便利に使用します。

左下の空白を利用する機能はありません。方向を変更するリフレクターは放射を検出する能力を阻害するためです。例(26バイト、照射y):

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

エントリセグメントが曲がって下の行のターミネータに再反射するため、出力は出力されません。



1

Wumpus37 34 32 31バイト

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

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

このソリューションでは、 .、プログラムの長さの位置係数にジャンプするというます。

同じ量のバイトの代わりに


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

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

これは、奇数と偶数の行の長さのポインターの方向の違いを利用しています。("改行が削除されたときに最初のコードが実際にどのように機能するかは本当にわかりません)


1

クライン(001)、26バイト

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

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

確認してください!

説明

このプログラムは、クラインのユニークなトポロジー、特にクラインのボトルである001トポロジーを利用しています。

未編集のプログラムは、実行パスに従います。

オレンジ色のパス

プログラムからバイトを削除すると、プログラムに4つの方法(それぞれ異なる色)で影響する可能性があります。

プログラムセクション

最初に注意することは<<、開始時に常にIPを原点の左側にそらすことです。いずれかが<sが削除され、他のは、その場所を取ります。したがって、赤色のセクションからバイトが削除されると、次の実行パスがたどられます。

赤い道

青いバイトが削除されると、非常に単純なパスが取得されます。

ここに画像の説明を入力してください

改行が削除されると、パスが取得されます。

グリーンパス

黄色のパスはもう少し複雑です。一番下の行は一番上の行よりも長いため、実行の開始時にプログラムを2乗すると、最初の行の最後に仮想文字が追加されて同じサイズになります。2行目のいずれかのバイトが削除されると、行は短縮され、その仮想文字は追加されません。!通常、仮想キャラクターを飛び越しますが、これがない場合は/代わりに飛び越すため、これは重要です。

黄色い道


1
私の><>ソリューション00021バイト
ジョーキング

@JoKingそれはそれ自身の答えとしては良いと思います。
小麦ウィザード

1

バックハンド25 21バイト

vv""ppeeeebb""jjHH@

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

これは、ポインターのステップ値を変更するバックハンドの機能を使用して、ステップごとに命令をスキップし、冗長性の問題をきちんと解決します。次に、jコマンドを使用して、最後の文字(@、halt)にジャンプしてコードが照射されているかどうかを確認し、そうでない場合は最後から2番目にジャンプ(H、halt、および出力スタック)します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.