zlacker

[parent] [thread] 3 comments
1. schoen+(OP)[view] [source] 2024-06-06 09:01:23
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))))
replies(2): >>psycho+s6 >>kristo+852
2. psycho+s6[view] [source] 2024-06-06 09:54:11
>>schoen+(OP)
How is that hiding the loop? I would expect takewhile to be a loop although I never used this Python facility.
replies(1): >>schoen+La2
3. kristo+852[view] [source] 2024-06-06 22:34:24
>>schoen+(OP)
a 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.
◧◩
4. schoen+La2[view] [source] [discussion] 2024-06-06 23:11:49
>>psycho+s6
All 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.
[go to top]