現在やっていることは
ルートの計算なんですけど
ちょっと行き詰ってました
現時点で100以下の数値のルートは求めれるんですけど
(1以下の数値は有効な桁が少なくなりますが、たぶん求められる)
100以上の数のルートをどうやって計算しようかと
1e+3以上1e+5以下なら求める数字を1e+5で割って解を1e+3で割って
ちなみに1e+xとは10のx乗のことです
1e+3は100。1e+5は10000です
ちょうど1e+(2n+1)以上1e+(2n+3)未満になるように
再帰的な解決の仕方をしようと考えていたんです
でも、再帰で解こうとしたのが誤りで
結局繰り返しで解くことにしました
解を求める数字が100以上なら100で割り返り値Bにする変数に10掛けます(初期値1.0)
更に100以上なら同じ計算を続けます
何回か100で割った数値を返り値A
何回か10で割った数値を返り値Bとします
返り値Aのルートを求めて返り値Bをかけると、計算の出来上がり
1.0より小さい数も似たような計算で処理します
やっぱ僕は再帰苦手やわー
処理の全貌がつかみ難いのが苦手です
後、処理を書いてからサブルーチンに分割しようとしたのも敗因です
いきなりサブルーチンを書いてくっつけるのも良い手段ですね
ちなみにこの処理はまだメモを書いただけで
これから処理を書く予定です
2012年1月23日月曜日
2011年12月4日日曜日
ルートの計算。その1
自費出版予定の書籍にはルートを求めるプログラムを載せようと思い
何カ月か前に書いてました
しかーし!しばらく放っておいたら何書いてるかわからんw
とりあえず載せますが
更に改良してる版もあり
未完成版ですが
コレ載せるとまたやる気出るかもってかんじでよろしく!
何カ月か前に書いてました
しかーし!しばらく放っておいたら何書いてるかわからんw
とりあえず載せますが
更に改良してる版もあり
未完成版ですが
コレ載せるとまたやる気出るかもってかんじでよろしく!
| use strict; use warnings; #expression:式 my $expression=3; my $ret01=&in_calc(0,1); my $ret02=&in_calc($ret01,0.1); my $ret03=&in_calc($ret02,0.01); my $ret04=&in_calc($ret03,0.001); my $ret05=&in_calc($ret04,0.0001); my $ret06=&in_calc($ret05,0.00001); my $ret07=&in_calc($ret06,0.000001); sub get_mul{ # これ以下で大きい数値 my $exp01=$_[0]; # 計算の単位 my $unit01=$_[1]; # 返り値用 1:大きい 0:等しい -1:小さい my $is_big=0; my $cmp=$unit01*$unit01; if ($exp01>$cmp){ $is_big=1; } elsif ($exp01==$cmp){ $is_big=0; } else { $is_big=-1; } $is_big } sub in_calc{ # 計算結果を入れる my $exp01=$_[0]; # 計算の単位 my $unit01=$_[1]; # 返り値用 my $ans01=0; # 乗算の基 my @for_mul; for (0..9){ $for_mul[$_]=$exp01+($_*$unit01); } # 乗算の基を2乗 my @of_mul; for (0..9){ $of_mul[$_]=$for_mul[$_]*$for_mul[$_]; print "i:$for_mul[$_]:i*i:$of_mul[$_]\n"; } # X以下で大きい数値を求める for (0..9){ if ($of_mul[$_]<=$expression){ $ans01=$for_mul[$_]; } } print "解の候補:$ans01\n"; $ans01; } |
2011年11月22日火曜日
NのY乗。経験値と能力のUP
ここでいう経験値と能力とはリアルのことではありません
RPGとかSRPG(ゲーム)の世界の中の経験値と能力のことです
敵と戦って経験値を取得してLVが上がれば能力が上がって強くなるのです
LVが上がると、次にLVを上げるのに必要な経験値は増えますが
一般的にLVを上げるのに必要な経験値は(LV*X)の2乗みたいです
LVが上がる時に上がる能力値は一定みたいです
能力値=LV*Xですね
僕は簡単なGAMEしか作ったことがないですが
僕はLVが上がるのに必要な経験値はXのLV乗にしたいんです
例えば
LV1の場合、X*1.2
LV2の場合、X*1.44
LV3の場合、X*1.584
LVZの場合、X*(1.2のLV乗)
って具合に
能力値もLV*Xではなく
LVNの場合、Y*(1.1のLV乗)
にしたいんです
一般的なRPGやSRPGの場合
LVがある程度上がってくると
能力はそんなに伸びなくなりますが
そこでもグングン値を伸ばしたいんです
GAMEをしはじめの頃のLVが上がればスッゲー強くなる感覚を
常に表現したいんです
そこでX*(1.1のN乗)という概念を打ち立ててみました
ちなみにこの計算式を思いついたのは
魔界戦記ディスガイアというGAMEで
武器の価格が倍になると、強さが1.2倍になるー。すげー。と思い
パクッたんですがw
それは中盤までで
中盤以降は価格が(武器のランク*X)の2乗で
強さが武器のランク*Xっぽくなってきます
ですが僕は武器の価格も能力も
LVUPに必要な経験値もキャラクターの能力も
X*(1.1のN乗)なGAMEの構想を考えています
なら、どうでもいいことばかり考えないでプログラミングしれって?
そうですね
でもなかなか長続きしないんです。ごめんちゃい
RPGとかSRPG(ゲーム)の世界の中の経験値と能力のことです
敵と戦って経験値を取得してLVが上がれば能力が上がって強くなるのです
LVが上がると、次にLVを上げるのに必要な経験値は増えますが
一般的にLVを上げるのに必要な経験値は(LV*X)の2乗みたいです
LVが上がる時に上がる能力値は一定みたいです
能力値=LV*Xですね
僕は簡単なGAMEしか作ったことがないですが
僕はLVが上がるのに必要な経験値はXのLV乗にしたいんです
例えば
LV1の場合、X*1.2
LV2の場合、X*1.44
LV3の場合、X*1.584
LVZの場合、X*(1.2のLV乗)
って具合に
能力値もLV*Xではなく
LVNの場合、Y*(1.1のLV乗)
にしたいんです
一般的なRPGやSRPGの場合
LVがある程度上がってくると
能力はそんなに伸びなくなりますが
そこでもグングン値を伸ばしたいんです
GAMEをしはじめの頃のLVが上がればスッゲー強くなる感覚を
常に表現したいんです
そこでX*(1.1のN乗)という概念を打ち立ててみました
ちなみにこの計算式を思いついたのは
魔界戦記ディスガイアというGAMEで
武器の価格が倍になると、強さが1.2倍になるー。すげー。と思い
パクッたんですがw
それは中盤までで
中盤以降は価格が(武器のランク*X)の2乗で
強さが武器のランク*Xっぽくなってきます
ですが僕は武器の価格も能力も
LVUPに必要な経験値もキャラクターの能力も
X*(1.1のN乗)なGAMEの構想を考えています
なら、どうでもいいことばかり考えないでプログラミングしれって?
そうですね
でもなかなか長続きしないんです。ごめんちゃい
2011年11月21日月曜日
8n+x? その2
8n+x?の記事は、何がやりたいかというと
LVが8上がるごとにclassが上がる処理なんですね
ただ1から9回上がるとclassが上がり
その後は8回上がるごとにclassを上げたいんです
で、ちょっと試行錯誤しながらやってみたら
スッキリになりました
Perlに翻訳してみました
HSPとPerlは剰余の挙動が違ってあんまりスッキリ書けませんでした。ガックリw
0~99を
0x+7,0x+8,1x+1,~,1x+8,2x+1~
とするのではなく
0x-1,0x+0,0x+1,~,0x+8,1x+1~
としてみました
Xn+YのYが-1~8になるのがポイントです
Yが0か1になるのはXが0の時だけなので
そこだけ条件分岐すればいいですね
Xn+YのYが-1と0の値があるのが考えてみた結果です
_input-2になっているのは
Xn+Yが(X+1)n+Yに桁あがりするのは8n+2だからです
0~7が0X+Yで8~15が1X+Yではなく
0~9が0X+Yで10~17が1X+Yなのです
(9-2)/8=0で(10-2)/8=1なんですよね
2引いた効果です
¥8+1になっているのは
Xn+YのYが0~7ではなく1~8にしたいからです
0~7に+1すると1~8になりますよね
この2点は出力を見ながら調整しました
Xn+(y1~y2)の数値を得たい時は
幾らか引いてnで割ればXが得られる
幾らか引いてnの剰余を得てそれに幾らかを足せば(y1~y2)の間の値を得られる
nで割ることと、nの剰余を計算することの2点を抑えれば
出力を見ながら調整すれば求められるのではないでしょうか
この記事と前の記事のスクリプトをPerlに翻訳するのが次のTODOです
Perlって有名だし前ver交換性がしっかりしているので
書籍に掲載する言語として優れている。と常々思っているので
LVが8上がるごとにclassが上がる処理なんですね
ただ1から9回上がるとclassが上がり
その後は8回上がるごとにclassを上げたいんです
で、ちょっと試行錯誤しながらやってみたら
スッキリになりました
| #module #deffunc get_imi_oct_int2 int _input,var p1,var p2 p2=(_input-2)/8 p1=(_input-2)¥8+1//¥の半角が表示できなくて全角になってます return #global repeat 100 x=cnt:y1=0:y2=0 get_imi_oct_int2 x,y1,y2 logmes "n:"+x+" y1:"+y1+" y2:"+y2 loop stop |
Perlに翻訳してみました
| use strict; use warnings; for my $x (0..99){ my ($y1,$y2)=&get_imi_oct_int2($x); print "\$x:$x \$y1:$y1 \$y2:$y2\n"; } sub get_imi_oct_int2{ my $x=$_[0]; my $y2=int(($x-2)/8); my $y1=$x-2; if ($y1>=0){ $y1=$y1%8+1; }else{ $y1++; } return ($y1,$y2); } |
HSPとPerlは剰余の挙動が違ってあんまりスッキリ書けませんでした。ガックリw
0~99を
0x+7,0x+8,1x+1,~,1x+8,2x+1~
とするのではなく
0x-1,0x+0,0x+1,~,0x+8,1x+1~
としてみました
Xn+YのYが-1~8になるのがポイントです
Yが0か1になるのはXが0の時だけなので
そこだけ条件分岐すればいいですね
Xn+YのYが-1と0の値があるのが考えてみた結果です
_input-2になっているのは
Xn+Yが(X+1)n+Yに桁あがりするのは8n+2だからです
0~7が0X+Yで8~15が1X+Yではなく
0~9が0X+Yで10~17が1X+Yなのです
(9-2)/8=0で(10-2)/8=1なんですよね
2引いた効果です
¥8+1になっているのは
Xn+YのYが0~7ではなく1~8にしたいからです
0~7に+1すると1~8になりますよね
この2点は出力を見ながら調整しました
Xn+(y1~y2)の数値を得たい時は
幾らか引いてnで割ればXが得られる
幾らか引いてnの剰余を得てそれに幾らかを足せば(y1~y2)の間の値を得られる
nで割ることと、nの剰余を計算することの2点を抑えれば
出力を見ながら調整すれば求められるのではないでしょうか
この記事と前の記事のスクリプトをPerlに翻訳するのが次のTODOです
Perlって有名だし前ver交換性がしっかりしているので
書籍に掲載する言語として優れている。と常々思っているので
8n+x?
こんなスクリプト(HSP)書いたんですけど
どう書けばスマートなのかがわからないw
自費出版に使う言語はPerlと決めているのでPerlに翻訳してみました
#ここ色変わらないw変だw
1+8進数みたいなかんじですけど
プログラム的には8*n+1+nみたいなかんじですけど
数学的にはどう表現するんだろうか?
8n 8n+1 8n+2みたいには表現できないint1が-(1+8n)みたいなかんじなので
8n+xみたいに表現するにはどうすべきなのだろうか?w
どう書けばスマートなのかがわからないw
while 1 if i<=9{ int1=i-1: int2=0:_break } if i<=17{ int1=i-9: int2=1:_break } if i<=25{ int1=i-17: int2=2:_break } if i<=33{ int1=i-25: int2=3:_break } if i<=41{ int1=i-33: int2=4:_break } if i<=49{ int1=i-41: int2=5:_break } if i<=57{ int1=i-49: int2=6:_break } if i<=65{ int1=i-57: int2=7:_break } if i<=73{ int1=i-65: int2=8:_break } if i<=81{ int1=i-73: int2=9:_break } if i<=89{ int1=i-81: int2=10:_break } if i<=97{ int1=i-89: int2=11:_break } if i<=99{ int1=i-97: int2=12:_break } await 1 wend |
自費出版に使う言語はPerlと決めているのでPerlに翻訳してみました
use strict; use warnings; for my $i (0..99){ my $int1=0; my $int2=0; while (1){ if ($i<=9) { $int1=$i-1; $int2=0; last; } if ($i<=17){ $int1=$i-9; $int2=1; last; } if ($i<=25){ $int1=$i-17; $int2=2; last; } if ($i<=33){ $int1=$i-25; $int2=3; last; } if ($i<=41){ $int1=$i-33; $int2=4; last; } if ($i<=49){ $int1=$i-41; $int2=5; last; } if ($i<=57){ $int1=$i-49; $int2=6; last; } if ($i<=65){ $int1=$i-57; $int2=7; last; } if ($i<=73){ $int1=$i-65; $int2=8; last; } if ($i<=81){ $int1=$i-73; $int2=9; last; } if ($i<=89){ $int1=$i-81; $int2=10; last; } if ($i<=97){ $int1=$i-89; $int2=11; last; } if ($i<=99){ $int1=$i-97; $int2=12; last; } last; } print "\$i:$i \$int1:$int1 \$int2:$int2\n"; } |
#ここ色変わらないw変だw
1+8進数みたいなかんじですけど
プログラム的には8*n+1+nみたいなかんじですけど
数学的にはどう表現するんだろうか?
8n 8n+1 8n+2みたいには表現できないint1が-(1+8n)みたいなかんじなので
8n+xみたいに表現するにはどうすべきなのだろうか?w
登録:
投稿 (Atom)