問題タブ [brainfuck]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
1084 参照

if-statement - Brainf*ck で 2 つのセルが等しいかどうかを確認するにはどうすればよいですか?

セル #0 の値がセル #1 の値と等しいかどうかを確認するにはどうすればよいですか? 次のようなコードを書こうとしています:

私はBrainfuck compare 2 numbers as greater than or less thanを読んだ. (その解は を与えるif a < b, else.)

私は両方の値を減らす方向に沿って何かをする必要があると考えています。それらが同時に 0 に達した場合、それらは true です。しかし、私はそれについて考えるたびに同じ出口点で立ち往生し続けます.

Brainfuck で 2 つのセルが等しいかどうかを確認するにはどうすればよいですか?

0 投票する
1 に答える
244 参照

brainfuck - Brainf_ck プログラムを「スリープ」させる方法は?

Brainfuck コード/プログラムを、たとえば x 秒などの間「スリープ」させることは実際に可能ですか?

確かに、0 になるまで大きな数をループすることは、今ではあり得ませんね。おそらく、本当に信頼できるものでも、一貫したものでもありません。

0 投票する
1 に答える
962 参照

while-loop - Brainfuck での while ループの効率的な実装

codegolf.se のブレインファック アセンブラーの実装に問題があります。文字列をメモリにロードして、その長さを調べたり、文字列をn回出力したりすることができましたが、小文字以外の数字だけをメモリにロードすることはできません。それでは、いくつかの魔法を実行する次のループを見てみましょう。(ハッシュ マークはデバッグ マーカーです。)

ポインタ 512 から開始し、文字列を ascii 値として 512 以降のスポットに書き込みます。


(何らかの理由で) 小文字を削除したい場合、疑似 BF では次のようになります。

ここで私の質問は、ストレージとして 512 の右側のスペースのみを使用し、後でそれらをクリアしながら、そのような while ループを実装するにはどうすればよいかということです。

好奇心旺盛な人のために、これは私がブランファックで解決したい問題です.

0 投票する
1 に答える
216 参照

c++ - コードの長さまたはテープのサイズ:brainf... (munged)

Brainfuck では、プログラム サイズよりも長いテープ サイズを使用するのが最適ですか? それとも逆の方がいいですか?

また、お互いにどのくらいの大きさですか?

私は Arduino 用のブレイン インタープリターを作ろうとしています。これは以前にも行われたことは知っていますが、Adafruit ディスプレイやコード作成機能などを追加しています。

このため、特にコードとテープの両方を配列に格納しているため、コードは非常に長くなります。

メモリは少なくとも 30000 個のセルで構成する必要があります。一部の既存の頭脳明晰プログラムにはそれ以上のセルが必要なため、これは構成可能または無制限にする必要があります。

30000 個のセルを Uno に収めることは決してできないことはわかっていますが、動的メモリが最大のスペースを確保する方法のようです。これを行う方法は何でも感謝します。

現在、「1,807 バイト (88%) の動的メモリ」を使用していますが、それは単なるインタープリターのスケッチですchar code[512] = {};byte tape[1024] = {};そこにもいくつかのコードを押しつぶす必要があります。コードは、興味のある人のためにここにあります。

0 投票する
2 に答える
197 参照

parsing - Rustでbrainf * ckコードをツリーに解析する

Rust で最適化ブレインファック コンパイラを作成しようとしています。現在、トークンはフラットなベクトルに格納されていますが、これは機能しますが、構文ツリーを使用するように変更するのに問題があります:

私が理解するのに苦労しているのは、[コマンドの処理方法です。コード内の現在の実装は、私が試したいくつかの実装のうちの 1 つですが、すべて失敗しました。Rust の を使用する必要があると思いますが、それがBoxどのように使用されているのかよくわかりません。

コマンドを処理するブランチ[はおそらく完全に間違っていますが、どうすればよいかわかりません。ベクトルを含む (列挙Loop型のバリアント) をベクトルにプッシュします。問題は、そのベクトルの変更可能な借用を取得することです。これは、ステートメントが実行することになっています。TokentokensLoopif let

ブロックnewtokensの最後まで存続しないため、コードはコンパイルに失敗します。if let内部のベクトルへの変更可能な参照を取得してLoop、それに設定tokensすることは可能ですか? そうでない場合、代わりに何ができますか?

0 投票する
1 に答える
194 参照

c - Brainfuck 通訳の問題

私は C が初めてです。現在、Brainfuck インタープリターを作成しようとしています。私はこれまでにこれを試しました。

ループなしでのみ機能します(「[」および「]」)。試してみると:

それは私に出力を与えます

期待される出力:

0 投票する
1 に答える
124 参照

algorithm - 難解なプログラミングと私の分析

最近、難解なプログラミング言語に関する質問に遭遇しました。その言語のツールがあります。

そこで、この言語で、2 つの数値 a と b を入力し、それらを cell0 と cell1 に入れ、この 2 つの数値の合計を出力するプログラムを作成する必要があります。追加の要件があります(私が問題を抱えていました)が、プロセスの後に3つのセルが必要であり、セル0はaを保持し、セル1はbを保持し、セル2はa + bを保持します。

これが私の分析です。セル3に合計を入れて印刷する方法を見つけるのは簡単だと思い;>;<[->>+]>[->+]>:ました。ただし、この方法では、処理後、cell0 と cell1 はすべて a と b ではなく 0 を保持します。だから私はそれを達成するために上記のツールを使用する方法を見つけようとしていました.ツールを考えると、それはバッテリーのようなものです.1つのバッテリーから別のバッテリーにエネルギーを移動することしかできませんが、あるバッテリーから別のバッテリーにエネルギーをコピーすることはできません. . もしそうなら、セル0とセル1を保存しようとしている間、合計を取得することはできません.

私の質問の下にある@ user3386109コメントの情報に感謝します。「エネルギーバランス」をごまかす方法があることに気づきました。ループ内で 2 つ以上のセルをインクリメントできます。したがって、5 つのセルを使用し、最初のセルと 2 番目のセルの a と b を合計演算を実行しながら 4 番目と 5 番目のセルに転送します。したがって、私のアルゴリズムは次のようになります。

最後に私のコードは次のとおりです。

しかし、そうではありません。何度か確認しましたが、バグを見つけることができませんでした。誰か助けて?どうも!!!

0 投票する
1 に答える
209 参照

c++ - std::map でコードが肥大化するのはなぜですか?

私の最新のレクリエーション プロジェクトは、C++ で頭脳明晰インタープリターを作成することです。それは簡単でしたが、今日はコンパイルのステップで追加することにしました。最終的な目標は、実行可能ファイルを作成できるようにすることですが、現時点では、いくつかの基本的な最適化が行われています。たとえば、+++++ は 5 つの add 1 コマンドから単一の add 5 に変換されます。

これはうまく機能しますが、ストリップ後の実行可能ファイルのサイズが 9k から 12k になっていることに気付きました。いくつかの調査の後、以下の機能、特にマップが原因であると判断しました。私はなぜなのか理解していない。

マップの鍵は、8 つの有効な Brainfuck オペレーションの 1 つです。関数は入力文字列を調べて、これらの有効な文字を探します。無効な文字は、Brainfuck 仕様に従ってスキップされます。見つかった場合、そのキーのマップ値を最適化を行う makeop という関数に渡し、それを op 構造体に変換して、インタープリターが実際に実行する命令のベクトルに追加します。

op 構造体には 2 つのメンバーがあります。8 つの操作の 1 つを表す uint8_t と、オペランドを含む 1 つの int に基づくスコープ付き列挙型である Opcode。(今のところ 1 つのオペランド。将来のより洗練されたバージョンでは、複数のオペランドを持つ命令が含まれる可能性があります。) したがって、上記の +++++ の例では、構造体には Opcode::INCR と 5 が含まれます。

したがって、各マップ エントリの値は、Opcode とオペランドの数で構成される std::pair です。一般的なデータ構造ではある程度のオーバーヘッドが避けられないことはわかっていますが、上記の説明の単純さを考えると、3k は少し過剰だと思いませんか?

それとも、これは私の目的を効率的に達成するための正しいアプローチではないでしょうか? しかし、std::map でない場合、どのデータ構造を使用すればよいでしょうか?

アップデート:

回答してくれたすべての人に感謝します。まず、私の動機について一言。私は日常業務で C++ をあまり使用しません。だから私は自分の知識を鋭く保つためにいくつかのレクリエーションプロジェクトを行っています. 絶対に最小のコードサイズを持つことは、たとえば明快さほど重要ではありませんが、肥大化やそのようなことがどのように起こるかを学ぶことは私にとって興味深いことです.

与えられたアドバイスに従って、私の関数は次のようになります。

再コンパイルしましたが...何も起こりませんでした。マップを含む別のメソッドがあり、(現在は削除された?) 応答で、マップのインスタンス化だけでコードを追加するのに十分であることが示唆されたことを思い出しました。そのため、そのマップを配列に変更して、再度コンパイルしました。今回は、実行可能ファイルの削除されたサイズが 12280 から 9152 になりました。