Esthetic numbers: Difference between revisions

→‎{{header|Haskell}}: added more efficient solution
m (→‎Python :: Functional: wrapped output)
(→‎{{header|Haskell}}: added more efficient solution)
Line 2,718:
differences lst = zipWith (-) lst (tail lst)
 
-- Monadic solution, inefficient for small bases.
-- infinite list of esthetic numbers
estheticsesthetics_m b =
do differences <- (\n -> replicateM n [-1, 1]) <$> [0..]
firstDigit <- [1..b-1]
differences >>= fromBase b <$> scanl (+) firstDigit
 
-- Much more efficient iterative solution (translation from Python)
-- Uses simple list as an ersatz queue.
esthetics b = tail $ fst <$> iterate step (1, q)
where
q = [(d, d) | d <- [1..b-1]]
step (_, queue) =
let (num, lsd) = head queue
new_lsds = [d | d <- [lsd-1, lsd+1], d < b, d >= 0]
in (num, tail queue ++ [(num*b + d, d) | d <- new_lsds])
 
-- representation of numbers as digits
Line 2,824 ⟶ 2,834:
 
λ> length $ takeWithin 100000000000000000 130000000000000000 $ esthetics 10
44744</pre>
</pre>
 
=={{header|Java}}==
Anonymous user