ユニークな出力を持つBrainf ***サブプログラム


19

100バイトの長いBrainfuck(BF)プログラムを作成する必要があります。

結果の100個の新しい(99バイト長)プログラムは、可能な限りあらゆる方法で1文字削除されます。プログラムのために例えば++.>.5つのサブプログラムは+.>.+.>.++>.++..++.>

スコアは、100個のプログラムが生成する一意の出力の数になります。スコアが高いほど優れています。

詳細

  • プログラムは、最初の文字を出力した後に終了します。
  • 無効または終了しないプログラム、および空の出力を生成するプログラムは、スコアにカウントされません。
  • BFセルは8ビットラッピングセルです。(255 + 1 = 0、0-1 = 255)
  • プログラムには入力がありません。,コードで使用すると、現在のセルがに設定され0ます。
  • 開始位置の左側にセルはありません。たとえば<.、無効.<ですが、実行はで終了するため有効です.。テープは反対方向に無制限です。
  • 不均衡な括弧([および])があるプログラムは無効です。
  • 元のプログラムは、スコアを変更せずに100バイトに簡単に拡張できるため、100バイトより短くすることができます。
  • 元のプログラムは有効なBFコードである必要はありません。

あなたは使用することができ、このプログラムのpython3(ideoneリンクを)あなたの答えのスコアを決定します。(長期実行プログラムの場合、maxstep変数を変更する必要がある場合があります。)

(簡単にするために、このプログラムは100バイトよりも短いです。)

Solution: ++,+[-]+><.-,-.

Score: 3

Explanation:

Subprogram     => Output

