8
\$\begingroup\$

Find the original challenge here

Challenge

Given an integer, Z in the range -2^31 < Z < 2^31, output the number of digits in that number (in base 10).

Rules

You must not use any string functions (in the case of overloading, you must not pass a string into functions which act as both string and integer functions). You are not allowed to store the number as a string.

All mathematical functions are allowed.

You may take input in any base, but the output must be the length of the number in base 10.

Do not count the minus sign for negative numbers. Number will never be a decimal.

Zero is effectively a leading zero, so it can have zero or one digit.

Examples

Input > Output

-45 > 2
1254 > 4
107638538 > 9
-20000 > 5
0 > 0 or 1
-18 > 2

Winning

Shortest code in bytes wins.

\$\endgroup\$
  • \$\begingroup\$ I assume no array functions either? \$\endgroup\$ – Cyoce May 19 '17 at 16:45
  • \$\begingroup\$ @Cyoce Yes, no array functions \$\endgroup\$ – Beta Decay May 19 '17 at 17:04
  • \$\begingroup\$ So if a language only accepts input as a string, it's invalid for this challenge, right? \$\endgroup\$ – Engineer Toast May 19 '17 at 19:24
  • \$\begingroup\$ @EngineerToast Yes, very much so \$\endgroup\$ – Beta Decay May 19 '17 at 19:33
  • \$\begingroup\$ I'm removing the restricted source tag because while this is a restriction it is not a real source restriction in that it is not computer tractable. \$\endgroup\$ – Wheat Wizard May 19 '17 at 21:50

34 Answers 34

9
\$\begingroup\$

Mathematica, 13 bytes

IntegerLength

Well...

\$\endgroup\$
  • \$\begingroup\$ According to codegolf.meta.stackexchange.com/a/3605/14732 this makes this question a duplicate. \$\endgroup\$ – Ismael Miguel May 20 '17 at 12:15
  • \$\begingroup\$ @IsmaelMiguel Well, this is a slightly trickier case, because the challenge is effectively a duplicate in some languages but not at all on others. \$\endgroup\$ – Martin Ender May 20 '17 at 12:38
  • \$\begingroup\$ Most answers there can be just copied over to here. \$\endgroup\$ – Ismael Miguel May 20 '17 at 13:00
  • \$\begingroup\$ @IsmaelMiguel I'd have to go and count, but I believe the majority of answers on the previous challenge used string processing which is not an option here. \$\endgroup\$ – Martin Ender May 20 '17 at 13:02
  • \$\begingroup\$ Meh, I lost the count 3 times. But seems to actually be around 30-45% of the answers. Those can be just copied over. \$\endgroup\$ – Ismael Miguel May 20 '17 at 13:07
7
\$\begingroup\$

Python 2, 30 bytes

f=lambda x:x and-~f(abs(x)/10)

Try it online!

\$\endgroup\$
  • \$\begingroup\$ @Notts90 I do, because it is referenced inside. \$\endgroup\$ – Leaky Nun May 19 '17 at 17:49
7
\$\begingroup\$

Japt, 5 3 bytes

ì l

Try it online!

\$\endgroup\$
  • 1
    \$\begingroup\$ I pushed a fix that makes the a unnecessary -- 5 minutes before the challenge was posted :-) Unfortunately, that means it'll only work on the online interpreter. (test it online!) \$\endgroup\$ – ETHproductions May 19 '17 at 14:28
  • \$\begingroup\$ Awesome. Well done ninja'ing the question ; ) \$\endgroup\$ – Luke May 19 '17 at 14:33
6
\$\begingroup\$

JavaScript (ES6), 19 bytes

f=n=>n&&f(n/10|0)+1

console.log(f(-45))       // 2
console.log(f(1254))      // 4
console.log(f(107638538)) // 9
console.log(f(-20000))    // 5
console.log(f(0))         // 0
console.log(f(-18))       // 2

\$\endgroup\$
  • \$\begingroup\$ do we count "f="? lots of the other languages here present the function definition by itself. \$\endgroup\$ – Sparr May 19 '17 at 15:06
  • 5
    \$\begingroup\$ @Sparr This is a recursive function that references itself. So in this special case, yes, we count f=. \$\endgroup\$ – Arnauld May 19 '17 at 15:07
