何を忘れましたか?


31

あなたの仕事は、バイトのシーケンスで構成される空でないコンピュータープログラムを書くことです。プログラム内の特定のバイトを選択し、そのインスタンスをすべてプログラムから削除すると、変更されたプログラムは削除されたバイトを出力するはずです。

たとえば、プログラムが

aabacba

次に、bcb出力しa、出力aaacaする必要があり、出力baababaますc

変更されていないプログラムが何をするかは問題ではありません。

回答は、バイト数を最小化することを目的として、バイト単位でスコアリングされます。


4
この課題にはタグが付いていませんが、独自のソースコードを読むことはできますか?
デニス

1
@デニスは確か。私のゲストになる
小麦ウィザード

2
プログラムのすべてのバイトが数字を表す場合、終了コードを介して出力できますか?
氏Xcoder

15
これは、使用する個別の文字の数を最大化する必要があるコードチャレンジとしては良いと思います。
Notts90

2
空でない:Pの代わりに1バイト以上を指定する必要があります。またはNotts90が言ったこと。
魔法のタコ

回答:


70

zsh、603 594 566 561 548 440 415 399 378 370バイト

ec
ho \\n;ca t<<<$'\x20';exi t
d$c -e8BC6P
d0c -eKp
$'\172\163\150' $'\055\143' $'\146\157\162 v \151\156 \173\043\056\056\134\175\175\073\173 \146\147\162\145\160 \055\161 $\166 '$0$'\174\174\074\074\074$\166\073\175'
$'\145v\141\154' $':\073\072\046\046\145\170\151\164';#%&()*+,/9=>?@ADEFGHIJLMNOQRSTUVWXYZ[]^_`jklmsuwy
0# $#;for b in {$..z};{ fgrep -q $b $0||<<<$b;}

coreutils +に依存しdcます。

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

それは...旅でした。

この答えには3つの部分があります。最初の4行は、特定の特殊なケースを処理して、後続のコードを簡素化します。次の2行と最後の行はどちらも本質的に同じことを実現しますが、特定の文字を削除して1つだけ実行します。それらはほとんど補完的な文字セットで書かれているため、文字を削除してもせいぜい1つだけが壊れ、もう1つは機能し続けます。

最初の部分を見て、最初に処理します

  • 改行の削除 ec\nho \\n
  • スペースの除去ca t<<<$'\x20'(後続のexi tコードの実行を回避するために続きます。これにより、余分な出力が発生します)
  • $除去d$c -e8BC6P8BC6= 9226であり36*256 + 10、そして36及び10は、のバイト値であり$、それぞれ、改行文字、我々はライン6に大きいコメントに含めることを回避するために小数で進数字を使用して)
  • 0を使用した削除d0c -eKpK10進精度を取得0します。これはデフォルトです)

次の部分では、使用される文字(2行目の終わりのゴミを除く)は$'\01234567v;、スペース、改行のみです。これらのうち、4つが考慮されているため、残りの行('\1234567v)は最後の行に現れません。8進エスケープ($'\123'値123 8の ASCII文字を表す)を展開すると、次のようになります。

zsh -c 'for v in {#..\}};{ fgrep -q $v '$0'||<<<$v;}'
eval ':;:&&exit'

最初の行は、プログラムで使用されるすべての文字をループし、独自のソースコード($0実行中のスクリプトのファイル名)で各文字を検索し、見つからない文字を出力します。

2行目は少し奇妙に見え、exit多数のnops を使用した場合と同じことをしているように見えます。ただし、exit8進数として直接エンコードすると$'\145\170\151\164'2またはが含まれないとなります3。実際には、これを削除に対して回復力の低いものにする必要があります。これは'\014567v、最初の行を壊していずれかが削除されると、2番目の行も壊れて、残りのコードを実行できるようになるためです。ただし、3行目と4行目を実行できるように、2または3削除された場合は、ブレークする必要もあります。これは、それぞれ8進数表現で2と3をもつ:およびのシューホーンによって達成され;ます。

2行目の終わりのジャンクは、すべての印刷可能なASCII文字が少なくとも1回出現することを確認するためだけにあります。

