レス数が1スレッドの最大レス数(1000件)を超えています。残念ながら投稿することができません。
おちゃめくらぶ掲示板
-
人は困難を乗り越えてこそ成長できる
昨日は1画面プログラムは取捨選択が重要ということを書いたにょ。
これは1画面プログラムの場合は短くしなくてはいけないからすべての面においてチープに
しがちであり、そうなるとただ短いだけのものになってしまうにょ。
そうならないためにも絶対に入れなくてはならない部分と無くても問題ない部分との
メリハリを付ける必要があるにょ。
プチコンの処理速度があればリストサイズに制限が無ければ大抵のものは簡単に作れてしまう
ために私は「1画面」という絶妙な制限が気に入っているにょ。
そして、ここで簡単に1画面に収まるサイズのものを作っても上記のようなメリハリはあまり
ないし、「1画面に収めた」という達成感も無くなるにょ。
BrainfuckインタープリタもMEMリソースから読み込んで実行するだけで画面表示は出力
命令によるもののみという非常にシンプルなものであれば1画面に収めるのは容易だからね。
それにそれだとえいださんが作ったものの単なる下位モデルのような感じなので作る意味が
なくなってしまうにょ。
リスト短縮テクニックにおいてはすでにTipsコーナーに多くまとめているけどこれはすべて
リスト短縮の必要性があったからこそ生まれたテクニックであり、簡単に1画面に収まるような
ものでは新しいテクニックは生み出せないにょ。
したがって、「この行をあと1文字削らないといけない」という状況下を作らないと技術向上は
望めないレベルになっているということにょ。
これは1画面プログラムにおいてだけの話ではなくどんなジャンルのことでも同じだけど自分で
簡単にできることはいくらやっても成長には繋がらないからね。
壁を乗り越えることによって成長できるにょ。
さて、昨日のPetit Brainfuckにおいて新しい整数化の方法を思いついたと書いたのだけど
それが具体的にどんなものかを書いていくにょ。
通常はプチコンで整数化を行いたい場合はFLOOR関数を使うことになるにょ。
しかし、これは一般的なBASICで多く使われているINTよりも長くて残念な部分といえるにょ。
とはいうもののFLOORを使わなくても別の方法で整数化は可能にょ。
ビット演算子 OR を使う → 0 OR A (0とORの間のスペースは省略可能)
剰余(%)を使う → A-A%1
これに続いて今回思いついたのがこの方法にょ。
乗除算を使う → A/Z*Z (あらかじめZ=4096としておく)
除算でなぜ整数化ができるかというとプチコンは固定小数点による演算をしており内部では
1/4096単位で数値が記録されているためにょ。
だから4096で割ってやれば元の小数部分は無くなりそれを4096倍すれば整数化できるにょ。
注意しなくてはならないのは負の数の場合はFLOOR(-3.5)は4だけど-3.5/Z*Zは-3であるため
異なるものになってしまうことだけどこれも正の数なら問題はないにょ。
しかし、0OR Aが5文字でA/Z*Zも5文字であるためリスト短縮はできてないにょ。
それにあらかじめZ=4096としておかないといけない分だけ不利になるにょ。
とはいえ、この乗除算だけで整数化を行う方法は特定条件下ではリスト短縮の効果が期待
できるにょ。
8単位で整数化したい場合(Aの値を8、16、24、32・・・という形に丸めたい場合)は、
FLOOR(A/8)*8(12文字)、0OR(A/8)*8(10文字)に対してA/8/Z*Z*8(9文字)で1文字分
短縮できてるにょ。
これが昨日のPetit Brainfuckで使用した方法にょ。
でも、あらかじめZ=4096としないといけない分不利になるため6回以上整数化を行わないと
短縮できないにょ。
1画面プログラムでは特定行は数文字余裕があるのにある行だけ1文字分収まらないという
場合にはこの方法が有効になる場合があるにょ。
プチコンの1画面プログラムはエディタの折り返し機能がないため1行あたり29文字という
制限があるので行末がどうしても開いてしまうにょ。
その反面で1行に収まらないという行も出てしまうにょ。
2桁以上の数値(別の命令の直前ならば3桁以上の数値)が使われていれば別の変数に
入れてトータルでは長くなってもその行を縮めるということができるけどそれにも限界が
あるにょ。
また依存性のない処理を並べ替えることで上手い具合に空白を埋めてやったり、コロンが
省略できる形に持っていくことで短縮できるけどこれにも限界があるにょ。
順調にリスト短縮が進んでいたPetit Brainfuckも最後の部分で限界に達したためあきらめ
かけていたのが上記の方法によって一気に改善の方向に向かったにょ。
つまり、Petit Brainfuckはこの乗除による整数化を思いつかなかったら完成していなかった
ともいえるにょ。
この乗除による整数化は小数第1位までに丸めたいという場合はさらに大きな短縮ができて
しまうにょ。
FLOOR(A*10)/10(14文字)、0OR(A*10)/10(12文字)に対して(あらかじめZ=409.6として
おいた場合)A/Z*Z(5文字)で7文字分も縮まるからね。
あらかじめZ=409.6が必要としてもそれ単体で7文字であるため1回使えば短縮できるにょ。
しかも1回の使用であっても14文字や12文字連続して必要なものに対して5文字と7文字に
分割して使えるというのが1行29文字制限のある1画面プログラムではメリットが非常に
大きいにょ。
タネを聞いてしまえばたいしたことではないのだけどそれをひらめくかどうかというのは
プログラミングにおいては非常に重要なものとなるにょ。
1画面プログラムは1つ1つ作るごとに新しい発見があり常に新鮮な思いで作っているの
だけどそれもこうやって1つずつ壁を乗り越えていって初めて獲得できるものにょ。
やはり、人は成長をするためには困難を避けてはだめであり、困難を乗り越えていく
必要があるにょ。
|
|
|
掲示板管理者へ連絡
無料レンタル掲示板