Atcoder #002と#003のAをHaskellで解く

Atcoder #002 A

getLineで入れて,isLeapyearでYES or NOを返して,putStrで表示するだけのお仕事

isLeapyear :: String -> String
isLeapyear ys
    | y `mod` 400 == 0 = "YES\n"
    | y `mod` 100 == 0 = "NO\n"
    | y `mod` 4 == 0 = "YES\n"
    | otherwise = "NO\n" 
    where y = read ys :: Int
 
main = do
s <- getLine
putStr $ isLeapyear s

Atcoder #003 A

なぜか紆余曲折を経た問題.実行後に最初の構想で書いたらできてる.不思議

point :: Char -> Double
point 'A' = 4
point 'B' = 3
point 'C' = 2
point 'D' = 1
point 'F' = 0
 
main = do
    _ <- getLine
    s <- getLine
    let l = map point s
    putStr $ (show $ (sum l) / (fromIntegral $ length l)) ++ "\n"

#001, #004はやっていない.(#003に時間を費やしてしまった.)

追記 やった

Atcoder #004 A

#004: 先駆者の方々のコード見て勉強します.

xy :: [String] -> [(Double, Double)]
xy ps = [(x, y) | p <- ps, let x = read (words p !! 0); y = read (words p !! 1)]
 
distall :: (Floating a) => [(a, a)] -> [a]
distall [p] = [0]
distall (p:ps) = [dist p ap | ap <- ps] ++ distall ps
 
dist :: (Floating a) => (a, a) -> (a, a) -> a
dist (x1, y1) (x2, y2) = sqrt $ (x1 - x2) ^ 2 + (y1 - y2) ^ 2
 
main = do
    n <- getLine
    rs <- sequence $ take (read n) (repeat getLine)
    print $ maximum . distall $ xy rs