Open3

AtCoderを使ってHaskellを学ぶ

あぜんとあぜんと

Haskellの勉強をしたいので,暇な時にAtCoderで遊びながら構文とかを学びます.良かったらいい書き方など指摘して貰えると嬉しいです!

あぜんとあぜんと

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

こうなる.内側のii <- [1, 3..n]のジェネレータで奇数だけが代入されていく.その次のガード条件では,jで試し割りして得たiの約数のリストの長さが8である事を書く.

最後にprintと作ったsolve関数を関数合成して,入力readLnの結果を=<<solve関数に与えればOK.

Haskell難しい!forなどの繰り返し文がないので,どう繰り返すのか分からず他の人の提出コードを見ました.暫くはこうなりますが許して...><