Ticket #4005: 5.hs

File 5.hs, 2.8 KB (added by igloo, 9 years ago)
Line 
1
2module Main (main) where
3
4data Radical = H | C Radical Radical Radical
5
6three_partitions :: Int -> [(Int,Int,Int)]
7three_partitions m =
8  [ (i,j,k) | i <- [0..(div m 3)], j <- [i..(div (m-i) 2)], k <- [m - (i+j)]]
9
10remainders :: [a] -> [[a]]
11remainders [] = []
12remainders (r:rs) = (r:rs) : (remainders rs)
13
14radical_generator :: [[Radical]]
15radical_generator = radicals
16 where radicals = [H] : [rads_of_size_n radicals j | j <- [1..13]]
17
18rads_of_size_n :: [[Radical]] -> Int -> [Radical]
19rads_of_size_n radicals n =
20  [ (C ri rj rk)
21  | (i,j,k)  <- (three_partitions (n-1)),
22    (ri:ris) <- (remainders (radicals!!i)),
23    (rj:rjs) <- (remainders (if (i==j) then (ri:ris) else radicals!!j)),
24    rk       <- (if (j==k) then (rj:rjs) else radicals!!k)]
25
26data Paraffin = CCP Radical Radical Radical Radical
27
28four_partitions :: [(Int,Int,Int,Int)]
29four_partitions =
30    [(0,0,13,13), (0,1,12,13), (0,2,11,13), (0,2,12,12), (0,3,10,13),
31     (0,3,11,12), (0,4,9,13),  (0,4,10,12), (0,4,11,11), (0,5,8,13),
32     (0,5,9,12),  (0,5,10,11), (0,6,7,13),  (0,6,8,12),  (0,6,9,11),
33     (0,6,10,10), (0,7,7,12),  (0,7,8,11),  (0,7,9,10),  (0,8,8,10),
34     (0,8,9,9),   (1,1,11,13), (1,1,12,12), (1,2,10,13), (1,2,11,12),
35     (1,3,9,13),  (1,3,10,12), (1,3,11,11), (1,4,8,13),  (1,4,9,12),
36     (1,4,10,11), (1,5,7,13),  (1,5,8,12),  (1,5,9,11),  (1,5,10,10),
37     (1,6,6,13),  (1,6,7,12),  (1,6,8,11),  (1,6,9,10),  (1,7,7,11),
38     (1,7,8,10),  (1,7,9,9),   (1,8,8,9),   (2,2,9,13),  (2,2,10,12),
39     (2,2,11,11), (2,3,8,13),  (2,3,9,12),  (2,3,10,11), (2,4,7,13),
40     (2,4,8,12),  (2,4,9,11),  (2,4,10,10), (2,5,6,13),  (2,5,7,12),
41     (2,5,8,11),  (2,5,9,10),  (2,6,6,12),  (2,6,7,11),  (2,6,8,10),
42     (2,6,9,9),   (2,7,7,10),  (2,7,8,9),   (2,8,8,8),   (3,3,7,13),
43     (3,3,8,12),  (3,3,9,11),  (3,3,10,10), (3,4,6,13),  (3,4,7,12),
44     (3,4,8,11),  (3,4,9,10),  (3,5,5,13),  (3,5,6,12),  (3,5,7,11),
45     (3,5,8,10),  (3,5,9,9),   (3,6,6,11),  (3,6,7,10),  (3,6,8,9),
46     (3,7,7,9),   (3,7,8,8),   (4,4,5,13),  (4,4,6,12),  (4,4,7,11),
47     (4,4,8,10),  (4,4,9,9),   (4,5,5,12),  (4,5,6,11),  (4,5,7,10),
48     (4,5,8,9),   (4,6,6,10),  (4,6,7,9),   (4,6,8,8),   (4,7,7,8),
49     (5,5,5,11),  (5,5,6,10),  (5,5,7,9),   (5,5,8,8),   (5,6,6,9),
50     (5,6,7,8),   (5,7,7,7),   (6,6,6,8),   (6,6,7,7)]
51
52ccp_generator :: [[Radical]] -> [Paraffin]
53ccp_generator radicals =
54  [ (CCP ri rj rk rl)
55  | (i,j,k,l) <- four_partitions,
56    (ri:ris)  <- (remainders (radicals!!i)),
57    (rj:rjs)  <- (remainders (if (i==j) then (ri:ris) else radicals!!j)),
58    (rk:rks)  <- (remainders (if (j==k) then (rj:rjs) else radicals!!k)),
59    rl        <- (if (k==l) then (rk:rks) else radicals!!l)]
60
61paraffins_until :: Int
62paraffins_until = length (ccp_generator radicals)
63 where
64  radicals = radical_generator
65
66main :: IO ()
67main = print paraffins_until
68