4
\$\begingroup\$

Jelly, 3 2 bytes

1 byte saved thanks to Leaky Nun

DL

Try it online!

Explanation

 L    Length of
D     Decimal expansion of input argument. Works for negative values too
\$\endgroup\$
  • \$\begingroup\$ DL? \$\endgroup\$ – Leaky Nun May 19 '17 at 13:55
  • \$\begingroup\$ I was trying to do this. But I couldn't find what I needed on the code page :( \$\endgroup\$ – Christopher May 19 '17 at 14:01
  • \$\begingroup\$ "length" of an integer, using the same function that gives the length of a string, really feels like a string function... \$\endgroup\$ – Sparr May 19 '17 at 15:04
  • 1
    \$\begingroup\$ Not lenght of an integer, but of a list of its digits (obtained with D). The challenge says: in the case of overloading, you must not pass a string into functions which act as both string and integer functions This answer follows that rule: I'm not passing a string \$\endgroup\$ – Luis Mendo May 19 '17 at 15:08
4
\$\begingroup\$

My answer from the other challenge still works:

Brachylog, 1 byte

l

Try it online!

The l builtin is overloaded, but on integers, it takes the number of digits of the integer, ignoring sign.

\$\endgroup\$
3
\$\begingroup\$

Chaincode, 5 bytes

pqL_+

Note: This is exactly the same code as that from the other challenge

Explanation

pqL_+ print(
    +   succ(
   _      floor(
  L        log_10(
pq           abs(
               input())))))
\$\endgroup\$
3
\$\begingroup\$

dc, 1 byte

Z

Try it online!


Not using a builtin, 18 bytes:

[d10/d0!=F]dsFxz1-

Try it online!

\$\endgroup\$
2
\$\begingroup\$

S.I.L.O.S, 41 bytes

readIO
i|
lblb
i/10
a+1
if i b
printInt a

Try it online!

Returns 1 for 0.

\$\endgroup\$
  • \$\begingroup\$ Why is there no love for SILOS, its golfier than python for this challenge! \$\endgroup\$ – Rohan Jhunjhunwala May 20 '17 at 1:32
2
\$\begingroup\$

Lua, 40 bytes

Port from my python answer

print(math.log10(math.abs(10*...)+1)//1)

Try it online!

\$\endgroup\$
2
\$\begingroup\$

Java 8, 61 59 39 37 bytes

n->n==0?1:(int)Math.log10(n<0?-n:n)+1

Port from @TheLethalCoder's C# answer, but without the Math.floor because using an (int)-cast automatically floors/truncates decimals in Java.

Try it online.


Recursive Java 7 answer (61 38 bytes):

int c(int n){return n!=0?1+c(n/10):0;}

Port of @Khaled.K's C answer.

Try it online.

\$\endgroup\$
1
\$\begingroup\$

C#, 49 56 bytes

namespace System.Math{n=>n==0?1:Floor(Log10(Abs(n))+1);}
\$\endgroup\$
1
\$\begingroup\$

Alice, 16 bytes

/O
\I@/Hwa:].$Kq

Try it online!

Explanation

/O
\I@/...

This is simply a framework for numerical input→mathematical processing→numerical output.

The rest of the code is the real algorithm:

Hwa:].$Kq
H            Compute absolute value
 w   .$K     While the result is not zero do:
  a:           divide the number by 10
    ]          move the tape head one cell forward
        q    Get the position of the tape head
\$\endgroup\$
1
\$\begingroup\$

Python 2, 48 bytes

-3 thanks to ovs -1 thanks to pizzapants

lambda x:math.log10(abs(10*x)+1)//1
import math

Try it online!

\$\endgroup\$
  • \$\begingroup\$ lambda x:1+log10(abs(x)+.1)//1 for 48 bytes \$\endgroup\$ – ovs May 19 '17 at 14:14
  • \$\begingroup\$ import math and math.log10 saves one byte \$\endgroup\$ – pizzapants184 May 19 '17 at 19:47
1
\$\begingroup\$

C, 27 bytes

Try Online

f(n){return n?1+f(n/10):0;}

C (gcc), 22 bytes

f(n){n=n?1+f(n/10):0;}

Using math, 29 bytes

