レクタングル・ゲーム☆(^~^)

読了目安:16分

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 くそゲー を考えたので 説明する☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 そうか☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 サンプル・プログラムは Python3 で実装して Git hub に置いてある☆
説明が分からなければ 実行してみろだぜ☆」

rectangle-game

 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 囲碁と同じ 19x19 の盤を使うが、他の自然数でも遊べる☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 これ 昨日やってた掛け算の使い回しじゃない!」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ルールを説明する☆」

# 盤

 .  [.]
 .   .
 .   .

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 いきなり 19x19 だと難しいので、小さな 2x3 の盤で説明する☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 盤には 箱 を置けるものとする☆
赤枠とか レッドゾーンとか 箱とか 好きなように呼べだぜ☆
上図では 右上のマスに 箱の印を付けている☆」

# 四角形の例1

 .  [.] 
 .   .

 # 四角形の例2

 .  [.] 
 .   .
 .   .


 # 四角形の例3

 .   .  [.] 
 .   .   .

 # 四角形の例4

 .   .  [.] 
 .   .   .
 .   .   .

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 盤に置ける四角形 として認められているのは、次の2条件を満たすものだぜ☆
* 右上の角が箱を踏んでいる
* 左上、右下、左下の角は箱を踏んでいない

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 この 盤に置ける四角形 をたくさん造れる盤を探せだぜ☆ ルールはこれだけだぜ☆」

# 盤

 .  [.]
 .   .
 .   .

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 例えば この盤には☆」

# 四角形1

<.> <.>
<.> <.>
 .   .

# 四角形2

<.> <.>
 .   .
<.> <.>

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 2つの四角形が置ける☆」

# 盤

 .  [.]
<.> <.>
<.> <.>

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 この形の の四角形 は置けない☆」

 .  [.]
 .   .
 .   .
Succeed : 2
Failed  : 1
total   : 3
Rate    : 0.6667
Info    : Finished.

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 だから結果は 成功2、失敗1 で レート 0.6667 と表示されるんだぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 遊んでいるところを見せる☆」

from lib.calculator import Calculator


def is_red_zone(x, y):
    """
    右上の足だけが踏めるマス。
    """

    return x == y


calculator = Calculator(is_red_zone)
calculator.show_table()
calculator.calculate()

print("Info    : Finished.")

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 プレイヤーができることは is_red_zone(x, y) 関数の戻り値を True か False か指定することだけだぜ☆」

return x == y

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 例えば x == y という式を指定したとしよう☆」

 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .  [.]
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .  [.]  .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .  [.]  .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .  [.]  .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .  [.]  .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .  [.]  .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .  [.]  .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .  [.]  .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .  [.]  .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .  [.]  .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .  [.]  .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .  [.]  .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .  [.]  .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .  [.]  .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .  [.]  .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .  [.]  .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .  [.]  .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .  [.]  .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
[.]  .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
Succeed : 1938
Failed  : 27303
total   : 29241
Rate    : 0.0663
Info    : Finished.

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 結果は 0.0663 だぜ☆ このレートが1に近づくように競う☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 昨日やってた掛け算じゃない!」

KIFUWARABE_80x100x8_01_Futu.gif
「 もう答えが分かった気がするぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 やってみろだぜ☆」

return x == y and 9 < x and 9 < y
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .  [.]
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .  [.]  .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .  [.]  .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .  [.]  .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .  [.]  .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .  [.]  .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .  [.]  .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .  [.]  .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .  [.]  .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
Succeed : 1788
Failed  : 27453
total   : 29241
Rate    : 0.0611
Info    : Finished.

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 残念だったな☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 むう☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 はい、はい!」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 やってみろだぜ☆」

return x == y and 0 < x and 0 < y
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .  [.]
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .  [.]  .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .  [.]  .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .  [.]  .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .  [.]  .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .  [.]  .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .  [.]  .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .  [.]  .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .  [.]  .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .  [.]  .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .  [.]  .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .  [.]  .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .  [.]  .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .  [.]  .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .  [.]  .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .  [.]  .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .  [.]  .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .  [.]  .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .
Succeed : 1956
Failed  : 27285
total   : 29241
Rate    : 0.0669
Info    : Finished.

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 確かに増えたが、細かいな☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 勝ちは 勝ちよ!」

コンピューターを作ろうぜ☆

 .   .   .   .
 .   .   .   .
 .   .   .   .
 .   .   .   .

