AtCoder Beginners Selection in Haskell 完走
これの続きです
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特有の何かは全く使っていない。少し残念。まあループとか条件分岐とかスラスラ書けるようにはなりました。