パーソナルブログメモリ

a = [1, 1]
for _ in "*" * 999: a += [sum(a[-2:])]
print(a)

Haskellで解いたオセロの問題で全力解説してみる2

2021-11-12 | ML系言語に挑む

Haskellで解いたオセロの問題で全力解説してみる

の続きです。ソースと説明文が離れてしまったのでページを分けソースの再掲載から再開します。前回のあらすじ

文字列の追加は ++ 

intercalate リスト型に入った文字列を結合

関数名 引数 引数とスペース区切り

lengthは文字列の長さ

showは数値を文字列に変換

wordsは文字列をスペース区切り

!!nはリストのn番目を取得

putStrLn "hello world" 文字列を表示

24行目まで説明しています。

関数の概略

turns(関数名) 一次元化したbd 位置p 自分駒c 相手駒o 検索方向のリストli 反転したコマの数n(引数)

盤を検索方向に検索させていき、検索終了時、反転がなければ"NULL" 反転があれば白の数と黒の数を返します。

 

turn(関数名)  一次元化したbd 位置p 自分駒c 相手駒o 検索方向d 反転したコマの数n(引数 以下略)

盤を検索方向に検索、検索終了時、反転する数をnに追加して返します。

 

count  一次元化したbd カウントする色c

文字列のbdの中にcの文字の登場位置をリストにして戻す関数を呼び出しリストの個数を返します。

 

alNum 文字列を数値化して戻す

a4 b8といったオセロ特有の座標を左上[0, 0]とした座標に変換しています。いただきものを加工 元々は置換関数

詳細はブラックボックス(よくわかっていない)。

 

findPos 文字列s 検索文字c

文字列の中にある検索文字の開始位置の全てをリスト化して返す。 いただきものの技術的にはブラックボックス。

 

 

再度掲載して、各行の解説24行目から

24 bdはオセロのボードの外側に検索終了用に"-"を不可したもので10x10を一次元化したものです。縦横斜めの

検索方向を[-11,-10,-9..] リストの設定 左上 上 右上と設定しています。

 

26 turns(関数名) 一次元化したbd 位置p 自分駒c 相手駒o 検索方向のリストli 反転コマ数n(引数)

27 検索リストが空で反転数が0なら”NULL"を返す = はthenのようなものでしょうか

  は1つ1つの判断の区切り、 =の前にある条件にマッチしたものを上から優先で返します。

28 検索リストが空で自分の色が白 なら ボードの自分の色数 + 反転した駒の数と置いた駒(+1)

 ボードの相手の色数 ー 反転した駒の数をスペース区切りで数値から文字列化 (show n)

30 検索リストの先頭とったものを次のli 、検索方向(先頭)への反転数を足したn 設定して再度呼び出し

 listの先頭n個を削除 (drop n list)  したリスト

 

32 turn(関数名)  一次元化したbd 位置p 自分駒c 相手駒o 検索方向d 反転したコマの数n(引数)

33 検索位置が'-' ゲーム盤の空白なら 0を返す。

34 検索位置が相手駒なら反転対象を1追加して次の検索へ

35 検索位置が自分駒ならこれまでの反転対象を返す。

 

38 文字列を検索していき aからhまでは文字コード化 (ord c)して-97を引く、ここでは残りのケースは数字想定

なので’1’が数値の0になるように49引いています。

39 aリストとbリストをまとめる (zip a b) ここではs文字列と[0..] 0からの無限数列をまとめています。

(リストの少ない方の最期まで実行) sの個々の文字列をx 数列をiに入れて文字列内をループ cとxが同じならiをリスト

に残していきます。

 

以上です。

 

<参考文献>

https://www.codingame.com/training/medium/othello


最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。