duplicates :: [Int] -> [Int]
-- testing 6 combinations of argument values
-- pruning with 21/26 rules
-- 2 candidates of size 1
-- 0 candidates of size 2
-- 0 candidates of size 3
-- 0 candidates of size 4
-- 0 candidates of size 5
-- 0 candidates of size 6
-- 0 candidates of size 7
-- 2 candidates of size 8
-- 4 candidates of size 9
-- 8 candidates of size 10
-- 8 candidates of size 11
-- 14 candidates of size 12
-- 22 candidates of size 13
-- 52 candidates of size 14
-- 74 candidates of size 15
-- 120 candidates of size 16
-- 156 candidates of size 17
-- tested 461 candidates
duplicates []  =  []
duplicates (x:xs)
  | elem x xs && not (elem x (duplicates xs))  =  x:duplicates xs
  | otherwise  =  duplicates xs

duplicates :: [Int] -> [Int]
-- pruning with 21/26 rules
-- 2 candidates of size 1
-- 1 candidates of size 2
-- 0 candidates of size 3
-- 2 candidates of size 4
-- 1 candidates of size 5
-- 2 candidates of size 6
-- 3 candidates of size 7
-- 8 candidates of size 8
-- 13 candidates of size 9
-- 18 candidates of size 10
-- 21 candidates of size 11
-- 32 candidates of size 12
-- 57 candidates of size 13
-- 102 candidates of size 14
-- 159 candidates of size 15
-- 228 candidates of size 16
-- 331 candidates of size 17
-- tested 979 candidates
duplicates []  =  []
duplicates (x:xs)
  | elem x xs && not (elem x (duplicates xs))  =  x:duplicates xs
  | otherwise  =  duplicates xs

positionsFrom :: Int -> A -> [A] -> [Int]
-- testing 360 combinations of argument values
-- pruning with 6/11 rules
-- 1 candidates of size 1
-- 0 candidates of size 2
-- 2 candidates of size 3
-- 0 candidates of size 4
-- 7 candidates of size 5
-- 0 candidates of size 6
-- 26 candidates of size 7
-- 0 candidates of size 8
-- 97 candidates of size 9
-- 0 candidates of size 10
-- 362 candidates of size 11
-- 0 candidates of size 12
-- 1363 candidates of size 13
-- tested 1858 candidates
positionsFrom  =  undefined  -- search exhausted

