[Haskell-cafe] For Project Euler #24 you don't need to generate all the lexicographic permutations <Spoiler>
caseyh at istar.ca
caseyh at istar.ca
Sun May 8 17:41:21 CEST 2011
For Project Euler #24 you don't need to generate all the lexicographic
permutations by Knuth's method or any other.
You're only looking for the millionth lexicographic permutation of
"0123456789"
Problem 24
A permutation is an ordered arrangement of objects. For example, 3124
is one possible permutation of the digits 1, 2, 3 and 4. If all of the
permutations are listed numerically or alphabetically, we call it
lexicographic order. The lexicographic permutations of 0, 1 and 2 are:
012 021 102 120 201 210
What is the millionth lexicographic permutation of the digits 0, 1, 2,
3, 4, 5, 6, 7, 8 and 9?
<Spoiler>
<Spoiler>
<Spoiler>
Plan of attack:
-- The "x"s are different numbers
-- 0xxxxxxxxx represents 9! = 362880 permutations/numbers
-- 1xxxxxxxxx represents 9! = 362880 permutations/numbers
-- 2xxxxxxxxx represents 9! = 362880 permutations/numbers
-- 20xxxxxxxx represents 8! = 40320
-- 21xxxxxxxx represents 8! = 40320
-- 23xxxxxxxx represents 8! = 40320
-- 24xxxxxxxx represents 8! = 40320
-- 25xxxxxxxx represents 8! = 40320
-- 26xxxxxxxx represents 8! = 40320
-- 27xxxxxxxx represents 8! = 40320
etc.
<Spoiler>
<Spoiler>
-- lexOrder "0123456789" 1000000 ""
lexOrder digits left s
| len == 0 = s ++ digits
| quot > 0 && rem == 0 = lexOrder (digits\\(show
(digits!!(quot-1)))) rem (s ++ [(digits!!(quot-1))])
| quot == 0 && rem == 0 = lexOrder (digits\\(show (digits!!len)))
rem (s ++ [(digits!!len)])
| rem == 0 = lexOrder (digits\\(show
(digits!!(quot+1)))) rem (s ++ [(digits!!(quot+1))])
| otherwise = lexOrder (digits\\(show
(digits!!(quot)))) rem (s ++ [(digits!!(quot))])
where
len = (length digits) - 1
facLen = factorial len
(quot,rem) = quotRem left facLen
More information about the Haskell-Cafe
mailing list