Ticket #4005: 3.hs

File 3.hs, 1.6 KB (added by igloo, 9 years ago)

slightly smaller source

Line 
1
2module Main (main) where
3
4data Radical = H | C Radical Radical Radical
5 deriving (Eq,Show)
6
7three_partitions :: Int -> [(Int,Int,Int)]
8three_partitions m =
9  [ (i,j,k) | i <- [0..(div m 3)], j <- [i..(div (m-i) 2)], k <- [m - (i+j)]]
10
11remainders :: [a] -> [[a]]
12remainders [] = []
13remainders (r:rs) = (r:rs) : (remainders rs)
14
15radical_generator :: Int -> [[Radical]]
16radical_generator n = radicals
17 where radicals = [H] : [rads_of_size_n radicals j | j <- [1..n]]
18
19rads_of_size_n :: [[Radical]] -> Int -> [Radical]
20rads_of_size_n radicals n =
21  [ (C ri rj rk)
22  | (i,j,k)  <- (three_partitions (n-1)),
23    (ri:ris) <- (remainders (radicals!!i)),
24    (rj:rjs) <- (remainders (if (i==j) then (ri:ris) else radicals!!j)),
25    rk       <- (if (j==k) then (rj:rjs) else radicals!!k)]
26
27data Paraffin = CCP Radical Radical Radical Radical
28    deriving (Eq, Show)
29
30four_partitions :: Int -> [(Int,Int,Int,Int)]
31four_partitions m =
32  [ (i,j,k,l)
33  | i <- [0..(div m 4)],
34    j <- [i..(div (m-i) 3)],
35    let z = fromIntegral m / 2 :: Double,
36    k <- [(max j (ceiling z - i - j))..(div (m-i-j) 2)],
37    l <- [(m - (i+j+k))]]
38
39ccp_generator :: [[Radical]] -> Int -> [Paraffin]
40ccp_generator radicals n =
41  [ (CCP ri rj rk rl)
42  | (i,j,k,l) <- (four_partitions (n-1)),
43    (ri:ris)  <- (remainders (radicals!!i)),
44    (rj:rjs)  <- (remainders (if (i==j) then (ri:ris) else radicals!!j)),
45    (rk:rks)  <- (remainders (if (j==k) then (rj:rjs) else radicals!!k)),
46    rl        <- (if (k==l) then (rk:rks) else radicals!!l)]
47
48paraffins_until :: Int
49paraffins_until = length (ccp_generator radicals 27)
50 where
51  radicals = radical_generator 13
52
53main :: IO ()
54main = print paraffins_until
55