| 1 | |
|---|
| 2 | module Main (main) where |
|---|
| 3 | |
|---|
| 4 | data Radical = H | C Radical Radical Radical |
|---|
| 5 | |
|---|
| 6 | three_partitions :: Int -> [(Int,Int,Int)] |
|---|
| 7 | three_partitions m = |
|---|
| 8 | [ (i,j,k) | i <- [0..(div m 3)], j <- [i..(div (m-i) 2)], k <- [m - (i+j)]] |
|---|
| 9 | |
|---|
| 10 | remainders :: [a] -> [[a]] |
|---|
| 11 | remainders [] = [] |
|---|
| 12 | remainders (r:rs) = (r:rs) : (remainders rs) |
|---|
| 13 | |
|---|
| 14 | radical_generator :: [[Radical]] |
|---|
| 15 | radical_generator = radicals |
|---|
| 16 | where radicals = [H] : [rads_of_size_n radicals j | j <- [1..13]] |
|---|
| 17 | |
|---|
| 18 | rads_of_size_n :: [[Radical]] -> Int -> [Radical] |
|---|
| 19 | rads_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 | |
|---|
| 26 | data Paraffin = CCP Radical Radical Radical Radical |
|---|
| 27 | |
|---|
| 28 | four_partitions :: [(Int,Int,Int,Int)] |
|---|
| 29 | four_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 | |
|---|
| 52 | ccp_generator :: [[Radical]] -> [Paraffin] |
|---|
| 53 | ccp_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 | |
|---|
| 61 | paraffins_until :: Int |
|---|
| 62 | paraffins_until = length (ccp_generator radicals) |
|---|
| 63 | where |
|---|
| 64 | radicals = radical_generator |
|---|
| 65 | |
|---|
| 66 | main :: IO () |
|---|
| 67 | main = print paraffins_until |
|---|