各種サービスにおけるbrainfuck処理系について
サービスによって処理系の特性の差があるのでまとめておこうと思った。 どれも記事作製時の情報。c言語の規格がどうとか、処理系の話とバイナリの話は別だとか、そういう細かいことはあまり気にせず適当に読んでね。
bf
- http://packages.ubuntu.com/search?keywords=bf
- man
- ubuntuのaptで入る処理系のひとつ
- 普通な処理系
$ bf -h
bf - a Brainfuck interpreter version 20041219
(C) 2003, 2004, Stephan Beyer, GPL, s-beyer@gmx.net
Usage information:
./bf [-h] [options] inputfile
Available options:
-c<num> specify number of cells [9999]
-i show used code input (stderr)
-n translate input: 10 (\n) to 0
-w disallow decrementing 0 and incrementing 255
-,<mode> set input mode: 0-4 [0]
See the bf(1) manpage for more information.
Have fun!
- c言語製
- cellは8bit (
char
) - EOFは$-1$
- wrap-aroundする
- opiton
-w
でdisallowできる
- opiton
- 負番地の読み書きは不可
- 規定のcell数が$9999$と少ない
- cheatは難しい
- 中で命令を構造体にencodeして保持
- unmatchedな
]
は怒られない- 先頭付近に跳ぶっぽい変な挙動をする
- jumpが発生しないなら素通り
- unmatchedな
[
は怒られるError: Out of range! You wanted to '>' beyond the last cell.
という、なにか違うこと検出し停止する- jumpが発生しないなら素通り
- 最適化はほぼない
- 連続する
+-
や<>
はある程度まとめられる
- 連続する
採用サービス
- AtCoder
- http://atcoder.jp/
- 競技プログラミングのサイト
- 日本語
Ubuntu 14.04.4 LTS
trusty
- beginner contestのA問題B問題あたりはbrainfuck向けの問題が多い
- バイナリはubuntuのrepositoryから入手可能
- HackerRank
- https://www.hackerrank.com/
- 競技プログラミングのサイト
Ubuntu 14.04.4 LTS
trusty
- wrap-aroundがoption
-w
を使って禁止されている - バイナリはubuntuのrepositoryから入手可能
BFI
- http://esoteric.sange.fi/brainfuck/impl/interp/BFI.c
- すごくシンプルな処理系
- cheatで遊べる
* Program Name: BFI
* Version: 1.1
* Date: 2003-04-29
* Description: Interpreter for the Brainfuck Programming Language
$ bfi [<program file> ...]
- c言語製
- cellは32bit (
int
) - EOFは$-1$ (
EOF
) - wrap-aroundする
- 特に最適化はない
- 負数に
[-]
するとTLEなので注意
- 負数に
- 負番地の読み書きは可能
- cheat可能
- codeは
char p[]
として無加工で保持 - unmatchedな
]
は先頭に跳ぶ (anagol)- 例:
+++<---]>.>\x03ABC.>.
はABC
を出力 - code領域の範囲を越えて
[
を探しにいく $esp
より低位な部分に[
がひとつだけ置いてあるのが原因- 実行環境に強く依存する
.
によりputchar
を呼ぶと壊れて使えなくなる,
のgetchar
なら壊れない
- jumpが発生しないなら素通り
- yukicoderでは使えないようだ
- 単独の
.
や.
を踏んだ程度ではだめ
- 単独の
- 例:
- unmatchedな
[
はsegmentation fault- jumpが発生しないなら素通り
- data領域の左側にcode領域がある (anagol, yukicoder)
- 例:
+[<++ABC]:,:,:,
はCBA
を出力
- 例:
- 提出したcodeの右端には$-1$ (code読み込みの際の
EOF
)- 例:
+[<+]<.<.<.ABC
はCBA
を出力
- 例:
- 環境が分かっていればropも可能
- codeは
採用サービス
- Anarchy Golf
- http://golf.shinh.org/
- code golfのサイト
- 通称 “golf場”
- cheatが可能
- むしろ推奨される
- 普通に書いた際の記録の上書きされて消えるのを避けるためか、
(cheat)
とか名前に付けて示す人は多い
- 普通に書いた際の記録の上書きされて消えるのを避けるためか、
- 例:
<+]<[.<-]"emspx!-pmmfH
でHello, world!
を出力 (22byte, http://golf.shinh.org/p.rb?hello+world) - バイナリは入手可能
- Performance checkerからbashで
base64 /golf/local/bf
- libcも取れる
- Performance checkerからbashで
- pwnable
- むしろ推奨される
- Yukicoder
- http://yukicoder.me/
- ゆるふわな競技プログラミングのサイト
- cheatが可能
- 推奨されるかどうかは知らない
- 例:
-[<+]<[.<-]"emspX!pmmfH
でHello world!
を出力 (23byte, http://yukicoder.me/submissions/85536) - バイナリは入手可能
- 新規問題、#NNNNNを想定解として出力ケースを生成、を使う
- この上でdebugは可能だが、gdbで使えない機能がある
- 新規問題、#NNNNNを想定解として出力ケースを生成、を使う
- 64bitな都合上、pwnは厳しい
- https://twitter.com/yukicoder/status/716281465684627458
bff
- https://github.com/apankrat/bff
- ideoneで採用されている処理系
$ bff --help
bff: moderately-opimizing Brainfuck interpreter, 1.0.6, http://swapped.cc/bff
Usage: bff [<program file> [<input data file]]
- c言語製
- cellは32bit (
int
) - EOFは変
argv[2]
として渡されたファイルを読んでいるなら $0$ (0
)- 標準入出力から読んでいるなら$-1$ (
EOF
)
- wrap-aroundする
- 負番地も使用可能
- 最適化はすこし
[-]
や[+]
の特殊化- change logには1.0.6からとあるが実際は1.0.5の途中から
- 連続する
+-
や<>
はある程度まとめられる [>+<-]
の最適化はない- 負数にやるとTLEなので注意
- “moderately-opimizing” とは
- cheatはおそらく不可能
- unmatchedな
[
]
は実行前にちゃんと検出 - 負番地には対応
- 中で命令を構造体にencodeして保持
- unmatchedな
採用サービス
- ideone
- http://ideone.com/
- onlineでコードを実行できるサービス
- bff-1.0.5
[-]
や[+]
の特殊化あり
- バイナリは入手できなさそう
- CodeIQ
- https://codeiq.jp/
-
実務スキル評価サービス
- 日本語
- bff-1.0.3.1
- data領域の初期化忘れのbugが残っている
- 裏側にideoneの企業版を利用
- バイナリは入手可能
- 実行くんからbashで
base64 /usr/bin/bff
- 実行くんからbashで
各種サービスにおけるbrainfuck処理系について
- Sun Mar 27 04:44:02 JST 2016
- バイナリ取れるあたりのことを追記
- Mon Apr 4 15:23:20 JST 2016
- yukicoderにbrainfuckが追加されたので追記
- ついでにanagolのunmatchedな
]
をきちんと調べた
- Mon Dec 5 10:13:11 JST 2016
- bfのcell数が少ないことを明記