読者です 読者をやめる 読者になる 読者になる

【Programming】Brainf*ckでFizzBuzzを書いてみる

Programming

先日、こんな記事を書きました。
【Programming】標準C++正規表現の勉強としての派生言語 - 奇跡のヌードル帝国

僕としてはC++正規表現を使ってみようぜHAHAHA、ぐらいの軽い気持ちだったのですが、この記事にTwitterでこんなツッコミが入りました。

凄くめんどくさいのですが、なるほど、もっともです。

もっともなので僕は書かざるを得ませんでした。
恐ろしい事にこのツッコミには恐らく「Googleなど使わずに自力で実装できるよね?」みたいなニュアンスを内包しています。
一方僕はと言えばBrainf*ckについては初心者を語るのも烏滸がましい状態です。
「もう二度とこんな軽率な記事は書かねえ」と固く心に誓いながら約1週間、配列と分岐に苦しむことになるのでした・・・

ところで、もしBrainf*ck FizzBuzzなんかの検索で僕の記事に来られた人がおられるなら、多分目的とされる記事は上のうさぎさんが詳しく解説しておられるので、そちらをご覧になることをお勧めします。

solorab.net


FizzBuzzっていうのはなんなのさ、っていう人はこちらをどうぞ。
Fizz Buzz - Wikipedia


さて、例の彼に対してゆるふわな僕は1037byte、1Kbyteの大台に乗ってしまう長い長いコードを書き上げました。
一応79lineなので横にズラーっと書けばそうでもないかもしれませんが言い訳にもなりませんね。
最短何byteかは知りませんが、短くしろとかツッコむのはマジで勘弁してください。


とりあえず以下に示します。
これをBrainf*ckインタプリタに突っ込むと100までのFizzBuzzが出てきます。

【追記】
なんか五行目の<が一個多かったみたいです。
僕の書いたインタプリタでは指している番地が0の時<は無視されるのでたまたま動いてたみたいです。
もしマイナス番地を許容してたりループしてたりすると駄目だったようです。

Input

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

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

Output

1
2
Fizz
4
Buzz
:
:
FizzBuzz
:
:
:
98
Fizz
Buzz

なんか10の位の繰り上がりにバグがあるようで、100以上表示させようとすると数字の部分が変になりますが、勘弁してください。

簡単にコードの解説

・8行目ぐらいまでやってること
とりあえず最初はループカウンタだの文字だのを設定します。
8行目の時点でこうなってます
[10][100][0][0][0]...[0][68][105][120]
ASCIIコードでは68はD、105はi、120はxですね。文字の表示に使います。

・10~20行目ぐらいまでやっていること

0 0 0 0 0 0 0 0 0 0 0 0 0 0

こんな感じの領域を用意します。
意味的には6、6、2で分かれており、6のブロックの先頭はその位の値が表示されるかどうかのフラグです。
二つ目はその位の値ですね。
で、最初の6つが百の位、次の6つが十の位、次の2つが1の位を表します。
値が10になると次の位の値をインクリメントします。
以上。

・21~41行目ぐらいまでやっていること
ループが回るたびにFizz、Buzzを判定するカウンタを回して、それぞれ適当に処理します。

・そっから先
Fizz、Buzzが表示されなかったら数字を表示します。
多分ここめっちゃ短縮できます。


本題

で、できたBrainf*ckのコードを音ゲーマー言語に直す。

そういやこれそういうはなしだったね!!!

マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。
寺ラ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。
ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。
マ。マ。マ。マ。マ。マ。マ。ラ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。ラ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。
ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?マ?指
マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。
ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。マ?マ?ラ。マ。マ。マ。マ。マ。ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?
ラ。
寺
	ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。
	ラ。マ。ラ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。
	寺ラ?マ?ラ。マ?指マ。ラ?寺ラ。指ラ。
	寺
		寺マ?指ラ?ラ?ラ?ラ?ラ?ラ?マ。ラ?マ。ラ。
		ラ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。
		寺ラ?マ?ラ。マ?指マ。ラ?寺ラ。指ラ。
		寺ラ?ラ?ラ?ラ?ラ?ラ?ラ?マ。ラ?マ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。指ラ?ラ?
		寺寺マ?指ラ?マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。ラ。ラ。指ラ。ラ。ラ。ラ。ラ。ラ。ラ。
	指ラ?ラ?
	寺寺マ?指ラ?マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。ラ。ラ。指
	マ。
	ラ。ラ。ラ。マ。ラ。マ。マ。マ。寺ラ?マ?ラ。マ?指マ。ラ?寺ラ。指
	ラ。
	寺
		ラ?ラ?ラ?ラ?寺マ?指ラ。ラ。ラ。ラ。
		マ?ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。マ。マ。ボマ?マ?ラ。ボラ。マ。マ。ボボマ?マ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?
	指ラ?ラ?
	寺寺マ?指ラ?マ。マ。マ。ラ。ラ。指
	ラ。ラ。ラ。マ。
	ラ。マ。マ。マ。マ。マ。
	寺ラ?マ?ラ。マ?指マ。ラ?寺ラ。指
	ラ。
	寺
	ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?寺マ?指ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。ラ。
	マ?ラ。ラ。ラ。ラ。マ?マ?ボマ。マ。ラ。ラ。マ?マ?マ?ボマ。マ。マ。マ。マ。ボボマ?マ?ラ?ラ?ラ?
	指
	ラ?ラ?
	寺寺マ?指ラ?マ。マ。マ。マ。マ。ラ。ラ。指
	ラ?ラ?ラ?ラ?ラ?ラ?ラ?ラ?
	ラ?ラ?
寺
ラ?ラ?
ラ?ラ?ラ?ラ?ラ?ラ?
ラ?ラ?ラ?ラ?ラ?ラ?
ラ。ラ。マ。ラ?ラ?
寺
ラ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。
 マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。
 マ。マ。マ。マ。マ。マ。マ。マ。ボ
 マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?
 マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?
 マ?マ?マ?マ?マ?マ?マ?マ?
 ラ。寺マ?指ラ。
指
ラ。ラ。寺寺マ?指ラ。ラ。指
ラ。ラ。
ラ。ラ。マ。ラ?ラ?
寺
ラ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。
 マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。
 マ。マ。マ。マ。マ。マ。マ。マ。ボ
 マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?
 マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?
 マ?マ?マ?マ?マ?マ?マ?マ?
 ラ。寺マ?指ラ。
指
ラ。ラ。寺寺マ?指ラ。ラ。ラ。指
ラ。
 マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。
 マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。マ。
 マ。マ。マ。マ。マ。マ。マ。マ。ボ
 マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?
 マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?マ?
 マ?マ?マ?マ?マ?マ?マ?マ?

 ラ。ラ。寺マ?指
指
 ラ?ラ?
 ラ?ラ?ラ?ラ?ラ?ラ?
 ラ?ラ?ラ?ラ?ラ?ラ?
 ラ?マ?
 ラ?ボラ。
指


おしまい!!!!