パスワードを忘れた? アカウント作成
13444413 journal
数学

yasuokaの日記: 10×10のDamm方陣を求めるfunction

日記 by yasuoka

10月27日の日記の読者から、N={0,1,2,3,4,5,6,7,8,9}上のチェックディジット関数ci+1=f(ci,xi), c1=0を、10×10のDamm方陣ではなく、プログラムの関数の形で書けないだろうか、との御質問をいただいた。とりあえず、10×10のDamm方陣の例を確認しておこう。

  | 0 1 2 3 4 5 6 7 8 9
--+--------------------
0 | 0 2 3 1 5 6 4 8 9 7
1 | 2 0 1 3 7 9 8 5 4 6
2 | 3 1 0 2 9 8 7 4 6 5
3 | 1 3 2 0 8 7 9 6 5 4
4 | 5 8 7 9 0 4 6 1 3 2
5 | 6 7 9 8 4 0 5 3 2 1
6 | 4 9 8 7 6 5 0 2 1 3
7 | 8 4 6 5 2 1 3 0 7 9
8 | 9 6 5 4 1 3 2 7 0 8
9 | 7 5 4 6 3 2 1 9 8 0

まあ、そう難しい形ではなさそうだ。思いつくままに書いてみよう。

function f(c,x){
 if(c==x)
  return(0);
 if(c==0||x==0)
  return(((c+x)%3==0)?c+x-2:c+x+1);
 d=int((c-1)/3);
 y=int((x-1)/3);
 return(((6-d-y)%3+1)*3-(((d-y+3)%3==2)?c+x:c+x-1)%3);
}

あるいは、int関数とか「条件?:偽」とかを実装してない処理系なら、以下のようになるだろう。

function f(c,x){
 if(c==x)
  return(0);
 if(c==0||x==0)
  return(c+x+(9-c-x)%3+(c+x)%3-2);
 d=c+(9-c)%3;
 y=x+(9-x)%3;
 if((d-y+9)%9==6)
  return((24-d-y)%9+3-(c+x)%3);
 return((24-d-y)%9+3-(c+x-1)%3);
}

ただ、どちらにしても、条件分岐と剰余が必要なのは間違いなさそうだ。ならば、10×10方陣を配列として仕込む方が、間違いが少なそうに私(安岡孝一)には思えるのだが、それだと何か都合の悪いことがあるのかしら?

最新の日記

この議論は、yasuoka (21275)によって ログインユーザだけとして作成されたが、今となっては 新たにコメントを付けることはできません。
typodupeerror

犯人は巨人ファンでA型で眼鏡をかけている -- あるハッカー

読み込み中...