KIFUWARABE_80x100x8_01_Futu.gif
「 4x4 ぐらいのサイズなら ブルートフォース・サーチ で解けるんじゃないか☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 自分の頭で解かなければ 将棋の観戦記者 に怒られるぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 アルゴリズムを考えるのも 頭を使うのよ!」

# x == 3 and y == 3
 .   .   .  [.]
 .   .   .   .
 .   .   .   .
 .   .   .   .
Succeed : 9
Failed  : 27
total   : 36
Rate    : 0.2500
Info    : Finished.

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 右上は 箱 にするのが鉄板だろ☆
これを上回る 箱 の置き方は 果たして存在するのか☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 箱を置くと、 置けなくなる四角形の数 より 置けるようになる四角形の数 が多くなるマスに
置いたらいいんだぜ☆」

# (x == 3 and y == 3) or (x == 2 and y == 3)
 .   .  [.] [.]
 .   .   .   .
 .   .   .   .
 .   .   .   .
Succeed : 12
Failed  : 24
total   : 36
Rate    : 0.3333
Info    : Finished.

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 やるな☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 じゃあ 端っこを埋めれば いいんじゃないの?」

# (x != 0 and y == 3) or (x == 3 and y != 0)
 .  [.] [.] [.]
 .   .   .  [.]
 .   .   .  [.]
 .   .   .   .
Succeed : 13
Failed  : 23
total   : 36
Rate    : 0.3611

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 毎度 1個しか増えてない☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 勝てばいいのよ!」

KIFUWARABE_80x100x8_01_Futu.gif
「 箱が多すぎても 足の踏み場が無くなるのか……☆」

# (x != 0 and y % 2 == 1) or (x % 2 == 1 and y != 0)
 .  [.] [.] [.]
 .  [.]  .  [.]
 .  [.] [.] [.]
 .   .   .   .
Succeed : 10
Failed  : 26
total   : 36
Rate    : 0.2778
# return x % 2 == 1 and y % 2 == 1
 .  [.]  .  [.]
 .   .   .   .
 .  [.]  .  [.]
 .   .   .   .
Succeed : 9
Failed  : 27
total   : 36
Rate    : 0.2500

KIFUWARABE_80x100x8_01_Futu.gif
「 思っている形に 箱が並ばないぜ☆」

# (y * 4 + x) % 2 == 1
 .  [.]  .  [.]
 .  [.]  .  [.]
 .  [.]  .  [.]
 .  [.]  .  [.]
Succeed : 0
Failed  : 36
total   : 36
Rate    : 0.0000

KIFUWARABE_80x100x8_01_Futu.gif
「 ファンブルを引いてしまった☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 どうやって ナナメ にするんだぜ☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ナナメは x軸とy軸の両方が協力して作るものだぜ☆
片方の軸だけ がんばっても ナナメ は作れない☆
この感覚は 行列 で遊ぶと見に付く☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 協力とは何なのか……☆」

# (x + y) % 2 == 1
[.]  .  [.]  .
 .  [.]  .  [.]
[.]  .  [.]  .
 .  [.]  .  [.]
Succeed : 0
Failed  : 36
total   : 36
Rate    : 0.0000

KIFUWARABE_80x100x8_01_Futu.gif
「 あっ、簡単に ナナメ になったぜ☆! そして ファンブルした☆」

# (x + y) % 2 == 0 and 2 &lt; (x+y)
 .  [.]  .  [.]
 .   .  [.]  .
 .   .   .  [.]
 .   .   .   .
Succeed : 13
Failed  : 23
total   : 36
Rate    : 0.3611

KIFUWARABE_80x100x8_01_Futu.gif
「 対角線を挟んで右上半分に ナナメ に置いても 13個かだぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 もう ナナメ を使いこなしている……☆
わたしのアドバイスは優秀……☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 なるほど、左端と下端に 箱は要らないのね」

 .  [.]  .  [.]
 .   .  [.] [.]
 .   .   .  [.]
 .   .   .   .
Succeed : 14
Failed  : 22
total   : 36
Rate    : 0.3889

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 じゃあ もう1個 埋めても 伸ばせるわよ」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 細かい……☆ 常に他人のアイデアより1点多めに乗せてくる 羽生善治みたいな勝ち方をするよな☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 勝てばいいのよ!」

# 3 &lt; (x+y)
 .  [.] [.] [.]
 .   .  [.] [.]
 .   .   .  [.]
 .   .   .   .
