4 ms·
Heh, that gives this nice expression sum(n>=10**i for i in range(100)) for (for example) inputs up to a googol. Or with your fix for the base case, 1 + s
by schoen 2y ago
Heh, that gives this nice expression
sum(n>=10**i for i in range(100))
for (for example) inputs up to a googol. Or with your fix for the base case,
1 + sum(n>=10**i for i in range(1, 100))
Another cute way that hides the loop
from itertools import count, takewhile
1 + len(list(takewhile(lambda x: 10**x <= n, count(1))))
- psychoslave 2y agoHow is that hiding the loop? I would expect takewhile to be a loop although I never used this Python facility.
- schoen 2y agoAll of the itertools functions are implemented using loops, but they heavily abstract over them so that users can think in terms of "streams" (or officially "iterators") without writing loop-oriented code themselves.
- kristopolous 2y agoa way that follows the rules and also does what you're trying to do: def noloops(n): x = lambda n, digits: (n / 1e9, digits + (n >= 10) + (n >= 100) + (n >= 1e3) + (n >= 1e4) + (n >= 1e5) + (n >= 1e6) + (n >= 1e7) + (n >= 1e8) + (n >= 1e9)) y = lambda n, digits: x(*x(*x(*x(*x(*x(n, digits)))))) return y(*y(*y(*y(*y(*y(n, 1))))))[1] Now we have it up to 324 digits without any loops.