
On Wed, Feb 04, 2009 at 12:10:02PM +0100, Heinrich Apfelmus wrote:
Magnus Therning wrote:
Here's a version using span from the Prelude:
main = interact $ unlines . map show . countDays . lines
countDays [] = [] countDays (day:xs) = (day, length people) : countDays xs' where (people, xs') = span (isSpace . head) xs
Note that this file format is very simple and it's ok to use lines and isSpace to parse it. But the tool of choice are parser combinators like Text.Parsec or Text.ParserCombinators.ReadP .
Let me also point out that using the 'split' package from Hackage [1], we can implement this nicely without any icky manual recursion, and without resorting to a full-blown parsing library: import Data.List.Split import Data.Char main = interact (unlines . map show . countDays . lines) countDays = map length . tail . splitWhen isDay where isDay = not . isSpace . head 'splitWhen' splits the list of lines into chunks using things that satisfy the predicate as delimiters; then we just 'map length' over those chunks to count the people for each day. The 'tail' is necessary because the split actually produces a blank list of people *before* the first day, but otherwise this is entirely straightforward. -Brent [1] http://hackage.haskell.org/cgi-bin/hackage-scripts/package/split