挑戦状

 投稿者:GAI  投稿日:2009年10月25日(日)13時15分46秒
   *48   *90    16   59   *68   38    76
  15   57   *49   *92     *79   27    65
 *81   35   *71   26    13   *93    43
  36   78   *28   69    56   *50   *88
 *39   77    25     *72    55   47   *89
  33   *83    23   66   *61   45   *91

*印は赤色で印字されているものとする。(無いのは黒色)

(遊び方)
1.相手にこの中の一つの数字を心に思ってもらう。
2.その数字のある列の数字の色を上から言ってもらう。
 ただし、心に決めた数字では、あえて逆の色を言うことにする。
 (例:78(4行2列目)→赤、黒、黒、赤(逆)、黒、赤と答えることになる。)
3.この答えの色の配列を聞いて、即座に相手の心に思った数字を当てる。
  (このカードは相手に渡しておき、このカードは見ないで当てる。)

この遊びを可能ならしめる数字の配列が如何なる法則で構成されているか、解明されたし。
(あえてウソの情報を含ませる点が重要)

どなたか、心に一つ数字を思い、色の報告をして下さい。
あなたの数字をピタリと当ててしんぜましょう。
 

Re: 挑戦状

 投稿者:荒田浩二  投稿日:2009年10月26日(月)07時21分20秒
  > No.676[元記事へ]

GAIさんへのお返事です

赤と黒の文字列からもとの数字を求めるには、次のようにします。
先頭から11,22,44,1,2,4をベースとして、黒ならその数を加え最後に10を加えます。
黒、赤、黒、黒、赤、赤 ならば  1*11+0*22+1*44+1*1+0*2+0*4+10=66

100 DEF base(j)=2^MOD(j+2,3)+2^MOD(j+2,3)*10*(1-INT(j/3.01)) ! 11,22,44,1,2,4
110 FUNCTION change(p$)
120    IF UCASE$(p$)="R" THEN
130       LET c=0
140    ELSEIF UCASE$(p$)="B" THEN
150       LET c=1
160    ELSE
170       PRINT "ERROR-2 !!"
180    END IF
190    LET change=c
200 END FUNCTION
210 INPUT PROMPT "赤を""R"",黒を""B""とした文字列 = ":rb$ ! 例) brbbrr
220 IF LEN(rb$)<>6 THEN PRINT "ERROR-1 !!"
230 LET d=10
240 FOR j=1 TO 6
250    LET d=d+change(rb$(j:j))*base(j)
260 NEXT j
270 PRINT "解答 =";d
280 END


次はタテの数字の列の構成をすべて記述するプログラムです。
ここからどのような規則により7個の数列を抽出したのかは、私にはわかりませんでした。
たぶん数字が重複しないように選んでいるのだと思いますが、次の数列は採用されていません。
   *21
   *32
   *54  (すべて赤なのでこれを含むとヒントになってしまうから?)
   *11
   *12
   *14
生成できる数字は10~94のうちの64個(=2^6)ですが、他にも表に現れない数字があります。

DIM base(6),dwn(6),check(6)
MAT READ base,dwn
FUNCTION number(q)
   LET dd=10
   FOR jj=1 TO 6
      IF jj<>q THEN
         LET dd=dd+check(jj)*base(jj)
      ELSE
         LET dd=dd+((check(jj)-1)^2)*base(jj)
      END IF
   NEXT jj
   LET number=dd
END FUNCTION
FOR n=10 TO 94
   MAT check=ZER
   LET d=10
   LET nn=n-d
   FOR j=1 TO 6 ! baseの大きい数から引いていく
      IF nn-base(dwn(j))>=0 THEN
         LET check(dwn(j))=1
         LET d=d+base(dwn(j))
         LET nn=nn-base(dwn(j))
      END IF
   NEXT j
   IF n=d THEN
      LET check(1)=(check(1)-1)^2 ! 0,1の入れ換え
      FOR j=1 TO 6
         PRINT number(j);
      NEXT j
      PRINT
      FOR j=1 TO 6
         IF check(j)=0 THEN PRINT " 赤 "; ELSE PRINT " 黒 ";
      NEXT j
      PRINT
   ELSE
      PRINT n;" この数は生成できません"
   END IF
NEXT n
DATA 11,22,44,1,2,4  ! base
DATA 3,2,1,6,5,4  ! baseの降順
END
 

Re: 挑戦状

 投稿者:山中和義  投稿日:2009年10月26日(月)16時57分39秒
  > No.676[元記事へ]

GAIさんへのお返事です。

!2^6通りのビットパターンは、通常0~2^6-1の数に対応させる。
!この問題では、2^n 部分(重み)が、ビット位置と32,16,8,4,2,1の順番で対応いていない。
!だが、これをもとに生成されているものと仮定して、どのビットに対応しているか、グラフで確認する。

!6!通りの順列を生成して、より直線になるものが求める割付けとなる。
!まだ、この段階では重みは予想(近似値)となる。

!正解の重みを推測するためにグラフを検証する。(下図)
!重みは、(8,16,32,1,2,4)=(1*8,2*8,4*8,1,2,4) → (1*(8+3),2*(8+3),4*(8+3),1,2,4)=(11,22,44,1,2,4)
!げたは、10。
DIM W(6) !重み
DATA 32,16,8,4,2,1 !正解 11,22,44,1,2,4
MAT READ W

!1列目 010101 0:赤、1:黒
100 DATA 1,1,0,1,0,1, 48 !客が答えた赤黒のパターン、思っていた数
    DATA 0,0,0,1,0,1, 15
    DATA 0,1,1,1,0,1, 81
    DATA 0,1,0,0,0,1, 36
    DATA 0,1,0,1,1,1, 39
    DATA 0,1,0,1,0,0, 33

    !2列目 011110
    DATA 1,1,1,1,1,0, 90
    DATA 0,0,1,1,1,0, 57
    DATA 0,1,0,1,1,0, 35
    DATA 0,1,1,0,1,0, 78
    DATA 0,1,1,1,0,0, 77
    DATA 0,1,1,1,1,1, 83

    !3列目 100011
    DATA 0,0,0,0,1,1, 16
    DATA 1,1,0,0,1,1, 49
    DATA 1,0,1,0,1,1, 71
    DATA 1,0,0,1,1,1, 28
    DATA 1,0,0,0,0,1, 25
    DATA 1,0,0,0,1,0, 23

    !4列目 101101
    DATA 0,0,1,1,0,1, 59
    DATA 1,1,1,1,0,1, 92
    DATA 1,0,0,1,0,1, 26
    DATA 1,0,1,0,0,1, 69
    DATA 1,0,1,1,1,1, 72
    DATA 1,0,1,1,0,0, 66

    !5列目 001110
    DATA 1,0,1,1,1,0, 68
    DATA 0,1,1,1,1,0, 79
    DATA 0,0,0,1,1,0, 13
    DATA 0,0,1,0,1,0, 56
    DATA 0,0,1,1,0,0, 55
    DATA 0,0,1,1,1,1, 61

    !6列目 110011
    DATA 0,1,0,0,1,1, 38
    DATA 1,0,0,0,1,1, 27
    DATA 1,1,1,0,1,1, 93
    DATA 1,1,0,1,1,1, 50
    DATA 1,1,0,0,0,1, 47
    DATA 1,1,0,0,1,0, 45

    !7列目 111000
    DATA 0,1,1,0,0,0, 76
    DATA 1,0,1,0,0,0, 65
    DATA 1,1,0,0,0,0, 43
    DATA 1,1,1,1,0,0, 88
    DATA 1,1,1,0,1,0, 89
    DATA 1,1,1,0,0,1, 91

    SET WINDOW -5,100,-5,100

    DIM P(6)
    FOR t=0 TO fact(6)-1 !重みの順列を生成する
       CALL Num2Perm(t,P,6)

       RESTORE 100
       CLEAR
       DRAW grid(10,10)
       FOR d=1 TO 6*7 !サンプル・データより
          DIM B(6) !客が答えた赤黒のパターン
          MAT READ B
          READ y !思っていた数

          LET x=0 !線形写像
          FOR i=1 TO 6
             LET x=x+W(P(i))*B(i)
          NEXT i

          PLOT POINTS: x,y !より直線になるのが候補!
       NEXT d
       FOR i=1 TO 6 !重みの順列を表示する
          PRINT W(P(i));
       NEXT i
       PRINT

       WAIT DELAY 0.3 !※調整が必要

    NEXT t

 END


 !n!の順列パターン ⇔ 0~(n!-1)の番号

 EXTERNAL FUNCTION Perm2Num(A(),N) !順列パターンに番号を付ける ※辞書式順序
    LET v=0
    FOR j=1 TO N-1 !※Nでは0
       LET t=A(j)
       LET v=v+fact(N-j)*(t-1)
       FOR k=j+1 TO N
          IF A(k)>t THEN LET A(k)=A(k)-1
       NEXT k
    NEXT j
    LET Perm2Num=v
 END FUNCTION

 EXTERNAL SUB Num2Perm(h, A(),N) !番号から順列パターンを生成する ※辞書式順序
    LET v=h
    FOR j=1 TO N
       LET fac=fact(N-j)
       LET t=INT(v/fac)
       LET A(j)=t+1 !1~N
       LET v=v-fac*t
    NEXT j
    FOR j=N TO 1 STEP -1
       FOR k=j+1 TO N
          IF A(j)<=A(k) THEN LET A(k)=A(k)+1
       NEXT k
    NEXT j
 END SUB
 

戻る