3: 2009-12-20 (日) 06:47:31 HOSINO |
4: 2009-12-20 (日) 08:30:58 HOSINO |
| --.< ++++++++. --------. +++. ------. | | --.< ++++++++. --------. +++. ------. |
| --------.> +. | | --------.> +. |
- | ~ | + | 前のソースが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!が理解できた人なら難なく理解できると思います。~ |
| + | +++++++++ |
| + | [>++++++++++>++++<<-] |
| + | >+++++ |
| + | >----< |
| + | [>.+<-] |
| + | 色々と最適化の余地があるので、考えてみてください。~ |