Google Code Jam 2010: Qualification Round のメモ.
コンテンツ
解いた.とりあえず,問題文に骨が折れる. メモ,メモ.
A
そのまま.
import Control.Monad
import Text.Printf
light :: (Integral a, Integral b) => b -> a -> String
light n k | mod (k+1) (2^n) == 0 = "ON"
| otherwise = "OFF"
main :: IO ()
main = do (t:_) do
(n:k:_) IO [a]
getList = liftM (map read.words) getLine
B
そのままだったと思う.
import Control.Monad
import Text.Printf
multiple :: (Integral a) => [a] -> a
multiple (t:ts) = foldl1 gcd.filter (0/=).zipWith (-) (t:ts) $ ts++[t]
main :: IO ()
main = do (t:_) do
(n:ts) IO [a]
getList = liftM (map read.words) getLine
C
循環を見つけるコードが肥大化している.なんかダメだよね,このコード.
import Data.List
import Data.Set (Set)
import qualified Data.Set as Set
import Control.Monad
import Text.Printf
-- number of groups
g :: (Ord a, Num a) => a -> [a] -> Int
g k gs = length.takeWhile (<=k).scanl1 (+) $ gs
roll :: (Enum b, Num b, Num a, Ord a) => a -> [a] -> [(a, b)]
roll k _gs = ((0,0):) $ unfoldr (Just .f) gs
where gs = zip _gs [0..]
f xs = let n = g k.map fst $ xs
(as, bs) = splitAt n xs
ys = bs ++ as
in ((sum.map fst $ as, snd.head $ ys), ys)
period :: (Num t, Ord t) => [t] -> (Int, Int)
period xs = let (ps, qs) = part Set.empty [] xs
in (length ps - 1, length qs)
where part s ys (z:zs) | Set.member z s = (reverse $ ys, z:takeWhile (z/=) zs)
| otherwise = part (Set.insert z s) (z:ys) zs
count :: (Num a, Ord a) => Int -> a -> [a] -> a
count r k gs | r < p = sum $ take r ys
| otherwise = sum ys + fromIntegral a * sum zs + sum (take b zs)
where xs = roll k gs
(p, q) = period.map snd $ xs
(ys, zs) = splitAt p.take (p+q).tail$ map fst xs
(a, b) = divMod (r-p) q
main :: IO ()
main = do (t:_) do
(r:k:_) IO [a]
getList = liftM (map read.words) getLine
作成者 Toru Mano
最終更新時刻 2023-01-01 (c70d5a1)