zlacker

[return to "My favorite programming problem to teach: Digit length (2019)"]
1. chacha+9c3[view] [source] 2024-06-06 06:07:28
>>equili+(OP)
Am I the only one who, in response to: "dont use loops" thought of the following:

   int numDigits(int num){
     if (num < 0){
       return numDigits(-1 * num);
     }
     if (num < 10){
       return 1;
     }
     if (num < 100){
       return 2;
     }
     if (num < 1000){
       return 3;
     }
     if (num < 10000){
       return 4;
     }
     if (num < 100000){
       return 5;
     }
     if (num < 1000000){
       return 6;
     }
     if (num < 10000000){
       return 7;
     }
     if (num < 100000000){
       return 8;
     }
     if (num < 1000000000){
       return 9;
     }
     return 10; // cant be more than 10 since sizeof(int) == 4, otherwise extend to 19
   }
◧◩
2. kristo+Bh3[view] [source] 2024-06-06 06:59:11
>>chacha+9c3
The statements will duck type to numbers so you could just be really silly and do something like:

   return 1 + (n >= 10) + (n >= 100) + (n >= 1e3) + (n >= 1e4) + (n >= 1e5) + (n >= 1e6) + (n >= 1e7) + (n >= 1e8) + (n >= 1e9) ...
◧◩◪
3. schoen+du3[view] [source] 2024-06-06 09:01:23
>>kristo+Bh3
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))))
◧◩◪◨
4. psycho+FA3[view] [source] 2024-06-06 09:54:11
>>schoen+du3
How is that hiding the loop? I would expect takewhile to be a loop although I never used this Python facility.
◧◩◪◨⬒
5. schoen+YE5[view] [source] 2024-06-06 23:11:49
>>psycho+FA3
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]