Open3
AtCoderを使ってHaskellを学ぶ
Haskellの勉強をしたいので,暇な時にAtCoderで遊びながら構文とかを学びます.良かったらいい書き方など指摘して貰えると嬉しいです!
環境構築
今の環境だとGHCupを使ってGHC(Haskellのコンパイラ)を入れたりするのがナウいらしいのでこれを入れる.「Haskellの環境構築2023」←こちらの記事が凄い分かりやすかったので参考にしました.
ABC106-B
試し割りで約数を出して,奇数かつ約数が8個の整数を出す.
Pythonみたいな感じでリスト内包表記がある.[式 | 限定子, 限定子, ... ]
といった感じで既存のリストから新しいリストを表現できる.限定子には以下の3つが指定できる.
- ジェネレータ
-
パターン <- 式
と書く.既存のリストから数を取ってくる時とかに使う.
-
- ガード条件
- リストの値が取り得る条件式を書く.
- 局所宣言
-
let
から始まる宣言を書く.内包表記の中だけで使える変数になる.
-
これを使って「奇数かつ約数が8個の整数を出す」リストを作ってそのlengthを出せば良い.
solve :: Int -> Int
solve n = length [i | i <- [1, 3..n], length[j | j <- [1..i], mod i j == 0] == 8]
main = print . solve =<< readLn
こうなる.内側のi
はi <- [1, 3..n]
のジェネレータで奇数だけが代入されていく.その次のガード条件では,j
で試し割りして得たi
の約数のリストの長さが8である事を書く.
最後にprint
と作ったsolve
関数を関数合成して,入力readLn
の結果を=<<
でsolve
関数に与えればOK.
Haskell難しい!forなどの繰り返し文がないので,どう繰り返すのか分からず他の人の提出コードを見ました.暫くはこうなりますが許して...><