結果
| 問題 |
No.193 筒の数式
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2018-08-03 22:19:32 |
| 言語 | Haskell (9.10.1) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 1,000 ms |
| コード長 | 1,275 bytes |
| コンパイル時間 | 5,267 ms |
| コンパイル使用メモリ | 170,880 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-09-19 17:27:46 |
| 合計ジャッジ時間 | 5,980 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 16 |
コンパイルメッセージ
Loaded package environment from /home/judge/.ghc/x86_64-linux-9.8.2/environments/default [1 of 2] Compiling Main ( Main.hs, Main.o ) [2 of 2] Linking a.out
ソースコード
import Control.Applicative ((<$>), (<|>))
import Control.Monad.State
import Data.Char (isDigit, isLetter)
import Data.List (foldl', tails, inits)
import Data.Maybe (catMaybes)
main :: IO ()
main = solve <$> getLine >>= print
solve :: String -> Int
solve s = maximum . catMaybes . map (parse expr) $ zipWith (++) (tails s) (inits s)
type Parser = StateT String Maybe
parse :: Parser a -> String -> Maybe a
parse = evalStateT
anyChar :: Parser Char
anyChar = do
s <- get
case s of
(x:xs) -> do
put xs
return x
[] -> lift Nothing
satisfy :: (Char -> Bool) -> Parser Char
satisfy f = do
c <- anyChar
if f c then return c
else lift Nothing
digit = satisfy isDigit
char c = satisfy (== c)
many :: Parser a -> Parser [a]
many p = (:) <$> p <*> many p <|> return []
many1 :: Parser a -> Parser [a]
many1 p = (:) <$> p <*> many p
eof :: Parser ()
eof = do
s <- get
case s of
[] -> lift $ Just ()
_ -> lift Nothing
expr :: Parser Int
expr = do
x <- num
fs <- many (plus <|> minus)
eof
return $ foldl' (\a f -> f a) x fs
num :: Parser Int
num = read <$> many1 digit
plus :: Parser (Int -> Int)
plus = do
char '+'
x <- num
return (+x)
minus :: Parser (Int -> Int)
minus = do
char '-'
x <- num
return (subtract x)