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交換性がしっかりしているので
書籍に掲載する言語として優れている。と常々思っているので
0 件のコメント:
コメントを投稿