ある課題解決へのヒントを

 投稿者:GAI  投稿日:2012年 9月25日(火)20時10分52秒
  カードを3つ並びの数字(0,1,2,3の数で構成する。)で表す。
最初の数がカードのマーク(0→ダイヤ、1→クラブ、2→ハート、3→スペード)
次の2つがカードの数字を4進法表示したものになっています。
順番はカードを順序よく並べた状態で打ってあります。

あるカードマジックを創作する上で次の数理が知りたいのです。

この52枚のカードを001(ダイヤの1に対応)からスタートさせて、
先頭の0を除く代わりに末尾に0,1,2,3(中には0をとれないカード番号もある。)のいずれかを取り入れて3つの並びの新たな下にあるカードを表す数字に飛んでいく。
(つまり順番の3~6のいずれに飛んでもよいことになる。ここでは順番3へ飛んだことにしている。)
次は
3へ飛んだとしたら13~15のいずれかへ
4へ飛んだとしたら16~19のいずれかへ
5へ飛んだとしたら20~23のいずれかへ
6へ飛んだとしたら24~25のいずれかへ
という具合に道を選んでいく。
例として進んでいくと34ステップまでで行き止まりとなってしまうことになる。
そこで、うまく選んで行くと完全に一周出来るルートが存在できるのか?
できないなら、最高どこまで進んで行けるのか?
を知りたいのです。

どうぞよろしくお願いします。






順番 : 1 2 3 マーク : 数 : 番号
0 : 0 0 1 ダイヤ : 1 : 0
1 : 0 0 2 ダイヤ : 2 :
2 : 0 0 3 ダイヤ : 3 :
3 : 0 1 0 ダイヤ : 4 : 1
4 : 0 1 1 ダイヤ : 5 : 3
5 : 0 1 2 ダイヤ : 6 : 8
6 : 0 1 3 ダイヤ : 7 : 16
7 : 0 2 0 ダイヤ : 8 : 6
8 : 0 2 1 ダイヤ : 9 : 11
9 : 0 2 2 ダイヤ : 10 : 19
10 : 0 2 3 ダイヤ : 11 :
11 : 0 3 0 ダイヤ : 12 : 14
12 : 0 3 1 ダイヤ : 13 : 22
13 : 1 0 1 クラブ : 1 : 2
14 : 1 0 2 クラブ : 2 : 5
15 : 1 0 3 クラブ : 3 : 13
16 : 1 1 0 クラブ : 4 : 4
17 : 1 1 1 クラブ : 5 : 24
18 : 1 1 2 クラブ : 6 : 25
19 : 1 1 3 クラブ : 7 : 29
20 : 1 2 0 クラブ : 8 : 9
21 : 1 2 1 クラブ : 9 :
22 : 1 2 2 クラブ : 10 : 26
23 : 1 2 3 クラブ : 11 : 32
24 : 1 3 0 クラブ : 12 : 17
25 : 1 3 1 クラブ : 13 : 30
26 : 2 0 1 ハート : 1 : 7
27 : 2 0 2 ハート : 2 : 10
28 : 2 0 3 ハート : 3 : 21
29 : 2 1 0 ハート : 4 : 12
30 : 2 1 1 ハート : 5 : 28
31 : 2 1 2 ハート : 6 :
32 : 2 1 3 ハート : 7 :
33 : 2 2 0 ハート : 8 : 20
34 : 2 2 1 ハート : 9 : 27
35 : 2 2 2 ハート : 10 :
36 : 2 2 3 ハート : 11 :
37 : 2 3 0 ハート : 12 : 33
38 : 3 3 1 ハート : 13 :
39 : 3 0 1 スペード : 1 : 15
40 : 3 0 2 スペード : 2 : 18
41 : 3 0 3 スペード : 3 : 34 ←行き止
42 : 3 1 0 スペード : 4 :
43 : 3 1 1 スペード : 5 : 23
44 : 3 1 2 スペード : 6 : 31
45 : 3 1 3 スペード : 7 :
46 : 3 2 0 スペード : 8 :
47 : 3 2 1 スペード : 9 :
48 : 3 2 2 スペード : 10 :
49 : 3 2 3 スペード : 11 :
50 : 3 3 0 スペード : 12 :
51 : 3 3 1 スペード : 13 :
 

Re: ある課題解決へのヒントを

 投稿者:山中和義  投稿日:2012年 9月26日(水)07時24分22秒
  > No.1983[元記事へ]

GAIさんへのお返事です。

> カードを3つ並びの数字(0,1,2,3の数で構成する。)で表す。
> 最初の数がカードのマーク(0→ダイヤ、1→クラブ、2→ハート、3→スペード)
> 次の2つがカードの数字を4進法表示したものになっています。
> 順番はカードを順序よく並べた状態で打ってあります。

> この52枚のカードを001(ダイヤの1に対応)からスタートさせて、
> 先頭の0を除く代わりに末尾に0,1,2,3(中には0をとれないカード番号もある。)のいずれかを取り入れて3つの並びの新たな下にあるカードを表す数字に飛んでいく。


プログラムは、処理が長くて終了していません。
途中経過では、42のようです。


LET M=4 !mシンボルのn文字単語
LET N=3

PUBLIC NUMERIC C !解の個数
LET C=0
PUBLIC NUMERIC X
LET X=0

DIM A(M^N+(N-1)),F(0 TO M^N-1) !列、遷移
MAT A=ZER
LET A(3)=1 !番号
MAT F=(-1)*CON
LET F(1)=0 !先頭が0,0,…,1 ※(n-2)個の0と1

CALL try(N+1,M,N,A,F)

END


EXTERNAL SUB try(p,M,N,A(),F())
FOR i=0 TO M-1
   LET t=0 !m進数n桁を10進法へ
   FOR J=N-1 TO 1 STEP -1
      LET t=t*M+A(p-J)
   NEXT J
   LET t=t*M+i

   IF F(t)<0 THEN !未使用なら
      LET F(t)=p-N !使用中 ※正の値(=番号)

      LET A(p)=i !p番目は数i

      LET W=MOD(t,4^2) !カードの番号は1から13まで
      IF W=0 OR W=14 OR W=15 THEN
         IF p>X THEN !最大のもののみ
            LET X=p

            PRINT p !長さ
            MAT PRINT A; !ドゥブリュエイン列
            MAT PRINT F; !遷移
         END IF
      ELSE
         CALL try(p+1,M,N,A,F) !次へ
      END IF

      LET F(t)=-1 !元に戻す
   END IF
NEXT i
END SUB


実行結果

  :
  :

42
0  0  1  0  1  1  0  2  0  1  2  0  2  1  0  3  0  1  3  0  2  2  1  1  1  2  1  2  2  2  3  0  3  1  1  3  1  2  3  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0

-1  0 -1 -1  1  3  8  16  6  11  19 -1  14  31 -1 -1  39  2  5  13  4  22  23  33  9  24  26  36  17  34 -1 -1 -1  7  10 -1  12  21  25 -1 -1  20  27  28  29  37 -1 -1 -1  15  18  30  38  32  35 -1 -1 -1 -1 -1 -1 -1 -1 -1

  :
  :

 

戻る