三目並べのパターン

2-3.Perl/Python/Ruby
「りゅうおうのおしごと!」Blu-ray Vol.2 封入特典キャラクターソング ダイジェスト試聴

アニメ『りゅうおうのおしごと!』(2017)

16歳で竜王のタイトルを取った主人公に、弟子ができます。
この弟子は、将棋を始めたばかりなのに、詰将棋の本だってあっという間に解いてしまう才能の持ち主ですが、なんと女子小学生。

勝ちに行くため体を前後に揺らし始める、白熱した対局が面白いです。 何十手も先読みするシーンが見ていてわくわくします。

先読みということで、将棋ではないですが、三目並べで全パターンから勝ちパターンとなるパターンを抽出してみます。
今回は気まぐれでpython使います。ソースです。

takk@deb9:~$ cat -n tictactoe.py 
     1	import itertools
     2	
     3	pm = list(itertools.permutations([1,2,3,4,5,6,7,8,9]))
     4	


1番が左上、9番が右下というように盤に番号を振り、どのような順序で○×が置かれたかのパターンを順列を求めてリスト化します。

     5	OWinlis=[]
     6	XWinlis=[]
     7	

先手○の勝ちリストとしてOWinlis
後手☓の勝ちリストとしてXWinlisを用意します。

     8	def judge(lis):
     9	  pattern=[
    10	  (1,2,3), (4,5,6), (7,8,9),
    11	  (1,4,7), (2,5,8), (3,6,9),
    12	  (1,5,9), (3,5,7),
    13	  ]

三目並んだかどうか判定するためのリストです。

右斜めに並んだ場合は、(1,5,9)のパターンが含まれているか判定すればよいことになります。

    14	  turn=0
    15	  Olis=[]
    16	  Xlis=[]
    17	  for m in lis:
    18	    if turn==0:
    19	      Olis.append(m)
    20	      if len(Olis) >= 3:
    21	        for p in pattern:
    22	          if 0 == len(set(p) - set(Olis)):
    23	            OWinlis.append(lis)
    24	            return

勝ちパターンpから今回のパターンOlisの差分を取ったとき、何も残らなければ、三目そろったことになるので、勝ちリストに加えて処理を終了します。

    25	    else:
    26	      Xlis.append(m)
    27	      if len(Xlis) >= 3:
    28	        for p in pattern:
    29	          if 0 == len(set(p) - set(Xlis)):
    30	            XWinlis.append(lis)
    31	            return
    32	    turn=1-turn
    33	
    34	for lis in pm:
    35	  judge(lis)
    36	
    37	print len(pm)
    38	print len(OWinlis)
    39	print len(XWinlis)

実行すると、全パターンと、○の勝ちパターン、☓の勝ちパターンのリスト数が表示されます。

takk@deb9:~$ python tictactoe.py 
362880
212256
104544
takk@deb9:~$ 

数が多すぎてこれが合ってるかどうかわからないので、確認する方法を考えないといけませんね。

コメント

タイトルとURLをコピーしました