パーソナルブログメモリ

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

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

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

 問題はオセロの盤面データ、自分の色、置く場所が与えられ置いてひっくり返した後の白 黒の数を答えるという

もの例外としてすでに置かれていれば"NOPE" ひっくり返せない場所なら"NULL"を答えなければならない。盤の状態

は黒’B' 白'W' なしは '-'で8文字ずつ8行分渡される。自分の色と置く場所はスペース区切りで”B c4"とか渡される。

c4は3列4行目、a8なら1列8行目。

 

提出ソース

1〜4 インポート

6〜8 雛型をそのまま

9  8回繰り返した結果をリスト型でaに代入

10 1行取得

11 文字列の追加は ++ bdはオセロ盤の状態を外側を"-"で囲ったものです。

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

 

 関数呼び出しは関数名 引数 引数とスペース区切りで読びだす。カンマ区切りがないので引数を加工する場合

()でくくらないといけない。intercalateは関数 引数はつなぎ文字 文字列のリスト。()の終わりが文の終わりの時は

先頭の(の部分を$ にすると後ろの)は省略できます。

 

13 hPutStrLn  stderrに 次の文字列を表示します。stderrはエラー出力です。lengthは文字列の長さを取得、

showは数値を文字列に変換する関数です。(show (length bd))を先程の$で省略しています。

 

16 letは変数の定義、最初一回代入しかできません。関数1回呼び出しごとに世界(圏)があってその中で変数は

常に同じ値です。値を変更する場合は別の世界に移る際に変更して呼び出します。ループして変更はできず。変更

したい時は世界を飛び越えるしかありません。そのため個々の世界は同じになるため分散処理などに向いているの

かもしれません。関数型プログラミングとか呼ばれたりもしています。wordsは文字列をスペース区切りします。

 

17 input!!nはリストのn番目を取得する重要な技。ここでは変数inputは文字列のリスト、1文字でも文字列型、

文字列に対して!!を使うと文字列のnはChar型になります。自分の駒の色をcに設定しています。

 

18 if thenはelseが必須になります。ここでは相手の駒の色をoに設定しています。==は同じなら、違う時は/=

だそうです。(まだ使ったことない)

 

21 "c4"などを[3,4]とx,y座標に変換しています。

22 [3,4]などのx,y座標を一次元に展開したbdの位置Pに変換しています。

23、24 1行が長いので分割、分割時には前の行より後ろの位置にしないとエラーになります。駒の置く位置が

開いている時は反転計算を表示、開いていない時は putStrLn "NOPE" 文字列を表示します。

 

後半へ続く

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

 

<参考文献>

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


最新の画像もっと見る

コメントを投稿

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