Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Brainf*ckで15パズル
Search
HN410
May 06, 2022
Programming
1.7k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Brainf*ckで15パズル
以下でも説明しています.
https://hn410.github.io/
HN410
May 06, 2022
More Decks by HN410
See All by HN410
Lex, YACC講習会
hn410
0
2.3k
Android入門
hn410
0
2.1k
計算量理論
hn410
0
2.5k
Deeplearning from almost scratch
hn410
0
2.4k
Produire
hn410
0
3.5k
Other Decks in Programming
See All in Programming
プロダクトコードからライブラリの境界を見つける
elmetal
PRO
0
110
re:Inventに行く前に知っておきたい現地参加のノウハウ
nokomoro3
0
410
Rでドレミ/Do-Re-Mi_with_R
florets1
0
130
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
180
[ハンズオン]AIへの指示だけで「五目並べ」を作ってみよう
satoshi256kbyte
1
370
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
7
13k
最近”作らせてる” ローカルAIアプリの話
akit37
0
460
RAG の “R” を Swift で覗いてみる 〜「意味から探す」検索の仕組み〜
nao_randd
0
160
contenteditable と日本語入力に向き合う
colorful12
0
190
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
22
22k
Compiling a real-world CLI tool to native with Static Hermes
tmikov2023
0
110
sbt 2.0: takeoff
eed3si9n
0
150
Featured
See All Featured
Product Roadmaps are Hard
iamctodd
55
13k
The Curse of the Amulet
leimatthew05
3
15k
GraphQLとの向き合い方2022年版
quramy
50
15k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
300
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.5k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
850
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
2
2k
Skip the Path - Find Your Career Trail
mkilby
1
250
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
730
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
480
WCS-LA-2024
lcolladotor
0
880
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
780
Transcript
BRAINF_CKで15パズル 19 HN
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をダウンロードして解凍してください。
BRAINF_CKとは…? • 難解 プログラミング言語の一つ。 • 命令が8つしかなく、非常に簡潔に構成されている。
サンプルコード • Hello world! のコード print(“Hello world!”) +++++++++[>++++++++>+++++++++++>+++>+<<<<- ]>.>++.+++++++..+++.>+++++.<<+++++++++++++++.>.+++.--- ---.--------.>+.>+.
BRAINF_CKの長所 • 命令が8つしかない→初心者にも覚えやすい • チューリング完全 • コンパイラが軽い • 文字の可読性が高くなるように考えられている •
派生言語が沢山ある • AtCoderでも使える
ATCODERで使ってみた • 問題文 X,A は 0 以上 9 以下の整数です。 X
が A 未満の時 0、A 以上の時 10 を出力してください。 • 制約 0≤X,A≤9 入力は全て整数である • 入力 X A >,>,[-],>++++++++[<------<------>>-] <<[>[ -<-[>[ -<-[>[ -<-[>[ -<-[>[ -<-[>[ -<-[>[ -<-[>[ -<-[>[ -<-[>[ ]]]]]]]]]]]]]]]]]]]] <[<] >> >+<[>-<[-]]>[+++++[>++++++++<-]>+.<] +++++++[>>+++++++<<-]>>-.
ATCODERで使ってみた
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より
BRAINF_CKの仕組み 1 2 3 4 0 0 0 0 +->>+<,.[>]+
テクニック集 • 掛け算…メモリを一つ余分に用いる (例)@の出力 方法1 ++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++. 方法2 ++++++++[>++++++++<-]>.
テクニック集 • 値のコピー?(もとの場所の値は0になるので) [>+>+<<-] • メモリの値が0のところまでジャンプ [<] or [>] •
If x [[-] if の中身] • If x=0: >+<[>-<[-]]>[- if の中身 ] • https://esolangs.org/wiki/Brainfuck_algorithms などを参照するのも良いかも
(個人的)ポイント集 • コメントを多用(処理の概要、ポインタの現在位置) • コードの可読性を重視 • 使われているメモリの管理 • 判定時などに値がリセットされるかどうかの確認 •
オーバーフローに注意(1メモリにつき1バイト) →それを利用する手も…? • コードをとにかく工夫する
15パズルをやってみましょう • ドライブ内のファイル 「15パズル.txt」…これをコピーしてインタプリタに貼ることでプレイできます。 「15パズル日本語コメ付き.txt」 …上のものに日本語の注釈が入っているものです。 コード自体は同じですが、これをインタプリタに貼ると文字化けを起こします。 「15パズル安定版.txt」 …上2つはオーバーフローを用いていますが、エラーを起こすインタプリタもある かもしれないと思い、用いないverを作りました。ちょっと無駄が増えます。
15パズルをやってみましょう • 仕様 A~Oで1~15の数を、「~」が空白部分を表しています。シャッフル機能やクリア 判定はありません。 • 操作方法 「w」…空白を上に動かす 「a」…空白を左に動かす 「s」…空白を下に動かす
「d」…空白を右に動かす
15パズルのコード • +>+>+>+>++++[>++++<- ]+>[>++++>++++>++++>++++>+>>++++>++++>++++>++++>+>>++++>++++>++++>+++ +>+>>++++>++++>++++>>+<<<<<<<<<<<<<<<<<<<<<<<- ]+>+++>++++>+++++>++++++>------ >+>+++++++>++++++++>+++++++++>++++++++++>------ >+>+++++++++++>++++++++++++>+++++++++++++>++++++++++++++>------ >+>+++++++++++++++>++++++++++++++++>+++++++++++++++++>>------ >+>+>+>+>+>+[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<--.++>--.++>--.++>--.++>.>>--.++>--
.++>--.++>--.++>.>>--.++>--.++>--.++>--.++>.>>--.++>--.++>--.++>--.++>.>>>>>>,[- >+>>+>>+>>+<<<<<<<]>>++++++++++++[-<-------->]<->+<[>-<[-]]>[>>+++++[<+++++>- ]>>+++++[<+++++>-]>>+++++[<+++++>-]<<<<<<<<<<[<]<-[[>+<-]>+<]+>[<-]>>>[>]>>- ]>>++++++++++[-<---------->]<>+<[>-<[-]]>[>>+++++[<+++++>-]>>+++++[<+++++>- ]<<<<<<<<<[<]>----------[[<+>-]<++++++++++>]++++++++++<[>----------]>>[>]>>>>- ]>>+++++++++++[-<---------->]<----->+<[>-<[-]]>[>+++++<<<<<<<<[<]>>>>>>- [[<<<<<<+>>>>>>-]<<<<<<+>>>>>>]+<<<<<<[>>>>>>-]>[>]>>>>>>-]>>+++++++++++[- <---------->]<--------->+<[>-<[-]]>[<<<<<<<<<[<]<<<<<<-[[>>>>>>+<<<<<<- ]>>>>>>+<<<<<<]+>>>>>>[<<<<<<-]>[>]>>>>>>>>-]<<<<<<<<+]
コードの説明 • 大まかな構造 1.初期設定 2.出力 3.入力とパズルの移動 4.2へループ
メモリの主な利用状況 • 1~34 …パズルのマスに対応 • 35 …キーの入力値を一時的に格納 • 36~43 …入力値の判定など
初期設定(パズルのマス) • パズルの4*4マスを6*6マスに拡張し、 中の4*4の正方形の部分をパズルのマス目 に対応させる。 • パズルのマス目にはパズルの番号+66 (ASCIIでA~Oの文字コード値+2に対応)、 右端には10(改行コード)、空白は0(参 照しやすい)、その他は1(1を引いて0に
すればif判定しやすい)を代入する。 →現在地±1、6が上下左右に対応し、かつ、 端にあるかどうかの判定も楽にできる。
初期設定 +>+>+>+>++++[>++++<-]+> [>++++>++++>++++>++++>+> >++++>++++>++++>++++>+> >++++>++++>++++>++++>+> >++++>++++>++++>>+ <<<<<<<<<<<<<<<<<<<<<<<-]+ >+++>++++>+++++>++++++ >------>+>+++++++>++++++++>+++++++++>++++++++++ >------>+>+++++++++++>++++++++++++>+++++++++++++>++++++++++++++
>------>+>+++++++++++++++>++++++++++++++++>+++++++++++++++++ >>------>+>+>+>+>+>
出力 • メモリのうち、パズルのマスに対応する部分と改行コードを出力する。 • このとき、パズルのマスに対応する部分は値を一旦ー2してから出力する。 →空白の部分を出力するため。(このとき、アンダーフローが起きて値は126になり、 チルダが出力される。) • アンダーフローを防ぐなら、パズルのマスには1~15を初期設定で入力しておき、出 力の際のみ毎回64を足すという方法もあるが…
出力 <<<<<<<<<<<<<<<<< <<<<<<<<<<<<<<<<<<< パズルのマスの先頭まで移動 --.++>--.++>--.++>--.++>.>> --.++>--.++>--.++>--.++>.>> --.++>--.++>--.++>--.++>.>> それぞれ一旦2を引いて出力し、また2を足して戻す。 --.++>--.++>--.++>--.++>.>> 改行コードの部分はそのまま出力
>>>> メモリ35まで移動して判定へ
入力と判定 • 入力はa(文字コード97)、d(文字コード100)、s(文字コード115)、w(文字コー ド119)のみ想定。それ以外の入力には、何の操作もしない。 1.入力値を4つのメモリにコピー 2.文字コードの若い順に処理する。入力値(をコピーした値)から97を引き、0だったら左移 動の可能性。 3.空白の左が欄外かどうか判定。1を引いて0になるかどうか調べればよい。0でないなら左の 値を現在空白のところにコピー。 4.これをd、s、wで繰り返す。
入力と判定(Aの部分だけ抜粋) +[-,[->+>>+>>+>>+<<<<<<<] 入力値を4つのメモリに切り取りコピー >>++++++++++++[-<-------->]<- ↑のうち一つから97を引く >+<[>-<[-]]>[ それが0ならインデント内実行 …☆ >>+++++[<+++++>-] >>+++++[<+++++>-]
>>+++++[<+++++>-] ↑でコピーした残りの3つ値に十分大きな値をいれてオーバーフロー防止 <<<<<<<<<<[<] 0(パズルの空白)まで飛ぶ <-[ 左の値が0じゃない(=欄外じゃない)ならインデント内実行 …※ [>+<-]>+<] パズルを移動 +>[<-]>>>[>] ※のときに左が欄外だった時、1だった値が0になっているので戻し、メモリ35まで飛ぶ >>-] ☆のときのifの残骸処理
入力と判定部分の注意 ・dが押されたときの判定。値の右が欄外の時、そこのメモリの値は1でなく10なので、そこ も変わる。 >>++++++++++[-<---------->]< >+<[>-<[-]]>[ >>+++++[<+++++>-] >>+++++[<+++++>-] <<<<<<<<<[<] >----------[ [<+>-]<++++++++++>]
++++++++++<[>----------]>>[>] >>>>-]