exit最初のセクションで呼び出されなかった場合(つまり、の1つを削除することでマングルされた場合'\01234567v)、2番目のセクションに進み、これらの文字を使用せずに同じことを実行する必要があります。最後の行はデコードされた最初の行に似ていますが、ループの範囲を縮小して数バイトを節約できる点が異なり'\01234567vます。また、持っている0# $#、それをコメントアウトしている場合余分な出力を生成するのを防止する、その前0または$削除されました。


5
うわー、関与する個別のキャラクターの量を考えると非常に印象的です!間違いなくその説明を楽しみにしています。
ケビンクルーッセン

3
@KevinCruijssenここに行きます:)
ドアノブ

1
@Doorknobこれが548インターネットに勝てない場合、何が起こるかわかりません。正直なところ、603バイトバージョンも同じくらい印象的です!
魔法のタコ

3
これまでの唯一の興味深い答え。
htmlcoderexe

21

網膜、1バイト

1

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

シングルバイト(1)のすべてのインスタンスが削除されると、出力はになり1ます。簡単です。


6
私はこのようなものを見つけるためにTIOをブラウズしていました-あなたは私に打ち負かされました。ところでこれは多言語で、Snailsで動作します
-JayCe

IMO、この回答は最初の回答(多分永遠に不完全な言語のリストを含む)として多言語回答にアップグレードする必要があり、他の2つは忘却に向けられました。ああ、これもCで動作します。

@Rogem「これはCで動作します」とはどういう意味かわかりません。1空のプログラム用に出力するCコンパイラはありますか?とにかく、問題の答えは異なるアプローチと行動を利用していると思います。IMOの多言語回答は、アプローチが同じままである場合にのみ保証されます。(客観的には、以下の回答では実際のコードが異なるため、これは多言語ではありません。)自由に投票してください。ただし、有効な回答は有効な回答です。回答はそのままにしておきます。回答のコレクションを格納したくありません。
コナーオブライエン

11

言語、216173027061157310バイト

216173027061157310 = (144115617572598740 + 144115241762960340 + 144115194786755540) / 2。あり216173027061157310 - 144115617572598740 $、S、216173027061157310 - 144115241762960340 #Sおよび216173027061157310 - 144115194786755540スペースが。

144115617572598740 #とスペースは、次のBFプログラムをエンコードします。

++++++[>++++++<-]>.

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

144115241762960340 $とスペースは、次のBFプログラムをエンコードします。

+++++++[>+++++<-]>.

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

144115194786755540 $sおよび#sは、次のBFプログラムをエンコードします。

++++++++[>++++<-]>.

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

編集:@Nitrodonのおかげで72057832274401770バイトを保存しました。


なぜU127バイトを使用しないのですか?オンラインでお試しください!それとも、nulバイトとsohだけですか?
ジョーキング

@JoKingそれUが出力可能な最短の印刷可能なASCIIバイトであることは知りませんでした。印刷できないバイトを使いたくありませんでした。
ニール

セルや印刷できない文字の折り返しを利用しなくても、スペース文字を3番目の別個のバイトとして含めることで、これを216173027061157310バイトまで減らすことができます。
ニトロドン

7
「編集:72057832274401770バイトを保存しました...」
リスター氏


9

ポリグロット*、1バイト(確認待ち

0

オンラインでお試しください!(三角法を使用)

*:これは(やや広い)さまざまな言語で機能します(4、> <>などのエソランやその他の例外を除く)。ソースコードのJellyの回答と同じですが、I / Oの方法が異なります。出力は終了コードを経由します。0ソースコードから削除すると、空のプログラムが残ります。これは多くの場合、エラーにならず、多くの言語で終了コード0を生成します。



3

単項(非競合)、96バイト

00000000: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000050: 0000 0000 0101 0101 0101 0101 0101 0101  ................

これがxxdダンプです。

単項言語のより広い定義では、ソースコードに任意の文字を使用できます。しかし、私はこれのために働くコンパイラーまたはインタープリターを見つけませんでした。そこで、私はこの答えを非競争的であるとマークしました。この質問が尋ねられる前に投稿されたものを見つけることができれば、私はそれにリンクします。


4
これは私が見た中で最小の単項プログラムです。
Draco18s
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.