日本情報オリンピックの問題
id:kenkitiiさんがふつうの haskellプログラミング読了&はじめてのhaskell - Λάδι Βιώσαςで日本情報オリンピックの問題を解いていらっしゃいます。おっ、これはHaskellにぴったり。ということで僕も解いてみました。実際の問題はこちらです。
n 個の整数からなる数列 a1, a2, ..., anと正整数 k (1 ≦ k ≦ n) が与えられる.
このとき,連続して並ぶ k 個の整数の和 Si = ai+ai+1+...+ai+k−1 (1 ≦ i ≦ n−k+1) の最大値を出力するプログラムを作りなさい
http://www.ioi-jp.org/joi/2006/2007-ho-prob_and_sol/2007-ho.pdf
ファイルI/Oは面倒なので省略しています。
こういう現実世界のドロドロとは無縁な問題を解いていると、あー、Haskellは何て素晴らしいんだと思います。Haskellの機能全てがラブいです。
module Main (main) where import Data.List (tails) calcMax :: Int -> [Int] -> Int calcMax k = maximum $ map sum $ filter ((==) k . length) $ map (take k) $ tails xs main :: IO () main = print $ calcMax 3 [2, 5, -4, 10, 3] -- => 11