!継子立て(ヨセフスの問題)をシミュレートする
LET N=12 !石の数 ※
LET P=-3 !除いていく位置 ※<----------
LET a=4 !開始位置 ※<----------
!●数理的
IF P>0 THEN !時計まわりなら
PRINT MOD(a-1+f(N,P),N)+1
ELSE !反時計まわりなら
PRINT MOD((N-a)-1+f(N,ABS(P)),N)+1 !左右反転して時計まわりにする
END IF
PRINT
FUNCTION f(n,p) !1番から時計まわりにp番目を取り除く
IF n=1 THEN LET f=1 ELSE LET f=MOD(p-1+f(n-1,p),n)+1
END FUNCTION
!●シミュレータ
DIM s(N) !石の状態
FOR i=1 TO N !連番をつける
LET s(i)=i
NEXT i
SET WINDOW -2,2,-2,2 !表示画面
LET r=1.5 !石の位置
SET TEXT JUSTIFY "center","half" !文字の位置
LET r2=1.8
CALL disp_stone !初期状態
PRINT "開始位置=";a
PRINT "除いていく位置=";P
!LET s(a)=0
!CALL disp_stone
LET k=N !残りの個数
DO UNTIL k=1 !残りの石が1つになるまで
LET c=0 !カウンタ
DO UNTIL c=ABS(P) !該当位置を見つける
LET a=a+SGN(P) !±1 ※正の場合、時計まわり
LET b=MOD(a-1,N)+1 !配置位置を換算する
IF s(b)>0 THEN LET c=c+1 !石がある場合のみカウントする
LOOP
PRINT b !取り除く
LET s(b)=-1
LET k=k-1
CALL disp_stone !現在の状態
LOOP
SUB disp_stone !環状に並べる
SET DRAW mode hidden !ちらつきを抑える(開始)
CLEAR
FOR i=1 TO N
LET th=RAD(90-i/N*360) !Y軸から時計まわり
LET x=COS(th) !位置
LET y=SIN(th)
PLOT TEXT ,AT r2*x,r2*y: STR$(i) !番号
IF s(i)>=0 THEN DRAW disk WITH SCALE(0.1)*SHIFT(r*x,r*y) !石
NEXT i
SET DRAW mode explicit !ちらつきを抑える(終了)
WAIT DELAY 0.5
END SUB
END
トランプマジックの創作
投稿日:2008年11月29日(土)19時30分52秒今日一日、数学的構造を活かせるマジックができないかと挑戦してみて、次の手順を考えましたので、是非一度トランプを手にしてやってみて下さい。
*デックのセット方法(裏向きトップよりの順)
赤カード:3,4,8, J , K (マークはなんでもよい。)
黒カード:2,3, 4,6,8, K(同じくマークはなんでもよい。)
4枚のAをまず抜き出しておき、トップからの枚数目に次のカードを配置してください。
(裏向きトップからの枚数目のカードの配置:●カードはなんでもよい。)
1● 11● 21ハートA 31● 41赤4 51赤J
2● 12● 22● 32クラブA 42● 52●
3● 13黒4 23● 33黒3 43●
4● 14ダイアA 24● 34● 44●
5赤K 15● 25黒2 35● 45黒6
6● 16● 26● 36● 46●
7● 17黒K 27● 37黒8 47●
8● 18● 28● 38● 48●
9赤8 19● 29赤3 39● 49スペードA
10● 20● 30● 40● 50●
(やり方)
このようにセットしたパケットをなにげにテーブルに表向きにリボンスプレッドして
普通のカードであることを示す。
順番が狂わぬように集め、裏向きに手に持つ。
ここで一度フォールスカット(順番は元の状態に戻るようにする、偽のカット)をする。
奇数番目のカードをアップする(1,3,5・・・枚目のカードを上に少しずらす。)
これを最後までカードが互い違いになるまで繰り返し、上に上げたカードを全て抜き出し
テーブルに裏向きのまま置く。(順番が崩れないように注意。)<リバースフェローシャッフルと呼ぶ。>
手に残ったパケットで再び同じようにリバースフェローシャッフルをする。
抜き出したカード群は前の取り出してテーブルに置いている上に重ねておく。
これを繰り返すと手元には一枚のカードが残る。
これをテーブルに表向きに出すとクラブのAが現れる。
次に、テーブルに重ねていたパケットを大体半分になるように客に分けてもらう。
(正確に半分でなくてよく、上半分24枚~27枚まで許される。)
上半分を演者がもらい、客のパケットの下半分の枚数を数える振りをしてパケットの上から一枚ずつテーブルにカウントしながら順序を逆転させる。
下半分の枚数が27枚~24枚に入らない時は(枚数がオーバーする時)、カウントし終わった客のパケットのボトムから、演者のパケットのボトムへ数枚を何 気に移動させる。あるいはその逆に少ない場合は演者のパケットのボトムから数枚抜き出し、それの順序を逆転した数枚のカードを客のパケットのボトムに追加 しておく。
いずれにしても、客のパケットの枚数を27枚~24枚の範囲に調節しておく。
調整したパケットを客に渡す。
演者と客はお互いのパケットを前の操作と同様にリバースフェローシャッフルをしていく。
それぞれ一枚ずつのカードが残るので、それをテーブルに表向きにする。
演者はダイアのA、客はハートのAが出現する。
これでテーブルには3枚のAが揃ったので、残りがスペードのA
ここで客に2つのパケットのうち、演者が捨てて重ねているパケットか、客が捨てた方のパケットかを選択させる。(ここは少し賭けであるが、客が自分の方のパケットを選ぶと心理的にみて構成している。)
こちらの思惑どうりに客が自分のパケットを選んだら(マジシャンズチョイスで客のパケットの方を選んだように見せかけるとよいだろう。)、パケットを受け取りテーブルに
時計の文字盤の様に1,2,3、・・・12時の位置にカードを上から裏向きのまま配置していく。
残ったカードは中央の針の位置に表向きにして置く。演者の方のパケットも表向きで重ねておく。
ここで客に12時の位置に置いたカード以外が選ばれるように誘導しながら、文字盤の位置にあるカードを一つを選ばせる。(12時を選ばせていい時は、客のパケット枚数が24枚または25枚の時に限る。)
(もし、客が6時の位置を選んだら貴方の勘はすばらしいと褒めてそのカードをめくって、最後のスペードのAを出して終了する。)
客が選んだカードを表向きにして、そのカードの数字が
黒ならそのカードの次から数えて時計回りの向きにその数だけ進み、そこのカードをめくって取り除いていく。(めくったカードは中央に表向きで重ねていく。)
また客が指定したカードが赤のカードなら反時計回りに進んでめくり、取り除いていく。
これを繰り返していく(取り除いたカードの次からまた進んで<最初の客が選んだカードの数ぶん>次のカードをめくる。)と最後に6時の位置にあったカードが一枚だけ残る。
このカードを思わせぶりに焦らせて表にすると、まさに最後のスペードのAが出現する。
他のカードに2枚として同じカードが含まれていないことを、中央にある表向きに重なっているパケットをテーブルにリボンスプレッドして演技を終わる。
原理的には二進法の利用と、継子立ての遊びを組み合わせた様な手順になります。
朝から取り組み、今ようやくどうにかまとめました。
何か手違いが生じたら、お教えください。
更に改良部分がありましたらヒントをお願いします。