投稿者: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枚で実験するだけでかなり時間を要した。)
これをプログラム的にお願いしたいんですが・・・
|
|
|
投稿者:山中和義
投稿日: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
|
|
|
投稿者:山中和義
投稿日: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枚
:
:
|
|
|
戻る