Naomi's notebook

Naomi's notebook

AtCoder Beginners Selection in Haskell 完走

naomi-notebook.hatenablog.com

これの続きです
AtCoder Beginners Selection - AtCoder

ABC085C - Otoshidama

こんなループもリスト内記法で実装できます(これって一般的な書き方なんでしょうか?全く知りません)

import Control.Applicative 
import Control.Monad
import Data.List

solve::Int->Int->[(Int,Int)]->[Int]
solve n y [] = [-1,-1,-1]
solve n y (p:xs) | (fst p)*10000+(snd p)*5000+(n-(fst p)-(snd p))*1000==y = [(fst p),(snd p),(n-(fst p)-(snd p))]
    | otherwise = solve n y xs

main = do
    [n,y] <- (map read . words) <$> getLine
    let ans= solve n y [(a,b)|a<-[0..n],b<-[0..n-a]]
    putStrLn $ (map show ans)!!0++ " " ++  (map show ans)!!1 ++" "++ (map show ans)!!2

ABC049C - 白昼夢 / Daydream

はい。(そのまま)

import Control.Applicative 
import Control.Monad
import Data.List



solve::[Char]->Bool
solve [] = True
solve s 
    | (take 7 s)=="dreamer" = solve (drop 7 s) || solve (drop 5 s)
    | (take 6 s)=="eraser" = solve (drop 6 s) || solve (drop 5 s)
    | (take 5 s)=="dream" = solve (drop 5 s)
    | (take 5 s)=="erase" = solve (drop 5 s)
    | otherwise = False

main = do
    s <- getLine
    if solve s then putStrLn "YES" else putStrLn "NO"

ABC086C - Traveling

最初0秒の時0,0にいるのを忘れない(次の目標がすでに達成できない時がある)

import Control.Applicative 
import Control.Monad
import Data.List


solve::[[Int]]->Bool
solve [[_,_,_]] = True
solve (p@[a,b,c]:xs) = solve xs &&  distance>=0&&(mod distance 2)==0 where{(pp@[d,e,f]:xxs)=xs;distance=abs(d-a)-abs(b-e)-abs(c-f);} 


main = do
    n <- readLn
    txy <- map (map read . words) <$> replicateM n getLine
    
    if solve ([[0,0,0]]++txy) then putStrLn "Yes" else putStrLn "No"

終えた感想

競プロでACするだけならって別に型とか意識しなくてもできてしまったので、Haskell特有の何かは全く使っていない。少し残念。まあループとか条件分岐とかスラスラ書けるようにはなりました。