### Not sure whether it helped

With that change, we now have the following for

Did it make a difference? Yes, but... it was a bit slower. By profiling output, 193 ticks instead of 187;

Recall that for the previous version, the best was

On the other hand, looking deeper into the profiler output, before,

**noTwos**and associated functions. (Oh, yeah... we made the one-digit case special as we did for counting the d-digit Ys, for the same reason, i.e. putting the special case in one place.)**evenNoTwos = [justOnes n (min 3 (n `div` 2 - 1)) | n <- [2,4..]]**

noTwos :: Int -> [Integer]

noTwos n

| even n = base

| otherwise = concat [[p, p + tenToThe halfN] | p <- map spread base]

where halfN = n `div` 2

base = evenNoTwos !! (halfN - 1)

spread x = let (a, b) = x `divMod` (tenToThe halfN)

in a * tenToThe (halfN + 1) + bnoTwos :: Int -> [Integer]

noTwos n

| even n = base

| otherwise = concat [[p, p + tenToThe halfN] | p <- map spread base]

where halfN = n `div` 2

base = evenNoTwos !! (halfN - 1)

spread x = let (a, b) = x `divMod` (tenToThe halfN)

in a * tenToThe (halfN + 1) + b

Did it make a difference? Yes, but... it was a bit slower. By profiling output, 193 ticks instead of 187;

**time**output looked worse, with the best apparently**real 0m0.232s****user 0m0.200s****sys 0m0.028s**Recall that for the previous version, the best was

**real 0m0.224s****user 0m0.176s****sys 0m0.044s**On the other hand, looking deeper into the profiler output, before,

**noTwos**and things it called was eating 19.3% of the CPU time, while now that's 7.8%, but to be fair we should include**evenNoTwos**, which snarfs 7.3%--but still that's a total of 15.1%, which should be a win. Despite total allocation being down, actual memory usage is up, from maybe 6.25 MB to close to 7 MB; we are, after all, keeping more stuff around.
## Comments