はじめに

今月の目標で AtCoder の A 問題過去問全部埋めるのを含めていたけど終わった。

あたりまえだけど簡単な問題が多かった。その中でも学びがあったので書いておく

間違えなくなった

実装誤りがほとんどなくなった。

眠くて問題を読み間違えたとかそういう原因以外で実装しようと思ったものがうまくできていないとかはなくなった。

これは、F# がなじんできたとかそういう話だけではなくて間違いにくい実装をするようになった。

基本的に間違いやすい実装は if とかそういう構造文が入り組んでいる場合にあると思う。 そうじゃなくて演算をパイプしていく、 F# らしい実装をしていけば、個々のユニットは間違えようがないので最終的に間違えなくなる。

例えば、『数字 N が与えられます。N に 3 が含まれる、もしくは 3 で割り切れる場合は YES、それ以外は NO と出力してください。 (0 <= N <= 9)』こういう問題の時に

こういうコード書いてた

let readInt () = stdin.ReadLine() |> int
let choice ok ng bool = if bool then ok else ng

readInt ()
|> (%) <| 3
|> (=) 0
|> choice "YES" "NO"
|> printfn "%s"

やりすぎかもしれないけど、これが間違えにくいしわかりやすいと思うようになった。(いいのかはよくわからん)

スニペットが増えてきた

これだけ問題をやっていると同じような記述に気が付くので  VSCode のスニペットに登録している。

これが増えると楽になるので増やしていきたい。

リポジトリはこれ。

https://github.com/sterashima78/atcoder-f-sharp

最後に

今日 ABC175 だってことを忘れてて、これ書いてる途中で思い出した (もう始まってた)。

やはり難しめの問題はアルゴリズムもそうだけど、 F# でいい感じに書く方法で悩むので引き続き B 問題も埋めていきたい。

sterashima78

Web Frontend Engineer


© 2020 - 2021 — Terashima Shin