f(n){return 1+log10(abs(n));}
\$\endgroup\$
1
\$\begingroup\$

R, 40 bytes

function(x)max(ceiling(log10(abs(x))),0)

Try it online!

\$\endgroup\$
0
\$\begingroup\$

MATL, 5 bytes

|OYAn

Try it online!

Explanation

|     % Implicitly input a number. Absolute value
OYA   % Convert to array of decimal digits
n     % Length. Implicitly display
\$\endgroup\$
0
\$\begingroup\$

05AB1E, 6 bytes

Ä>T.nî

Try it online! or Try all tests

Ä      # Absolute value
 >     # Increment
  T.n  # Log base 10
     î # Round up
\$\endgroup\$
0
\$\begingroup\$

Jelly, 5 bytes

A‘l⁵Ċ

Try it online!

\$\endgroup\$
0
\$\begingroup\$

Octave, 27 bytes

@(x)fix(log10(abs(x+~x)))+1

Try it online!

\$\endgroup\$
0
\$\begingroup\$

PHP, 23 Bytes

<?=-~log10(abs($argn));

Try it online!

\$\endgroup\$
0
\$\begingroup\$

PowerShell, 52 51 Bytes

$m=[math];$m::Floor($m::Log10($m::Abs($args[0])))+1

Thanks to Felipe for both fixing the Issue with Log10, and providing a 1byte save.

Any System.Math calls are extremely expensive in PowerShell.

Uses the method of getting the Log10 of the Abs Value of the input, and rounding that up.

\$\endgroup\$
  • \$\begingroup\$ you should use Floor()+1. Ceil() fails for for powers of 10 \$\endgroup\$ – Felipe Nardi Batista May 19 '17 at 14:34
  • \$\begingroup\$ use $m::Log10(... to save a byte \$\endgroup\$ – Felipe Nardi Batista May 19 '17 at 14:41
0
\$\begingroup\$

QBIC, 25 bytes

≈abs(:)>=1|b=b+1┘a=a/z}?b

This divides the input by 10, and keeps track of how many times we can do this until N < 1.

Explanation:

≈abs(:)>=1| : gets cmd line input, 
            ≈ starts a while loop,
            abs() is literal QBasic code and is for cases with negative n
            | is the terminator to the WHILE-condition
b=b+1       Keep track of the # of divisions        
┘           Syntactic line break
a=a/z       Divide a by 10 (z==10 in QBIC)
}           End WHILE-loop body
?b          PRINT b
\$\endgroup\$
0
\$\begingroup\$

Bash, 50 bytes

a=$1;until [ $a -eq 0 ];{ let i++ a=a/10;};echo $i

Try it online!

No string/array command, only count digits by integer division.

\$\endgroup\$
0
\$\begingroup\$

Ruby, 33 bytes

->x{1+Math.log10(x.abs+0.1).to_i}

Try it online!

\$\endgroup\$
0
\$\begingroup\$

bc, 6 bytes

length

Built-in function.

\$\endgroup\$
0
\$\begingroup\$

Actually, 8 bytes

;0=+A╥Lu

Try it online!

Explanation:

;0=+A╥Lu
;0=       is input equal to 0?
   +      add 1 if input is 0, else add 0
    A     absolute value
     ╥L   log base 10, floor
       u  increment

This program effectively calculates floor(log10(x))+1. To deal with log(0) being undefined (actually it returns (-inf+nanj) which is a special way of saying it's undefined), the input is incremented if it is 0 prior to computing the length. Thus, 0 is considered to have a length of 1.

\$\endgroup\$
0
\$\begingroup\$

Pari/GP, 13 bytes

n->#digits(n)

Try it online!

\$\endgroup\$
0
\$\begingroup\$

Ruby, 27 bytes

f=->x{x==0?0:1+f[x.abs/10]}

As a test:

tests = [[-45 , 2],
         [1254 , 4],
         [107638538 , 9],
         [-20000 , 5],
         [0 , 0 ],
         [-18 , 2]]

tests.each do |i, o|
  p f.call(i) == o
end

It outputs:

true
true
true
true
true
true
\$\endgroup\$
0
\$\begingroup\$

Perl 5 -p, 26 bytes

$\++;abs($_/=10)<1||redo}{

Try it online!

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.