カードマジックの創作への数理調査依頼

 投稿者:GAI  投稿日:2012年 8月12日(日)07時25分20秒
  トランプの枚数がn枚のパケットがあり
これを上から一枚ずつテーブルに左右に裏向きで配っていき2つの山を作っていく。
2つの山で、一方の山はテーブルから外す。
残った山で同様にカードを配り再び2つの山を作る。
これを繰り返して一枚のカードを残す。
このとき
最後にカードを配った方の山を除く場合を0、残す場合を1と表し
元のパケットのボトムからk番目のカードを最後まで残す為には
いかなる戦略をとればよいかを調べたい。

(例)15枚のパケットで実験
下からk枚目のカードが最後まで残る。
k枚目:1回目 2回目 3回目 4回目
1  :1   0   1   0
2  :0   1   1   0
3  :1   1   1   0
4  :0   0   1   0
5  :1   0   0   0
6  :0   1   0   0
7  :1   1   0   0
8  :0   0   0  (決着済み)
9  :1   0   1   1
10 :0   1   1   1
11 :1   1   1   1
12 :0   0   1   1
13 :1   0   0   1
14 :0   1   0   1
15 :1   1   0   1

の様な結果を得た。(これだけだと規則性が何となく判明する。)
しかし今度はパケットの枚数を16枚と変化させると
微妙に変化して
15枚の時の下から14枚目を残す戦略0,1,0,1
を行うと16枚目のカードが残ることになりずれる。

いろいろな枚数のパケットでの結果が知りたい。
(15枚で実験するだけでかなり時間を要した。)

これをプログラム的にお願いしたいんですが・・・


 

Re: カードマジックの創作への数理調査依頼

 投稿者:山中和義  投稿日:2012年 8月12日(日)12時43分45秒
  > No.1936[元記事へ]

GAIさんへのお返事です。

> トランプの枚数がn枚のパケットがあり
> これを上から一枚ずつテーブルに左右に裏向きで配っていき2つの山を作っていく。
> 2つの山で、一方の山はテーブルから外す。
> 残った山で同様にカードを配り再び2つの山を作る。
> これを繰り返して一枚のカードを残す。
> このとき
> 最後にカードを配った方の山を除く場合を0、残す場合を1と表し
> 元のパケットのボトムからk番目のカードを最後まで残す為には
> いかなる戦略をとればよいかを調べたい。


LET N=15 !N枚のカード
LET K=2 !残すカードの位置(下からK枚目)

DIM P(N) !N枚のカードによるパケット ※P(1):上
FOR i=1 TO N !初期化
   LET P(i)=N+1-i
NEXT i

LET C=0 !回数

LET NN=N
DO WHILE NN>1 !1枚になるまで
   LET C=C+1
   MAT PRINT P; !debug

   DIM L(N),R(N) !2つに分ける
   MAT L=ZER !並び
   MAT R=ZER
   LET LL=0 !枚数
   LET RR=0
   FOR i=1 TO NN
      IF P(i)=K THEN LET KK=i !残すカードを確認する
      IF MOD(i,2)=1 THEN !左の山へ
         LET LL=LL+1
         LET L(LL)=P(i)
      ELSE !右の山へ
         LET RR=RR+1
         LET R(RR)=P(i)
      END IF
   NEXT i
   CALL Reverse(L,LL) !実際の並び(上から)に合わせる
   CALL Reverse(R,RR)
   MAT PRINT L; !debug
   MAT PRINT R;

   !!PRINT NN;KK !debug
   IF MOD(NN,2)=MOD(KK,2) THEN !最後のカードと同じ山にある場合
      PRINT STR$(C);"回目の戦略=1" !残す!
      IF MOD(NN,2)=1 THEN !左の山なら
         LET NN=LL
         MAT P=L
      ELSE !右の山なら
         LET NN=RR
         MAT P=R
      END IF
   ELSE
      PRINT STR$(C);"回目の戦略=0" !捨てる!
      IF MOD(NN,2)=1 THEN
         LET NN=RR
         MAT P=R
      ELSE
         LET NN=LL
         MAT P=L
      END IF
   END IF

   PRINT
LOOP

END


EXTERNAL SUB Reverse(P(),N) !カードの位置を反転させる
!!MAT PRINT P; !debug
FOR i=1 TO INT(N/2) !半分を対象とする
   LET t=P(i) !交換する
   LET P(i)=P(N+1-i)
   LET P(N+1-i)=t
NEXT i
!!MAT PRINT P; !debug
END SUB


