Brainf * ckループの問題


19

印刷するように頼むサイバークラブの問題があります。

ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!

'、'文字を使用せずに29バイト以下でBrainf ** kを使用します。

私は動作するコードを持っています:

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

ただし、ループが長すぎるため、制限を超えて16バイト送信されます。

2番目と3番目のセルを58と90に設定して、2番目のループを実行できるようにするより効率的な方法はありますか?それとも、私が見ていないだけでこれをすべて一緒に行うより良い方法がありますか?


1
あなたの質問については、4バイトしか節約しませんが、実際には5990を生成し、-.to を変更して.-を削除する方が良い>.<です。
マーティンエンダー

私は+[--->++<]>++++[.-]19バイトを取得しましたが、制御文字も出力します
...-Timtech

@MartinEnderええ、ごめんなさい、他の投稿であなたのコメントを見て、このグループがもっと適切だと思ったのを見つけました。多くの答えを生成しなかったので、SOのグループを削除します。
ニックロッド

2
私はこの「サイバークラブ」が何であるか正直に興味があります。
Sp3000

回答:


23

27 24バイト

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

1日を費やして、基本的にブルートフォーサーを作成し、結果が表示されるのを確認しました。これで、実際の作業に戻ることができます

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

コンポーネント++[<++[++<]>>>+]はテープを初期化して

[130, 0, 0, 0, 91, 59, 0]
                       ^

私たちが必要とするものにぴったりです!


8
ウィザードリィ。(∩`-´)⊃━☆゚。*・。 ゚
primo

@primo公平を期すために、前半は構造的に何が起こっているのかわかりません。独自のアルゴリズム/手法を思い付くことができるという事実は素晴らしいと思います:)
Sp3000

各ループの最後でテープ:codepad.org/ZoJUlQ8M。それがする値で終わるのはまったく直感的ではありません;またはまったくさえない;)
primo

1
代替24:+[[>++<<]>->+>+]<[-<-.>]
primo

15

30バイト

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

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

85171は、brainfuck(3-3のモジュラー逆数)で生成するのがかなり簡単です。8590にかなり近く、17117759・3)にかなり近く、ここで使用されています。ちょっとしたハッカーで、代わりに88176を作成することができます。

ただし、まだターゲットに1バイト不足しています。

その他の提案

一般に、リストを反復処理する方が短く、定数を乗算する方が他の方法よりも短いです。これは特に3つ以上の値に当てはまります。たとえば、これ:

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

次のように記述できます。

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

内部値は2つしかなかったため、この場合はそれほど改善されません。実際、リファクタリングは1バイト短くなっています。

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

1069ではなく、3023を掛けます。MartinBüttnerの提案では、これは既に38バイトにまで減っていますが、元のものに大きな変更はありません。

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

58を増やしてもっと大きな数で繰り返すことを考えたことがなかったでしょう。これははるかに効率的です。
ニックロッド

4

34バイト

11バイト節約しましたが、それでも5バイトは長すぎます...

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

私はすでに何時間も費やしましたが、うまくいけば誰かがこれを改善することができます。

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