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