Succeed : 15
Failed  : 21
total   : 36
Rate    : 0.4167

KIFUWARABE_80x100x8_01_Futu.gif
「 じゃあ いっそ これでいいのでは☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 わらう☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 このゲームの必勝攻略法みたいな勝ち方してない?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 じゃあ コンピューターの使い時かだぜ☆?
人の頭は もう十分に使っただろう……☆」

コンピューターを使おうぜ☆?

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 問題をコンピューターに解かせるために、必要になる下準備を説明する☆」

# No. 0
 .   .   .   .
 .   .   .   .
 .   .   .   .
 .   .   .   .
# No. 1
 .   .   .   .
 .   .   .   .
 .   .   .   .
[.]  .   .   .
# No. 2
 .   .   .   .
 .   .   .   .
 .   .   .   .
 .  [.]  .   .
# No. 3
 .   .   .   .
 .   .   .   .
 .   .   .   .
[.] [.]  .   .

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 例えば このように すべてのケースを網羅する表を作りたいわけだぜ☆
完全解析するなら 2 の 16乗で 65536 パターンある☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 げぇっ☆!」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 それ以外に、完全解析ではなく そこそこ いい感じの答えが出ればいいケースなら
近似計算や、統計的確率 など 使える道具が増えていき、機械学習の活躍の分野が広がる☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 人間は 65536 パターンも調べたの?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 さっきの 4x4の練習では 10パターン調べただけで 完全攻略法か☆?と 期待できる解法を見つけているが、
それが 完全攻略法かどうかは 検証していないぜ☆ 多分そう思う、というだけで☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 人間の知能は 効率が良すぎだろ☆」

# x == y
 .   .   .  [.]
 .   .  [.]  .
 .  [.]  .   .
[.]  .   .   .
# 0 == y-x
 .   .   .  [.]
 .   .  [.]  .
 .  [.]  .   .
[.]  .   .   .

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ところで x == y0 == y-x は同じことを言っているのが お分かりいただけるであろうか☆?
両辺に -x を足しただけだが、これを 移項 という☆
0 == y-x の方で 0 が出てきたが、この 0 は誤差を表している☆
あとで 少しの誤差ぐらい許してくれたっていいじゃないか、と気が変わったときは 1 > abs(y-x) といった書き方に 書き換えやすいので、
0 == y-x の形を使っていくことにするぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 じゃあ 0~65536 の 65536の全パターンに対応した式は どのように立てるだろうか☆?」

# 0b1000010000100001
 .   .   .  [.]
 .   .  [.]  .
 .  [.]  .   .
[.]  .   .   .

KIFUWARABE_80x100x8_01_Futu.gif
「 16桁の2進数でいいと思う☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 x, y と == をどう使うんだぜ☆?」

# x=0, y=0
 .   .   .   .
 .   .   .   .
 .   .   .   .
[.]  .   .   .

KIFUWARABE_80x100x8_01_Futu.gif
「 x と y は2つで1マスだから……☆」

# y // 4 + x
12 13 14 15
 8  9 10 11
 4  5  6  7
 0  1  2  3

KIFUWARABE_80x100x8_01_Futu.gif
「 x は列、y は行で、 1行は4列だから、
y//4+x で上図のように 番地 を振ることができると思う☆」

# 0b100 == 1 &lt;&lt; 2

KIFUWARABE_80x100x8_01_Futu.gif
「 番地は、立てたい桁 に対応する☆
例えば 2進数 100 は 2番地 に対応するが、1の位を0桁目として数え始めて 2桁目に 1 を立てることに対応する☆」

# 100 == 0b1000010000100001 & 0b100

KIFUWARABE_80x100x8_01_Futu.gif
「 2桁目が 0 か 1 かだけ調べたいときは ANDマスク の出番だぜ☆
2桁目以外を 0 に落としてくれるので 100 か 0 かの比較になる☆」

 .   .   .  [.]
 .   .  [.]  .
 .  [.]  .   .
[.]  .   .   .
def is_red_zone(x, y):
    """
    右上の足だけが踏めるマス。
    """

    address = (y*4)+(x % 4)
    binary = 1 << address
    return (0b1000010000100001 & binary) == binary

KIFUWARABE_80x100x8_01_Futu.gif
「 このような式は ビットボード と呼ぶ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 さすが コンピューター将棋ソフトよね!」

KIFUWARABE_80x100x8_08_Gentleman.gif
「 うむ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 もうビットボード流行ってないけどな☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 ……☆」

