Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Brainf*ckで15パズル

 Brainf*ckで15パズル

以下でも説明しています.
https://hn410.github.io/

HN410

May 06, 2022
Tweet

More Decks by HN410

Other Decks in Programming

Transcript

  1. BRAIN F_CK の始め方 • コンパイラを落としたり作ったりしてもいいですが、インタープリタを使うのが個人的には 楽です。 • 「brain fuck インタープリタ」などと検索すると有志の作ったものがいろいろ出てきます。

    • 以下、自分が用いているもの。(すべて有志の作ったものなので抵抗ある方は注意を) ・ウェブブラウザ上で動くインタプリタ(ステップ実行もでき、ちょっとしたテストには便 利) ※今回紹介するパズルのコードはまともに動かないので注意 http://www.usamimi.info/~ide/programe/brainfuck/index.html ・フリーソフト(windows用) http://www.4mhz.de/bfdev.html ページ中ほどのbfdev-1-4-7.zipをダウンロードして解凍してください。
  2. ATCODERで使ってみた • 問題文 X,A は 0 以上 9 以下の整数です。 X

    が A 未満の時 0、A 以上の時 10 を出力してください。 • 制約 0≤X,A≤9 入力は全て整数である • 入力 X A >,>,[-],>++++++++[<------<------>>-] <<[>[ -<-[>[ -<-[>[ -<-[>[ -<-[>[ -<-[>[ -<-[>[ -<-[>[ -<-[>[ -<-[>[ ]]]]]]]]]]]]]]]]]]]] <[<] >> >+<[>-<[-]]>[+++++[>++++++++<-]>+.<] +++++++[>>+++++++<<-]>>-.
  3. BRAINF_CKの全命令 • > ポインタをインクリメントする。ポインタをptrとすると、C言語の「ptr++;」に相当する。 • < ポインタをデクリメントする。C言語の「ptr--;」に相当。 • + ポインタが指す値をインクリメントする。C言語の「(*ptr)++;」に相当。

    • - ポインタが指す値をデクリメントする。C言語の「(*ptr)--;」に相当。 • . ポインタが指す値を出力に書き出す。C言語の「putchar(*ptr);」に相当。 • , 入力から1バイト読み込んで、ポインタが指す先に代入する。C言語の「*ptr=getchar();」に相 当。 • [ ポインタが指す値が0なら、対応する ] の直後にジャンプする。C言語の「while(*ptr){」に相当。 • ] ポインタが指す値が0でないなら、対応する [ (の直後)にジャンプする。C言語の「}」に相当。 • それ以外はコメントとして無視される。 …Wikipediaより
  4. テクニック集 • 値のコピー?(もとの場所の値は0になるので) [>+>+<<-] • メモリの値が0のところまでジャンプ [<] or [>] •

    If x [[-] if の中身] • If x=0: >+<[>-<[-]]>[- if の中身 ] • https://esolangs.org/wiki/Brainfuck_algorithms などを参照するのも良いかも
  5. 15パズルのコード • +>+>+>+>++++[>++++<- ]+>[>++++>++++>++++>++++>+>>++++>++++>++++>++++>+>>++++>++++>++++>+++ +>+>>++++>++++>++++>>+<<<<<<<<<<<<<<<<<<<<<<<- ]+>+++>++++>+++++>++++++>------ >+>+++++++>++++++++>+++++++++>++++++++++>------ >+>+++++++++++>++++++++++++>+++++++++++++>++++++++++++++>------ >+>+++++++++++++++>++++++++++++++++>+++++++++++++++++>>------ >+>+>+>+>+>+[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<--.++>--.++>--.++>--.++>.>>--.++>--

    .++>--.++>--.++>.>>--.++>--.++>--.++>--.++>.>>--.++>--.++>--.++>--.++>.>>>>>>,[- >+>>+>>+>>+<<<<<<<]>>++++++++++++[-<-------->]<->+<[>-<[-]]>[>>+++++[<+++++>- ]>>+++++[<+++++>-]>>+++++[<+++++>-]<<<<<<<<<<[<]<-[[>+<-]>+<]+>[<-]>>>[>]>>- ]>>++++++++++[-<---------->]<>+<[>-<[-]]>[>>+++++[<+++++>-]>>+++++[<+++++>- ]<<<<<<<<<[<]>----------[[<+>-]<++++++++++>]++++++++++<[>----------]>>[>]>>>>- ]>>+++++++++++[-<---------->]<----->+<[>-<[-]]>[>+++++<<<<<<<<[<]>>>>>>- [[<<<<<<+>>>>>>-]<<<<<<+>>>>>>]+<<<<<<[>>>>>>-]>[>]>>>>>>-]>>+++++++++++[- <---------->]<--------->+<[>-<[-]]>[<<<<<<<<<[<]<<<<<<-[[>>>>>>+<<<<<<- ]>>>>>>+<<<<<<]+>>>>>>[<<<<<<-]>[>]>>>>>>>>-]<<<<<<<<+]
  6. 入力と判定(Aの部分だけ抜粋) +[-,[->+>>+>>+>>+<<<<<<<] 入力値を4つのメモリに切り取りコピー >>++++++++++++[-<-------->]<- ↑のうち一つから97を引く >+<[>-<[-]]>[ それが0ならインデント内実行 …☆ >>+++++[<+++++>-] >>+++++[<+++++>-]

    >>+++++[<+++++>-] ↑でコピーした残りの3つ値に十分大きな値をいれてオーバーフロー防止 <<<<<<<<<<[<] 0(パズルの空白)まで飛ぶ <-[ 左の値が0じゃない(=欄外じゃない)ならインデント内実行 …※ [>+<-]>+<] パズルを移動 +>[<-]>>>[>] ※のときに左が欄外だった時、1だった値が0になっているので戻し、メモリ35まで飛ぶ >>-] ☆のときのifの残骸処理