2011年11月21日月曜日

8n+x? その2

8n+x?の記事は、何がやりたいかというと
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 件のコメント:

コメントを投稿