1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Haskell で AtCoder をやってみる(ABC001)

Last updated at Posted at 2017-01-14

問題 A に挑戦

import Control.Applicative

main :: IO ()
main = do
    x <- read <$> getLine
    y <- read <$> getLine
    putStrLn $ show $ x - y

正解!ヒャッハーーーー!!

問題 B に挑戦

import Control.Applicative
import Text.Printf

main :: IO ()
main = do
    m <- (/1000) . read <$> getLine
    putStrLn $ calc m

calc :: Double -> String
calc x | x < 0.1               = "00"
       | x >= 0.1 && x <= 5.0   = printf "%02d" $ (truncate $ x * 10 :: Int)
       | x >= 6.0 && x <= 30.0  = show $ (truncate $ x + 50 :: Int)
       | x >= 35.0 && x <= 70.0 = show $ (truncate $ ((x - 30) / 5) + 80 :: Int)
       | otherwise             = "89"

またまた正解!フォーーーーーーー!!!

問題 C に挑戦

import Control.Applicative

main :: IO ()
main = do
    [x, y] <- map read . words <$> getLine
    let calcY = (roundUp $ ((fromIntegral y) / 60) * 10) * 6
    let resY = checkW calcY $ wList wPower wMinSpeed wMaxSpeed
    let resX = if resY == 0 then "C" else checkD (x * 10) $ dList dName dMinAngle dMaxAngle
    putStrLn $ resX ++ " " ++ show resY

roundUp :: (RealFrac a, Integral b) => a -> b
roundUp x
    | n <= -0.5 = m - 1
    | n >= 0.5  = m + 1
    | otherwise = m
    where (m, n) = properFraction x

class Check a where
    check :: a -> Int -> Bool
data Direction = Direction { name :: String , minAngle :: Int , maxAngle :: Int } deriving Show
instance Check Direction where
    check (Direction _ minA maxA) x = if x >= minA && x < maxA then True else False

-- 方位
dName :: [String]
dName = ["NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW"]

dMinAngle :: [Int]
dMinAngle = [1125, 3375..32625]

dMaxAngle :: [Int]
dMaxAngle = [3375, 5625..34875]

dList :: [String] -> [Int] -> [Int] -> [Direction]
dList [] [] [] = []
dList (x:xs) (y:ys) (z:zs) = createD x y z : dList xs ys zs
    where
        createD dx dy dz = Direction { name = dx, minAngle = dy, maxAngle = dz }

checkD :: Int -> [Direction] -> String
checkD t ys = case res of
        [] -> "N"
        otherwise -> name $ head res
    where
        res = flip filter ys $ \y -> check y t

-- 風力
data Wind = Wind { power :: Int , minSpeed :: Int , maxSpeed :: Int } deriving Show
instance Check Wind where
    check (Wind _ minS maxS) x = if x >= minS && x < maxS then True else False

wPower :: [Int]
wPower = [0..11]

wMinSpeed :: [Int]
wMinSpeed = 0:xs
    where
        xs = map (\x -> (truncate (x * 60)) + 1) [0.2, 1.5, 3.3, 5.4, 7.9, 10.7, 13.8, 17.1, 20.7, 24.4, 28.4]

wMaxSpeed :: [Int]
wMaxSpeed = map (\x -> (truncate (x * 60)) + 1) [0.2, 1.5, 3.3, 5.4, 7.9, 10.7, 13.8, 17.1, 20.7, 24.4, 28.4, 32.6]

wList :: [Int] -> [Int] -> [Int] -> [Wind]
wList [] [] [] = []
wList (x:xs) (y:ys) (z:zs) = createW x y z : wList xs ys zs
    where
        createW wx wy wz = Wind { power = wx, minSpeed = wy, maxSpeed = wz }

checkW :: Int -> [Wind] -> Int
checkW t ys = case res of
        [] -> 12
        otherwise -> power $ head res
    where
        res = flip filter ys $ \y -> check y t

正解、やったぜ!
しかし、コードが長すぎるような・・・
今度書き換えよう・・・

問題 D 挑戦中

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?