Quick actions

cmd+k|ctrl+k

Navigation

Languages

Untitled

Snippet info

Language

Haskell

Visibility

unlisted

Author

legacy-anonymous

Created

2017-02-14T15:39:16Z

Updated

2017-02-14T15:39:16Z

module RabbitPopulation (progressTime) where

import Data.List (sort)
import Debug.Trace (traceShow)

-- Data

type Age        = Int
type Months     = Int
type GrowthRate = Int

data RabbitPair = RabbitPair Age deriving (Eq, Ord)

instance Show RabbitPair where
   show (RabbitPair age) = 
     if age > 0 then "rr" ++ show age else "bb" ++ show age

-- Operations

makeBabies :: Int -> [RabbitPair]
makeBabies 0         = []
makeBabies numToMake = (RabbitPair 0) : makeBabies (numToMake - 1)

numberAdults :: [RabbitPair] -> Int
numberAdults pairs = length $ filter (\(RabbitPair age) -> age > 0) pairs

ageRabbits :: [RabbitPair] -> [RabbitPair]
ageRabbits = map (\(RabbitPair age) -> RabbitPair (age + 1))

growPop :: GrowthRate -> [RabbitPair] -> [RabbitPair]
growPop growthRate pairs = 
  (makeBabies (growthRate * (numberAdults pairs)))

progressTime :: Months -> GrowthRate -> [RabbitPair] -> [RabbitPair]
progressTime 1      growthRate rabbits = rabbits
progressTime months growthRate rabbits =
  traceShow rabbits $
     progressTime (months - 1) growthRate ((ageRabbits rabbits) ++ newborns)
       where newborns = growPop growthRate rabbits


main = do
  print $ progressTime 6 1 [(RabbitPair 0)]
INFO