from lib.calculator import Calculator

bitboard = 0b1000010000100001


def is_red_zone(x, y):
    """
    右上の足だけが踏めるマス。
    """

    address = (y*4)+(x % 4)
    binary = 1 << address
    return (bitboard & binary) == binary


calculator = Calculator(4, 4)

for i in range(0, 65536):
    bitboard = i
    calculator.set_red_zone(is_red_zone)
    print("#{}".format(i))
    calculator.show_table()

calculator.calculate()
calculator.show_report()

print("Info    : Finished.")
# 前略
#3459
 .   .   .   .
[.]  .  [.] [.]
 .   .   .  [.]
[.] [.]  .   .
#3460
 .   .   .   .
[.]  .  [.] [.]
 .   .   .  [.]
 .   .  [.]  .
#3461
 .   .   .   .
[.]  .  [.] [.]
 .   .   .  [.]
[.]  .  [.]  .
#3462
 .   .   .   .
[.]  .  [.] [.]
 .   .   .  [.]
 .  [.] [.]  .
#3463
 .   .   .   .
[.]  .  [.] [.]
 .   .   .  [.]
[.] [.] [.]  .
# 後略

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 きふわらべが ビットボードを作ってくれたので
ループで回せるようになったぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 よし、コンピューターの答えが出た☆」

Succeed : 16
Failed  : 20
total   : 36
Rate    : 0.4444
Info    : Finished.

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 ちょっと待って!
16 ?!

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 わたしは 答えを見てしまったので、考えたかったら お前らで考えろだぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 まったく分からん☆
もっと ごちゃごちゃ した図形なのか、
それとも もっと 答えはシンプルなのか☆? まずは その方向性からだぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 立ち直れないわよね。」

答えを見たあとで

KIFUWARABE_80x100x8_01_Futu.gif
「 なんだ、人類は 手前まで行ってたんじゃないか☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 そこが手前かどうかなんて 分かんないのよ!」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 これが このゲームの必勝法なのか 気になるよな☆
19路盤でも試してみようぜ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 止めておいた方がいい☆
ブルートフォース・サーチなんで☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 攻略法は見えたわけで、直接 答えを打ち込んでみようぜ☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 あれっ☆? Python3 動かね☆
2進数361桁は 桁数が多すぎとか あるのかだぜ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 5路盤から順に やっていこうぜ☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 5路盤でも Python3 動かね☆
2進数25桁で ダメとか あるのかだぜ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 上限は無いはずだぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 あっ、マジックナンバーを変えてなかったぜ☆ 変数に修正☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 うーん、いい方法ではないか、ということしか分からないな☆
盤がでかいと 調べきれないぜ☆」

乱択アルゴリズムで調べようぜ☆(^~^)?

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 4路盤では 65536 パターンだったが、
5路盤では 33554432 パターン、
19路盤では 4697085165547666455778961193578674054751365097816639741414581943064418050229216886927397996769537406063869952 パターンになるぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 完全解析はムリ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 このゲームは、正解が1個だけで それを当てるしかないのか、
それとも 上位5%ぐらいに入る良い回答を当てに行くのか、
それとも 半分は正解なのか、
のような 分布によって 攻略に向いているアルゴリズムは変わってくるが……☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 多分 正解は 1個 だけ頭1つ抜けていて、
同率2位が少し、同率3位がもうちょっと多い、みたいな ひし形の形をしているのよ」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 じゃあ 乱択アルゴリズム で ひし形の上半分は 当てに行けるな☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 すでに出た 必勝っぽい攻略法を使えば 上位5% ぐらい当てに行けそうなゲームじゃないか これ☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 だったら 乱択アルゴリズム と わたしたち で どっちが勝つか やろうぜ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 じゃあ 5路盤で☆
今度は コンピューターの先手で☆」

import random
from lib.calculator import Calculator

# Settings.
width = 5
height = 5
num_of_states = 2 ** (width*height)


def is_red_zone(x, y):
    """
    右上の足だけが踏めるマス。
    """

    address = (y*height)+(x % width)
    binary = 1 << address
    return (bitboard & binary) == binary


# Clear.
bitboard = 0
calculator = Calculator(width, height)
best_sum = {"bitboard": 0, "succeed": 0, "failed": 0, "total": 0, "rate": 0}

# 試行回数
try_count = 2 ** 16
if num_of_states < try_count:
    try_count = num_of_states

for i in range(0, try_count):
    if i % 5000 == 0:
        print("Progress: {}/{} ({:>3.0f}%)".format(i,
                                                   try_count, i/try_count*100))

    # Randomized algorithm.
    bitboard = random.randint(0, num_of_states-1)

    calculator.set_red_zone(is_red_zone)
    # print("#{}".format(bitboard))
    # calculator.show_table()
    calculator.calculate()
    sum = calculator.get_report_sum()
    if best_sum["rate"] < sum["rate"]:
        best_sum = {
            "bitboard": bitboard,
            "succeed": sum["succeed"],
            "failed": sum["failed"],
            "total": sum["total"],
            "rate": sum["rate"]
        }

# Result.
print("Bitboard : {}".format(best_sum["bitboard"]))
print("Succeed  : {}".format(best_sum["succeed"]))
print("Failed   : {}".format(best_sum["failed"]))
print("total    : {}".format(best_sum["total"]))
print("Rate     : {:>.4f}".format(best_sum["rate"]))

print("Info     : Finished.")
Bitboard : 25698432
Succeed  : 33
Failed   : 67
total    : 100
Rate     : 0.3300

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 なんか ピッタリ 3分の1 というキリのいい数字を出してきてるぜ☆
きっちり有効桁数2桁の Python3 わらう☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 ちょっと 乱択アルゴリズム 強すぎない!?」

KIFUWARABE_80x100x8_01_Futu.gif
「 まだ負けたと決まったわけではないぜ☆
ビットボードを表示してくれだぜ☆」

 .   .   .  [.] [.]
 .   .   .   .  [.]
 .   .   .  [.]  .
 .   .  [.]  .   .
 .   .   .   .   .

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 これが答えだと言われても 納得してしまう かっこよさ がある☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 しっぽを切って 右上3つにしてみましょう」

 .   .   .  [.] [.]
 .   .   .   .  [.]
 .   .   .   .   .
 .   .   .   .   .
 .   .   .   .   .
Succeed : 33
Failed  : 67
total   : 100
Rate    : 0.3300

KIFUWARABE_80x100x8_01_Futu.gif
「 これも33%だぜ☆!」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 もう1回 コンピューターに反撃のチャンスをやろうかだぜ☆
乱択アルゴリズムは 回数を増やして 良いとこ取りすれば より良い答えが出る☆」

Bitboard : 30146816
 .   .  [.] [.] [.]
 .   .   .  [.] [.]
 .   .   .   .   .
 .   .   .  [.]  .
 .   .   .   .   .
Succeed  : 36
Failed   : 64
total    : 100
Rate     : 0.3600

KIFUWARABE_80x100x8_01_Futu.gif
「 上げてきた☆!」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 なんだこの かっこいい図形☆?」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 しっぽを右上にずらして、右上6つにしてみましょう」

 .   .  [.] [.] [.]
 .   .   .  [.] [.]
 .   .   .   .  [.]
 .   .   .   .   .
 .   .   .   .   .
Succeed : 41
Failed  : 59
total   : 100
Rate    : 0.4100

KIFUWARABE_80x100x8_01_Futu.gif
「 勝った☆!」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 気持ち3分の1ぐらいの右上角を詰める戦略は 最強なんじゃないか☆?」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 コンピューターの反撃を待ちましょう」

Bitboard : 30040320
 .   .  [.] [.] [.]
 .   .  [.]  .  [.]
 .   .   .  [.] [.]
 .   .   .  [.]  .
 .   .   .   .   .
Succeed  : 37
Failed   : 63
total    : 100
Rate     : 0.3700

KIFUWARABE_80x100x8_01_Futu.gif
「 どうなった☆!?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 人類の勝ちだぜ☆」

KIFUWARABE_80x100x8_10_Yattaze.gif
「 やったぜ☆!」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 どうして 人類は 良い方法に 早くたどり着くの?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 大きな分岐点に狙いを付けて やってみて、こんなこと やっていても ダメだというルールを見つけることができるからだろ☆
ダメなものの 処分が早い☆」

ツイッターでシェア
みんなに共有、忘れないようにメモ

むずでょ@きふわらべ第29回世界コンピューター将棋選手権一次予選36位

光速のアカウント凍結されちゃったんで……。ゲームプログラムを独習中なんだぜ☆電王戦IIに出た棋士もコンピューターもみんな好きだぜ☆▲(パソコン将棋)WCSC29一次予選36位、SDT5予選42位▲(パソコン囲碁)AI竜星戦予選16位

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント