ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

魔方陣についてコミュの年月日を含んだ魔方陣生成用プログラムの改訂版

  • mixiチェック
  • このエントリーをはてなブックマークに追加
日付の入力ができるようになっています。  
途中継続するか訊いて来ます。中断したところまでの表示がでます。

ブラウザで開くと、警告がでたりしますが、そこはJavaScriptの実行を許可して下さい。

IE, Chrome で動作確認してあります。

〜〜〜〜〜〜〜〜〜〜〜〜〜〜下記内容をコピペした htmlファイルをお試しください。〜〜〜〜


<!DOCTYPE HTML>
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<TITLE>年月日を含んだ魔方陣</TITLE>
</HEAD>
<script language="javascript">
<!-- //

checkdata = 0;
SUM = 65;
var N1 = 26;

i1=1;j1=1;k1=1;L1=1;m1=1;n1=1;a1=1;b1=1;c1=1;d1=1;Z1=1;

function fn(x){
return (1<<x);
} // 使用中、未使用中のビットパターン位置

function set(x){ // xが使えるなら使用中にする。
if( (checkdata & (1<<x)) !=0) {
return 0; //使えない
}else{
checkdata|=(1<<x); return 1; //使用中にする。
}
}

function PUT(x,y){ //部分和がxのところに、yとz=SUM-x-yが置けるかを判定
z=SUM-x-y;
if((z<N1) && (z>0) && (z!=y)){
if( ((1<<z)&checkdata)==0 && ((1<<y)&checkdata)==0 ){
checkdata|=((1<<y)|(1<<z));
return z;
}
}
return 0; //置けない時の判定用の戻り値
}

// 置いた数字を、元の未使用状態に戻すための関数
function REMOVE(x){ checkdata &= ~(1<<x);}
function REMOVE2(x,y){ checkdata &= ~((1<<x)|(1<<y));}

function Search(num1,num2,num3,num4){
N1=26;
SUM=65;
P1 = parseInt(num1.value); ;
P2 = parseInt(num2.value); ;
P3 = parseInt(num3.value);
P4 = parseInt(num4.value);
P5=SUM-P1-P2-P3-P4;


INITDATA=fn(P1)|fn(P2)|fn(P3)|fn(P4)|fn(P5); //魔方陣上段 P1P2年P3月P4日

checkdata=INITDATA; // 1から25までの数字の使用・未使用を示す


//デバッグ用の初期値
//i1=24;j1=5;k1=6;a1=18;b1=10;L1=11;m1=17;n1=23;c1=3;d1=15;Z1=9;
//通常の初期値
i1=1;j1=1;k1=1;L1=1;m1=1;n1=1;a1=1;b1=1;c1=1;d1=1;Z1=1;


//探索手順: 3個の数字imkを中央上部に、まず配置
//続いて、cとd 合わせてCとDを配置
//P1 P2 P3 P4 P5
//* i * k *
//* * m * *
//* c * d *
//C * * * D
//

for (i=i1; i<N1; i++){
checkdata=INITDATA;
if (set(i)==0) continue;
if( confirm("continue?"+i)!=true) break;

for (k=k1; k<N1; k++){
if(set(k)==0) continue;

for (m=m1; m<N1; m++){
if (set(m)==0) continue;

var imP1 = P1 + i + m;
var kmP5 = P5 + k + m;

if( kmP5 > SUM - 3) {REMOVE(m);break;}
if( imP1 > SUM - 3) {REMOVE(m);break;}


for(c=c1;c<N1; c++){
var C = PUT( kmP5 , c); if(C==0) continue;

for(d=d1;d<N1; d++){
D=PUT(imP1,d);if(D==0) continue;

//
// 残りの縦横斜空欄に入る値を定める。
// j,a,A,Z,V,L,U,n,W,a,B,X,Y の順に値を確認。
//
// P1 P2 P3 P4 P5
// a i j k A
// b L m n B
// X c Z d Y
// C U V W D

for(j=j1;j<N1; j++){
if(set(j)==0) continue;
icP2 = P2 + i + c;
kdP4 = k + d + P4;
jmP3 = j + m + P3;
ijk=i+j+k; if(ijk > SUM - 3) {REMOVE(j); break;}


for(a=a1;a<N1; a++){
var A = PUT(ijk,a);
if(A==0) continue;

for(Z=Z1;Z<N1;Z++){
var cZd = c + Z + d; if(cZd>SUM-3) break;
var V = PUT(jmP3,Z); if(V==0) continue;

for(L=L1;L<N1; L++){
var U = PUT(icP2,L); if(U==0) continue;
if (C+U+V+D>=SUM) {REMOVE2(L,U); continue;}

for(n=n1;n<N1; n++){

W=PUT(kdP4,n); if(W==0) continue;
if(C+U+V+W+D !=SUM) {REMOVE2(n,W); continue;}
Lmn=L+m+n; if(Lmn>SUM-3){REMOVE2(n,W); continue;}

for(b=b1;b<N1; b++){

var B = PUT(Lmn,b); if(B==0) continue;

var abCP1 = a+b+C+P1; if (abCP1>=SUM){REMOVE2(b,B);break;}
var ABDP5 = A+B+D+P5; if (ABDP5>=SUM){REMOVE2(b,B);continue;}

var X = SUM - abCP1;
var Y = SUM - ABDP5;
if(X+Y+c+Z+d !=SUM) {REMOVE2(b,B);break;}
if(set(X)==0) {REMOVE2(b,B);continue;}
if(set(Y)==0) {REMOVE(X);REMOVE2(b,B);continue;}

//ここまでくれば完成

document.write(P1+","+P2+","+P3+","+P4+","+P5+"<BR>");
document.write(a+","+i+","+j+","+k+","+A+"<br>");
document.write(b+","+L+","+m+","+n+","+B+"<br>");
document.write(X+","+c+","+Z+","+d+","+Y+"<br>");
document.write(C+","+U+","+V+","+W+","+D+"<br><br>");

REMOVE2(X,Y);
REMOVE2(b,B);
} //b
REMOVE2(n,W);
} //n
REMOVE2(L,U);
} //L
REMOVE2(Z,V);
} //Z
REMOVE2(a,A);
} //a
REMOVE(j);
} //j
REMOVE2(d,D);
} //d
REMOVE2(c,C);
} //c
REMOVE(m);
} //m
REMOVE(k);
} // k
} // i

alert("FINISHED");

}
// -->
</script>
<BODY>

5x5魔方陣の上辺4個の数字を指定:1から25までの数字を入力
<form id="Form1" action="#">
<INPUT type="number" name="num1" value="20">
<INPUT type="number" name="num2" value="14">
<INPUT type="number" name="num3" value="09">
<INPUT type="number" name="num4" value="01">
<INPUT type="button" value="計算" onclick="Search(num1, num2, num3, num4)">
</form>

</BODY>
</HTML>



コメント(0)

mixiユーザー
ログインしてコメントしよう!

魔方陣について 更新情報

魔方陣についてのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング