replicate :: Int -> Char -> [Char]
-- testing 360 combinations of argument values
-- pruning with 4/7 rules
-- 1 candidates of size 1
-- 0 candidates of size 2
-- 1 candidates of size 3
-- 1 candidates of size 4
-- 2 candidates of size 5
-- 1 candidates of size 6
-- 1 candidates of size 7
-- 2 candidates of size 8
-- tested 8 candidates
replicate 0 c  =  ""
replicate x c  =  c:replicate (x - 1) c

replicates :: [Char] -> Int -> [Char]
-- testing 360 combinations of argument values
-- pruning with 2/2 rules
-- 1 candidates of size 1
-- 0 candidates of size 2
-- 0 candidates of size 3
-- 1 candidates of size 4
-- 1 candidates of size 5
-- tested 3 candidates
replicates cs x  =  concat (transpose (replicate x cs))

replicates :: [Char] -> Int -> [Char]
-- testing 360 combinations of argument values
-- pruning with 0/0 rules
-- 1 candidates of size 1
-- 0 candidates of size 2
-- 0 candidates of size 3
-- 0 candidates of size 4
-- 1 candidates of size 5
-- tested 2 candidates
replicates cs x  =  concat (map (replicate x) cs)

replicates :: [Char] -> Int -> [Char]
-- testing 360 combinations of argument values
-- pruning with 4/4 rules
-- 2 candidates of size 1
-- 0 candidates of size 2
-- 1 candidates of size 3
-- 0 candidates of size 4
-- 1 candidates of size 5
-- 3 candidates of size 6
-- 1 candidates of size 7
-- 12 candidates of size 8
-- tested 10 candidates
replicates "" x  =  ""
replicates (c:cs) x  =  replicate x c ++ replicates cs x