05 July, 2006

[Haskell] ICPC 2006 Domestic, Problem A

2006-07-04 @ HaHaHa!International Collegiate Programming Contest : Domestic Contest 2006の存在を知る。

HaHaHa! の答えを見ないで簡単そうな問題を解いてみる事にする。とりあえず問題Aが簡単そう。
...うぅぅむ、入出力のところが判らない。「ふつける」か「入門Haskell」 を読まないと駄目かなぁ。
エラトステネスの篩の部分はとりあえず教科書からコピペ。(まぁ慣用句みたいなものだし...)

primes :: [Int]
primes = 2:(sieve [3, 5 ..])
where sieve (p:xs) = p: (sieve [ x | x <- xs, x `mod` p /= 0])

arithSeriesPrimes :: (Int, Int) -> [Int]
arithSeriesPrimes (a,d) = [ x | x <- primes, x >= a, (x-a) `mod` d == 0]

answer :: (Int, Int, Int) -> Int
answer (a, d, n) = last $ take n $ arithSeriesPrimes (a,d)

Prelude> :load acm2006a.hs
Compiling Main ( acm2006a.hs, interpreted )
Ok, modules loaded: Main.
*Main> answer (179,10,203) --- これは時間がかかった
6709
*Main> answer (179,10,203) --- これはすぐに答えが出た
6709
*Main> answer (271,37,39) --- これも割と早い?
12037
*Main> answer (367,186,151) --- これも時間がかかった
92809
*Main> answer (27,104,185) --- これは早い。
93523

primesは毎回最初から計算している訳ではなく、計算した所までは答えが記憶されているようだ。
うぅぅむ、入出力のところをちゃんと書ける様にしなくては。

一方で、この程度の問題ならJavaでもそんなに時間がかからずに書けるかも、とも思った。もっとパズル的な問題を解ける様にならねば。

No comments: