3: 2009-12-20 (日) 06:47:31 HOSINO[6] [7] | 4: 2009-12-20 (日) 08:30:58 HOSINO[6] [8] | ||
---|---|---|---|
Line 187: | Line 187: | ||
--.< ++++++++. --------. +++. ------. | --.< ++++++++. --------. +++. ------. | ||
--------.> +. | --------.> +. | ||
- | ~ | + | 前のソースが373文字(スペース、改行を除く)だったのに対して、今回は217文字にまで減らせました。~ |
+ | (それでもHQ9+の1文字には全然届きませんが…)~ | ||
+ | 3行目の4番目のブロックまでは前回と同じです。~ | ||
+ | ここで、>命令が実行されています。~ | ||
+ | これによって、レジスタはメモリの1番地をさすようになります。~ | ||
+ | メモリの1番地の値はこのとき0ですが、これを4行目の4番目のブロックまでで,の文字コードである44にして出力します。~ | ||
+ | 5行目の1番目のブロックでスペースを出力した後、レジスタの値を1減らしています。~ | ||
+ | これで再びレジスタはメモリの0番地をさすようになり、そこにはoの文字コードである111が入っています。~ | ||
+ | 今度はそれをいじって文字を出力していき、最後にもう一回1番地の値をいじって!を出力させて終了です。~ | ||
+ | 少しはましになりましたが、まだまだカッコイイとは言えないソースです。~ | ||
+ | もうちょっと工夫を加えてみます。~ | ||
+ | +++++++ [>++++++++++<-] >++. | ||
+ | ++++++++++ ++++++++++ +++++++++. +++++++. . +++.> | ||
+ | ++++ [>++++++++++<-] >++++. | ||
+ | ---------- --.<< | ||
+ | ++++++++. --------. +++. ------. --------.>> | ||
+ | +. | ||
+ | これで152文字にまで減らすことが出来ました。~ | ||
+ | ソース自体も、[や]が加わったことでBrainf*ckらしいカッコよさが出てきました。~ | ||
+ | 今までは72を作るときに、1+1+1+1+(中略)+1=72と考えていました。~ | ||
+ | この考えを捨てて、10*7+2=(1+1+1+1+1+1+1+1+1+1)*(1+1+1+1+1+1+1)+1+1=72として計算したのが上のソースです。~ | ||
+ | まず最初に、0番地の値を7にします。~ | ||
+ | 0番地の値は7なので[は素通りして、>でレジスタは1番地をさします。~ | ||
+ | 1番地の値に10を足した後、<で0番地へもどり、1を引きます。~ | ||
+ | それでもまだ値は6なので[へもどり、さらに1番地に10を足します。~ | ||
+ | また、0番地の値を1減らしますが、まだ5なので[へもどります。~ | ||
+ | これを繰り返すと、1番地の値が70になったときに0番地の値が0になり、ようやく]の次へ進みます。~ | ||
+ | それに2を足すので72になり、無事にHが出力されます。~ | ||
+ | 2行目の最後でoを出力した後も、同じ要領で4回ループさせ、3番地の値を40にします。~ | ||
+ | それに4を足して44にし、,を出力します。~ | ||
+ | 4行目と5行目の最後が<<と>>になっているのは、2回目のループでカウンタとして使った2番地を飛び越えるためです。~ | ||
+ | 最後に、Brainf*ckのカッコよさが最大限に発揮されたHello, world!を書きます。~ | ||
+ | +++++++++ | ||
+ | [>++++++++>+++++++++++>+++++<<<-] | ||
+ | >. | ||
+ | >++.+++++++..+++. | ||
+ | >-.------------. | ||
+ | <++++++++.--------.+++.------.--------. | ||
+ | >+. | ||
+ | 119文字、という事は、最初のプログラムの1/3以下という事です。~ | ||
+ | 簡単に解説すると、最初に0番地をカウンタにして9回ループさせます。~ | ||
+ | このループで1番地が72、2番地が99、3番地が45になります。~ | ||
+ | 後は、1番地を使ってHを、2番地を使って、e、l、l、o、w、o、r、l、dを、3番地を使って,、 、!を出力させるだけです。~ | ||
+ | ***echoプログラムを作る! [#m858ccb4] | ||
+ | g01アプリをabcdwを使って学んだ人なら誰でも知っているechoプログラムを製作します。~ | ||
+ | とはいいつつも、ものすごく簡単なので説明は省きます。~ | ||
+ | +[>,.<] | ||
+ | これさえあれば、一時的にコンソールにメモをすることが出来ます。~ | ||
+ | |||
+ | ***charsプログラムを作る! [#r0398d88] | ||
+ | 同じくabcdwでおなじみのcharsプログラムです。~ | ||
+ | 0x20~0x7eの文字コードを持つ文字を出力させます。~ | ||
+ | これも、最終段階のHello, world!が理解できた人なら難なく理解できると思います。~ | ||
+ | +++++++++ | ||
+ | [>++++++++++>++++<<-] | ||
+ | >+++++ | ||
+ | >----< | ||
+ | [>.+<-] | ||
+ | 色々と最適化の余地があるので、考えてみてください。~ |
(This host) = http://osask.net