3段構えの魔方陣は可能か?

 投稿者:GAI  投稿日:2009年12月28日(月)20時19分13秒
    5  22  18
 28  15   2
 12   8  25

はもちろん各行、各列、対角線が和45の魔方陣であるが

この数字の語を英語にして

   five      twenty-two   eighteen
twenty-eight  fifteen       two
  twelve       eight     twenty-five

と綴ればその文字数が
  4   9   8
 11   7   3
  6   5  10

となり、これがまた和21の魔方陣を構成している。

そこでもう一つ、更にこれを綴って第3の魔方陣が構成できるパターンが存在できるか知りたい。
何らかの検索で可能ですか?
 
 

Re: 3段構えの魔方陣は可能か?

 投稿者:山中和義  投稿日:2009年12月30日(水)09時54分59秒
  > No.952[元記事へ]

GAIさんへのお返事です。

a,b,cは整数、M,A,B,Cは行列として「M+a*A+b*B+c*C による変形」で検索しました。
0~999の数字を使った場合、重複を除いて存在しません。
しかも、提示された魔方陣が唯一重複なし2段階のものです。
!3×3魔方陣で3段階になるものを検索する

OPTION ARITHMETIC NATIVE !CPUパワー

DIM nm$(0 TO 19) !0~19
DATA "Zero" !0
DATA "One" !1
DATA "Two" !2
DATA "Three" !3
DATA "Four" !4
DATA "Five" !5
DATA "Six" !6
DATA "Seven" !7
DATA "Eight" !8
DATA "Nine" !9
DATA "Ten" !10
DATA "Eleven" !11
DATA "Twelve" !12
DATA "Thirteen" !13
DATA "Fourteen" !14
DATA "Fifteen" !15
DATA "Sixteen" !16
DATA "Seventeen" !17
DATA "Eighteen" !18
DATA "Nineteen" !19
MAT READ nm$

DIM nm2$(2 TO 9) !20以上
DATA "Twenty" !20
DATA "Thirty" !30
DATA "Fourty" !40
DATA "Fifty" !50
DATA "Sixty" !60
DATA "Seventy" !70
DATA "Eigthy" !80
DATA "Ninety" !90
MAT READ nm2$

FUNCTION f(x) !数値を英語読みに変換する ※0~999
   LET v=0
   IF x>=100 THEN LET v=LEN(nm$(INT(x/100))) + LEN("hundred") !百の位

   LET xx=MOD(x,100) !0~99の部分
   IF xx<>0 THEN
      IF xx<20 THEN !0~19なら
         LET v=v+LEN(nm$(xx))
      ELSE
         LET v=v+LEN(nm2$(INT(xx/10))) !十の位
         LET w=MOD(xx,10) !一の位
         IF w<>0 THEN LET v=v+LEN(nm$(w))
      END IF
   END IF
   LET f=v
END FUNCTION
!------------------------------


DIM M(9) !3×3基本形
!DATA 2,9,4 !合計は、15
!DATA 7,5,3
!DATA 6,1,8
!MAT READ M
MAT M=ZER

! M+a*A+b*B+c*C による変形 合計は、15+3*a となる。

DIM A(9)
DATA +1,+1,+1
DATA +1,+1,+1
DATA +1,+1,+1
MAT READ A

DIM B(9)
DATA  0,-1,+1
DATA +1, 0,-1
DATA -1,+1, 0
MAT READ B

DIM C(9) !※Bを90°回転
DATA +1,-1, 0
DATA -1, 0,+1
DATA  0,+1,-1
MAT READ C

LET cTRUE=-1 !真
LET cFALSE=0 !偽

FUNCTION CheckRange(T()) !1~999
   LET CheckRange=cFALSE
   FOR i=1 TO 9
      IF T(i)<0 OR T(i)>999 THEN EXIT FUNCTION
   NEXT i
   LET CheckRange=cTRUE
END FUNCTION
FUNCTION CheckUnique(T()) !同じ数字かどうか
   LET CheckUnique=cFALSE
   FOR i=1 TO 8
      FOR j=i+1 TO 9
         IF T(i)=T(j) THEN EXIT FUNCTION
      NEXT j
   NEXT i
   LET CheckUnique=cTRUE
END FUNCTION
FUNCTION CheckSum(T()) !合計
   LET CheckSum=cFALSE
   LET v=3*T(5)
   IF v<>T(1)+T(2)+T(3) THEN EXIT FUNCTION !横
   IF v<>T(4)+T(5)+T(6) THEN EXIT FUNCTION
   IF v<>T(7)+T(8)+T(9) THEN EXIT FUNCTION

   IF v<>T(1)+T(4)+T(7) THEN EXIT FUNCTION !縦
   IF v<>T(2)+T(5)+T(8) THEN EXIT FUNCTION
   IF v<>T(3)+T(6)+T(9) THEN EXIT FUNCTION

   IF v<>T(1)+T(5)+T(9) THEN EXIT FUNCTION !斜め
   IF v<>T(3)+T(5)+T(7) THEN EXIT FUNCTION
   LET CheckSum=cTRUE
END FUNCTION
!------------------------------


DIM T(9),TT(9)
!FOR aa=111 TO 0 STEP -1
FOR aa=0 TO 111 !※
   DIM Ta(9)
   MAT TT=aa*A
   MAT Ta=M+TT
   PRINT "合計=";3*M(5)+3*aa; aa

   FOR bb=0-Ta(8) TO 999-Ta(8) !※
      DIM Tb(9)
      MAT TT=bb*B
      MAT Tb=Ta+TT

      FOR cc=0-Ta(8) TO 999-Ta(8) !※
         MAT TT=cc*C
         MAT T=Tb+TT !1段階目

         !IF CheckRange(T)=cTRUE AND CheckUnique(T)=cTRUE THEN !重複なし
         IF CheckRange(T)=cTRUE THEN !重複あり
            DIM T1(9)
            MAT T1=T !save it

            FOR i=1 TO 9 !2段階目
               LET T(i)=f(T(i))
            NEXT i
            !IF CheckUnique(T)=cTRUE AND CheckSum(T)=cTRUE THEN
            IF CheckSum(T)=cTRUE THEN
               DIM T2(9)
               MAT T2=T !save it
               !!!MAT PRINT T; !debug

               FOR i=1 TO 9 !3段階目
                  LET T(i)=f(T(i))
               NEXT i
               !IF CheckUnique(T)=cTRUE AND CheckSum(T)=cTRUE THEN
               IF CheckSum(T)=cTRUE THEN

                  MAT PRINT T1;T2;T; !魔方陣を表示する
                  PRINT

               END IF
            END IF
         END IF

      NEXT cc
   NEXT bb
NEXT aa


END
 

戻る