HaskellでAtCoder Beginner Contest 093を解いてみました。
A
そのまま。
a.hs
import Data.List
main = do
str <- getLine
putStrLn $ if elem str $ permutations "abc" then "Yes" else "No"
と思ったら条件より以下の方が適切でした。
a.hs
import Data.List
main = do
str <- getLine
putStrLn $ if nub str == str then "Yes" else "No"
B
そのまま。
b.hs
import Data.List
solve :: Int -> Int -> Int -> [Int]
solve a b k =
if b-a+1 > 2*k then [a..a+k-1] ++ [(b-k+1)..b]
else [a..b]
main = do
[a,b,k] <- map read . words <$> getLine :: IO [Int]
mapM print (solve a b k)
C
case部分が汚いが一応通る。もう少しスマートに書きたい。
c.hs
import Data.List
solve :: Int -> Int -> Int -> Int
solve a b c =
(div (z - x) 2) + (div (z - y) 2) +
case ((z - x) `mod` 2) + ((z - y) `mod`2) of
0 -> 0
1 -> 2
2 -> 1
where
[x,y,z] = sort [a,b,c]
main = do
[a,b,c] <- map read . words <$> getLine :: IO [Int]
print $ solve a b c
D
これで動かないことも知ってるしそもそもTLE...
あとで書き直します。
d.hs
import Control.Monad
import Data.List
solve :: [[Int]] -> [Int]
solve [] = []
solve ([a,b]:qs) =
e : solve qs
where
maxInt = 10^10^10
e = length [(x,y) | x<-[1..(max a b)],y<-[1..(max a b)],x/=a&&y/=b&&x*y<a*b]
main = do
q <- read <$> getLine ::IO Int
ql <- replicateM q $ map read . words <$> getLine ::IO [[Int]]
mapM print $ solve ql