実行結果 N=15,K=2の場合

15  14  13  12  11  10  9  8  7  6  5  4  3  2  1

1  3  5  7  9  11  13  15  0  0  0  0  0  0  0

2  4  6  8  10  12  14  0  0  0  0  0  0  0  0

1回目の戦略=0

2  4  6  8  10  12  14  0  0  0  0  0  0  0  0

14  10  6  2  0  0  0  0  0  0  0  0  0  0  0

12  8  4  0  0  0  0  0  0  0  0  0  0  0  0

2回目の戦略=1

14  10  6  2  0  0  0  0  0  0  0  0  0  0  0

6  14  0  0  0  0  0  0  0  0  0  0  0  0  0

2  10  0  0  0  0  0  0  0  0  0  0  0  0  0

3回目の戦略=1

2  10  0  0  0  0  0  0  0  0  0  0  0  0  0

2  0  0  0  0  0  0  0  0  0  0  0  0  0  0

10  0  0  0  0  0  0  0  0  0  0  0  0  0  0

4回目の戦略=0

 

Re: カードマジックの創作への数理調査依頼

 投稿者:山中和義  投稿日:2012年 8月12日(日)13時03分2秒
  > No.1937[元記事へ]

GAIさんへのお返事です。

> いかなる戦略をとればよいかを調べたい。

一覧表はこちらになります。


FOR N=1 TO 52 !N枚のカード
   PRINT STR$(N);"枚"
   FOR K=1 TO N !残すカードの位置(下からK枚目)
      PRINT USING "   ##枚目: ":K;

      DIM P(52) !N枚のカードによるパケット ※P(1):上
      FOR i=1 TO N !初期化
         LET P(i)=N+1-i
      NEXT i

      LET C=0 !回数

      LET NN=N
      DO WHILE NN>1 !1枚になるまで
         LET C=C+1
         !!MAT PRINT P; !debug

         DIM L(52),R(52) !2つに分ける
         MAT L=ZER !並び
         MAT R=ZER
         LET LL=0 !枚数
         LET RR=0
         FOR i=1 TO NN
            IF P(i)=K THEN LET KK=i !残すカードを確認する
            IF MOD(i,2)=1 THEN !左の山へ
               LET LL=LL+1
               LET L(LL)=P(i)
            ELSE !右の山へ
               LET RR=RR+1
               LET R(RR)=P(i)
            END IF
         NEXT i
         CALL Reverse(L,LL) !実際の並び(上から)に合わせる
         CALL Reverse(R,RR)
         !!MAT PRINT L; !debug
         !!MAT PRINT R;

         !!PRINT NN;KK !debug
         IF MOD(NN,2)=MOD(KK,2) THEN !最後のカードと同じ山にある場合
            PRINT "1"; !残す!
            IF MOD(NN,2)=1 THEN !左の山なら
               LET NN=LL
               MAT P=L
            ELSE !右の山なら
               LET NN=RR
               MAT P=R
            END IF
         ELSE
            PRINT "0"; !捨てる!
            IF MOD(NN,2)=1 THEN
               LET NN=RR
               MAT P=R
            ELSE
               LET NN=LL
               MAT P=L
            END IF
         END IF

      LOOP
      PRINT

   NEXT K
NEXT N

END


EXTERNAL SUB Reverse(P(),N) !カードの位置を反転させる
!!MAT PRINT P; !debug
FOR i=1 TO INT(N/2) !半分を対象とする
   LET t=P(i) !交換する
   LET P(i)=P(N+1-i)
   LET P(N+1-i)=t
NEXT i
!!MAT PRINT P; !debug
END SUB


実行結果

   :
   :
15枚
    1枚目: 1010
    2枚目: 0110
    3枚目: 1110
    4枚目: 0010
    5枚目: 1000
    6枚目: 0100
    7枚目: 1100
    8枚目: 000
    9枚目: 1011
   10枚目: 0111
   11枚目: 1111
   12枚目: 0011
   13枚目: 1001
   14枚目: 0101
   15枚目: 1101
16枚
    1枚目: 1010
    2枚目: 0010
    3枚目: 1110
    4枚目: 0110
    5枚目: 1000
    6枚目: 0000
    7枚目: 1100
    8枚目: 0100
    9枚目: 1011
   10枚目: 0011
   11枚目: 1111
   12枚目: 0111
   13枚目: 1001
   14枚目: 0001
   15枚目: 1101
   16枚目: 0101
17枚
   :
   :

 

戻る