+,+[-]+><.-,-. => 1
+,+[-]+><.-,-. => 1
+++[-]+><.-,-. => 1
++,[-]+><.-,-. => 1
++,+-]+><.-,-. => None
++,+[]+><.-,-. => None
++,+[-+><.-,-. => None
++,+[-]><.-,-. => 0
++,+[-]+<.-,-. => None
++,+[-]+>.-,-. => 0
++,+[-]+><-,-. => 255
++,+[-]+><.,-. => 1
++,+[-]+><.--. => 1
++,+[-]+><.-,. => 1
++,+[-]+><.-,- => 1

Unique outputs are [0, 1, 255]    
Score is 3 for ++,+[-]+><.-,-. (length = 15)

同点の場合、勝者はコードが短い方です。(詳細セクションに記載されているように、プログラムは100バイトより短くすることができます。)コードの長さが等しい場合、勝者は以前のポスターです。

ボーナスパズル:太字の制限なしで、スコア100のプログラムを見つけることができますか?


ボーナスパズルを解きました。答えは(打ち切り)です。
AJMansfield

@AJMansfield他の人もパズルについて考えられるように、コメントを編集できますか?たとえば、解答を含むpastebin.comリンクにソリューションを変更します。
ランダム

3
うーん 私は既存の回答の微改善を見つけるためにこの質問の遺伝的最適化プログラムを作成しましたが、これまでのところあまり成功していません。彼らはそれぞれ79と43で立ち往生しています。ああ、それは一撃の価値がありました!
wchargin

回答:


12

スコア:35 41 69 78 79 83

(改行を削除します。)

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

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

なぜそれが機能するのか正確にはわかりません...

スコア:79

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

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

2 * mem [i] * i 合計し、アドレスが右から左にカウントされるセルの数(+ const)を追加することになっています。乗数2とセルの数により、異なるパリティを持つ+と>を削除できます。

実際、69ポイントバージョンではそのように機能しました。しかし、最新バージョンはそれを破り、偶然別のものを手に入れました。sum(mem [i] * i + i + 1)を計算し、+と>を削除するとほぼ同じことを行います。ただし、sum(i)はセルの数に違いがあり、これは異なる出力の数でもあります。 +と>を削除します。

ボーナスの場合:

+。+。+。+。+。+。+。+。+。+。+。+。+。+。+。+。+。+。+。+。+。+。+。+。+。 +。+。+。+。+。+。+。+。+。+。+。+。+。+。+。+。+。+。+。+。+。+。+。+。+。


注:提供されているスコアラープログラムでこれをテストする場合は、一部のサブプログラムが長時間実行されるため、maxstep値(def evaluate(r,maxstep=20000):)を増やしてください。
randomra

1
スコアは、実際に増加させることができる79置き換えることで->+>+> ...->,>+> ...
BrainSteel

@BrainSteelノーオペレーションに変更しました。
jimmy23013

9

スコア:37 43

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

編集:今私のプログラムはいくつかの角括弧を許可します。それで賞品を獲得するつもりはありませんが、それは私がいくつかの重み付きRNGが私のために忙しい仕事をするようにするために得るものです。

これは、Cで作成したプログラムによって生成されました。

N削除される文字ごとに、出力は次のとおりです。

N = 0 => 158
N = 1 => 158
N = 2 => 158
N = 3 => 187
N = 4 => 129
N = 5 => 100
N = 6 => 158
N = 7 => 13
N = 8 => 1
N = 9 => 211
N = 10 => 129
N = 11 => 1
N = 12 => 57
N = 13 => 255
N = 14 => Mismatched Braces
N = 15 => 59
N = 16 => 11
N = 17 => 11
N = 18 => 11
N = 19 => 117
N = 20 => 11
N = 21 => 117
N = 22 => 166
N = 23 => Mismatched Braces
N = 24 => 206
N = 25 => 206
N = 26 => 206
N = 27 => 147
N = 28 => 147
N = 29 => 158
N = 30 => 148
N = 31 => 188
N = 32 => 51
N = 33 => 17
N = 34 => 84
N = 35 => 84
N = 36 => 84
N = 37 => 158
N = 38 => 158
N = 39 => 94
N = 40 => 46
N = 41 => 94
N = 42 => 94
N = 43 => 94
N = 44 => 17
N = 45 => 196
N = 46 => Mismatched Braces
N = 47 => 149
N = 48 => No Termination
N = 49 => No Termination
N = 50 => Mismatched Braces
N = 51 => Mismatched Braces
N = 52 => 45
N = 53 => 77
N = 54 => 45
N = 55 => 77
N = 56 => 50
N = 57 => 209
N = 58 => 50
N = 59 => 251
N = 60 => 249
N = 61 => 99
N = 62 => 99
N = 63 => 117
N = 64 => 89
N = 65 => 207
N = 66 => 89
N = 67 => 115
N = 68 => 115
N = 69 => 115
N = 70 => 95
N = 71 => Mismatched Braces
N = 72 => Mismatched Braces
N = 73 => 104
N = 74 => Mismatched Braces
N = 75 => No Termination
N = 76 => No Termination
N = 77 => No Termination
N = 78 => No Termination
N = 79 => Left Overflow
N = 80 => 3
N = 81 => 2
N = 82 => No Termination
N = 83 => Mismatched Braces
N = 84 => No Termination
N = 85 => 133
N = 86 => 133
N = 87 => 0
N = 88 => Mismatched Braces
N = 89 => 158
N = 90 => 0
N = 91 => 4
N = 92 => Mismatched Braces
N = 93 => 0
N = 94 => 158
N = 95 => Mismatched Braces
N = 96 => 0
N = 97 => 157
N = 98 => 159
N = 99 => None

合計37の一意の出力があります(数値順)。

0, 1, 2, 3, 4, 11, 13, 17, 45, 46, 50, 51, 57, 59, 77, 84, 89, 94, 95, 99,
100, 104, 115, 117, 129, 133, 147, 148, 149, 157, 158, 159, 166, 187, 188, 
196, 206, 207, 209, 211, 249, 251, 255

私はこのソリューションが最適はないことを90% 100%確信していますが、それが非常に難しいことを証明しています。明確なことがいくつかあります。全く持っていない.最後の文字までのシンボルは思わ移動するための方法であることを、そして角括弧は、( [])ではなく役に立たないように見えます。ここで少し考えましたが、概要を説明します。

させるL(チャレンジのバイトのコードの長さ100)、およびnサブプログラムのユニークな出力の数です。

の場合L=3、形式の最適解がいくつかあります+-.。ここでn=2(この場合、出力は+.との-.それぞれ1と255です。)これにより、の最適な比率が得L = 3られn/L = 66.67%ます。この比率は少なくともforられないことに注意してくださいL<10

のためL=10に、ソリューションはそれをブルートフォースするのに十分簡単です。最適なソリューションはn = 6次のとおりです。

++>-->+<+. => 6
++>-->+<+. => 6
+++>->+<+. => 6
--->->+<+. => 6
++>---><+. => 6
+++>--><+. => 6
-->++>-<-. => 6
+++>+>-<-. => 6
--->+>-<-. => 6
-->+++><-. => 6
--->++><-. => 6

これにより、スコア比はになりn/L = 60%ます。

のようにL->infinity、潜在的に無限の可能な出力は255個しかないため、比率は0に近づく必要があることは明らかですL

ただし、比率は均一に減少しません。の解を構築することは不可能であるn=6, L=9ため、の最適な比率はL=9です5/9 = 55.56% < 60%

これはどのように、質問を頼むすばやくで、何が問題なのでしょうか?以下のためにL = 100、とで10^9 checks/second、それが最適解をブルートフォースするために長い宇宙の寿命よりも数桁を取るだろう。これについてエレガントな方法はありますか?それがダウンしていることを私は非常に多くの疑問37%についてL = 100

比率は、実際には最大で増加しL=100ます。他の回答を表示して確認します。

上記のあなたの評価を聞いてみたい。私ができる結局のところ、はひどく間違っていた。

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