Skip to content

Instantly share code, notes, and snippets.

@ShinNoNoir
Forked from anonymous/gist:4462276
Last active December 10, 2015 16:38
Show Gist options
  • Save ShinNoNoir/4462303 to your computer and use it in GitHub Desktop.
Save ShinNoNoir/4462303 to your computer and use it in GitHub Desktop.
Variation of an older version... Less computing (still roughly the same amount of time needed), but more memory usage.
module Combinaties where
deleteFromHead :: Eq a => a -> [a] -> [a]
deleteFromHead x [] = []
deleteFromHead x (y:ys)
| x == y = ys
| otherwise = (y:ys)
generate :: Eq a => Int -> [a] -> [a] -> [[a]]
generate n values knowns = generate' n knowns
where
-- base cases
generate' 0 [] = [[]]
generate' 0 knowns = []
-- recursive cases
generate' n [] = [v : subsolution | subsolution <- generate' (n-1) [], v <- values]
generate' n knowns@(k:ks)
| n > m = [k : subsolution | subsolution <- generate' (n-1) ks]
++
[v : subsolution | subsolution <- generate' (n-1) knowns, v <- values, v /= k]
| otherwise = [knowns]
where
m = length knowns
digits = ['0'..'9']
test = generate 9 digits "783659"
-- length test == 64234 -- (0.05 secs, 13067840 bytes)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment