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

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

魔方陣についてコミュの年月日を含んだ魔方陣生成用プログラムの再掲 【誤記訂正追記】

  • mixiチェック
  • このエントリーをはてなブックマークに追加
問い合わせがありましたので再掲しておきます。

20 yy年 mm月 dd 日 というように 20、yy、mm、dd と4個の数字が先頭の枡に並ぶ
(26日〜31日を含まない日付で) 5x5の魔方陣をつくるJavaScriptのソースです。


(必ずしも魔方陣が作れるとは限りませんが) ソース中の下記4行を変えれば、
別の日付でも使えます。 

P1=20;
P2=06;
P3=3;
P4=21;

下記の <!DOCTYPE ・・・ 以下の内容を、マウスドラッグして、コピーして
例えばsample.htmlという名前の ファイルに収めて、ブラウザでクリックして
スクリプトの実行を許可するとという具合にして、試してみてください。

計算が長引くおそれがあるので 途中、continue?と問い合わせがでるので、
打ち切りたいときは、そこで中止してください。


〜〜この後の内容をsample.html というテキストファイルにコピーしてみて下さい〜〜〜〜

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<TITLE>魔方陣パズルの解</TITLE>
</HEAD>
<script language="javascript">
<!-- //

N1=26;
SUM=65;
P1=20;
P2=06;
P3=3;
P4=21;
P5=SUM-P1-P2-P3-P4;

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

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

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

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; //置けない時の判定用の戻り値
}

//デバッグ用の初期値
//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;


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

//探索手順: 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;

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

if(kmP5>SUM-3) {REMOVE(m);break;}
if(imP1>SUM-3) {REMOVE(m);break;}
for(c=c1;c<N1; c++){
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++){
A=PUT(ijk,a);
if(A==0) continue;

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

for(L=L1;L<N1; L++){
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++){
B=PUT(Lmn,b); if(B==0) continue;
abCP1=a+b+C+P1; if (abCP1>=SUM){REMOVE2(b,B);break;}
ABDP5=A+B+D+P5; if (ABDP5>=SUM){REMOVE2(b,B);continue;}

X=SUM-abCP1;
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>
</BODY>
</HTML>


コメント(6)

すみません。 <BODY>のタグが欠落していたのに気がつきました。 上記は訂正済みです。 昨日、ここを御覧になってコピーされた方はお手元のソース(末尾の3行)を確認してみてください。
年月日を含んだ数独問題生成用プログラムとかはないのかな?
数独だと1から9までの数字だけになりますね。。。 
例えば 14年5月23日 は 1,4,5,2,3 といった形でいいのでしょうか?

数独の問題の数値の配置は、1から9までを、自由に置換したとしても、
問題として成立するのかな? だとすれば、既存の問題で、数字の並びを
置換するだけで、自由に作れるかも?



送っていただいたのうまくいかなかったんですw
ブラウザはなんでしょう? chromeやIEでお試しください。

症状としては、下記の何番あたりの問題でしょうか?



0:送ったファイルが開けない。 (ダウンロードできない / 中身が文字化けしてるとか?)

 1:スクリプトを実行するかの警告がでる。  (実行を許可してください。)

 2:日付を替えたら 動かなくなった。 (修正前の元のファイルでは動きましたか?)
 
このあたりの内容を どう書き換えましたか? 
P1 = 20;
P2 = 14;
P3 = 05;
P4 = 07;

 3: ブラウザが白紙のままで、何も変化しない。 終わらない。

ログインすると、みんなのコメントがもっと見れるよ

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

魔方陣について 更新情報

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

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

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