¿Cuánto dura mi número? Versión restringida

8

Encuentra el desafío original aquí

Desafío

Dado un número entero, Zen el rango -2^31 < Z < 2^31, genera el número de dígitos en ese número (en base 10).

Reglas

No debe usar ninguna función de cadena (en el caso de sobrecarga, no debe pasar una cadena a funciones que actúen como funciones de cadena y de número entero). No está permitido almacenar el número como una cadena.

Todas las funciones matemáticas están permitidas.

Puede tomar la entrada en cualquier base, pero la salida debe ser la longitud del número en la base 10.

No cuente el signo menos para números negativos. El número nunca será un decimal.

El cero es efectivamente un cero inicial, por lo que puede tener cero o un dígito.

Ejemplos

Input > Output

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

Victorioso

El código más corto en bytes gana.

Decaimiento Beta
fuente
¿Supongo que tampoco hay funciones de matriz?
Cyoce
@Cyoce Sí, no hay funciones de matriz
Beta Decay
Entonces, si un idioma solo acepta la entrada como una cadena, no es válido para este desafío, ¿verdad?
Engineer Toast
@EngineerToast Sí, mucho
Beta Decay
Estoy eliminando la etiqueta de fuente restringida porque si bien esta es una restricción, no es una restricción de fuente real, ya que no es manejable por computadora.
Ad Hoc Garf Hunter

Respuestas:

9

Mathematica, 13 bytes

IntegerLength

Bien...

Martin Ender
fuente
De acuerdo con codegolf.meta.stackexchange.com/a/3605/14732 esto hace que esta pregunta sea un duplicado.
Ismael Miguel
@IsmaelMiguel Bueno, este es un caso un poco más complicado, porque el desafío es efectivamente un duplicado en algunos idiomas, pero no en otros.
Martin Ender
La mayoría de las respuestas allí se pueden copiar aquí.
Ismael Miguel
@IsmaelMiguel Tendría que ir y contar, pero creo que la mayoría de las respuestas en el desafío anterior usaban el procesamiento de cadenas, que no es una opción aquí.
Martin Ender
Meh, perdí la cuenta 3 veces. Pero parece ser alrededor del 30-45% de las respuestas. Esos pueden ser copiados.
Ismael Miguel
7

Japt , 5 3 bytes

ì l

Pruébalo en línea!

Luke
fuente
1
Empujé una solución que hace ainnecesario: 5 minutos antes de que se publicara el desafío :-) Desafortunadamente, eso significa que solo funcionará en el intérprete en línea. ( ¡
pruébelo
Increíble. Bien hecho ninja'ing la pregunta; )
Lucas
6

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

Arnauld
fuente
¿contamos "f ="? Muchos de los otros idiomas aquí presentan la definición de la función por sí misma.
Sparr
55
@Sparr Esta es una función recursiva que hace referencia a sí misma. Entonces, en este caso especial, sí, contamos f=.
Arnauld
4

Jalea , 3 2 bytes

1 byte guardado gracias a Leaky Nun

DL

Pruébalo en línea!

Explicación

 L    Length of
D     Decimal expansion of input argument. Works for negative values too
Luis Mendo
fuente
DL?
Leaky Nun
Estaba intentando hacer esto. Pero no pude encontrar lo que necesitaba en la página de códigos :(
Christopher
"longitud" de un entero, utilizando la misma función que da la longitud de una cadena, realmente se siente como una función de cadena ...
Sparr
1
No longitud de un entero, sino de una lista de sus dígitos (obtenidos con D). El desafío dice: en el caso de sobrecarga, no debe pasar una cadena a funciones que actúen como funciones de cadena y de número entero. Esta respuesta sigue esa regla: no estoy pasando una cadena
Luis Mendo
3

Chaincode , 5 bytes

pqL_+

Nota: este es exactamente el mismo código que el del otro desafío

Explicación

pqL_+ print(
    +   succ(
   _      floor(
  L        log_10(
pq           abs(
               input())))))
Roman Gräf
fuente
2

SILOS , 41 bytes

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

Pruébalo en línea!

Devoluciones 1para 0.

Monja permeable
fuente
¿Por qué no hay amor por SILOS, es más golfista que Python para este desafío!
Rohan Jhunjhunwala
1

C #, 49 56 bytes

namespace System.Math{n=>n==0?1:Floor(Log10(Abs(n))+1);}
TheLethalCoder
fuente
1

Alice , 16 bytes

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

Pruébalo en línea!

Explicación

/O
\I@/...

Esto es simplemente un marco para la entrada numérica → procesamiento matemático → salida numérica.

El resto del código es el algoritmo real:

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
León
fuente
1

Python 2 , 48 bytes

-3 gracias a ovs -1 gracias a pizzapants

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

Pruébalo en línea!

Felipe Nardi Batista
fuente
lambda x:1+log10(abs(x)+.1)//1para 48 bytes
ovs
import mathy math.log10ahorra un byte
pizzapants184
1

C, 27 bytes

Probar en línea

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

C (gcc), 22 bytes

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

Usando matemáticas, 29 bytes

f(n){return 1+log10(abs(n));}
Khaled.K
fuente
0

MATL , 5 bytes

|OYAn

Pruébalo en línea!

Explicación

|     % Implicitly input a number. Absolute value
OYA   % Convert to array of decimal digits
n     % Length. Implicitly display
Luis Mendo
fuente
0

PowerShell, 52 51 bytes

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

Gracias a Felipe por solucionar el problema con Log10 y proporcionar un ahorro de 1byte.

Cualquier System.Mathllamada es extremadamente costosa en PowerShell.

Utiliza el método para obtener el Log10 del Valor Abs de la entrada y redondearlo.

colsw
fuente
se debe utilizar Floor()+1. Ceil()falla por poderes de 10
Felipe Nardi Batista
utilizar $m::Log10(...para guardar un byte
Felipe Nardi Batista
0

QBIC , 25 bytes

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

Esto divide la entrada por 10 y realiza un seguimiento de cuántas veces podemos hacer esto hasta N<1.

Explicación:

≈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
Steenbergh
fuente
0

Bash , 50 bytes

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

Pruébalo en línea!

Sin comando string / array, solo cuenta dígitos por división de enteros.

marcom
fuente
0

a. C. , 6 bytes

length

Función incorporada

eush77
fuente
0

En realidad , 8 bytes

;0=+A╥Lu

Pruébalo en línea!

Explicación:

;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

Este programa efectivamente calcula floor(log10(x))+1. Para lidiar con log(0)ser indefinido (en realidad devuelve, (-inf+nanj)que es una forma especial de decir que no está definido), la entrada se incrementa si es 0anterior al cálculo de la longitud. Por lo tanto, 0se considera que tiene una longitud de 1.

Mego
fuente
0

Rubí, 27 bytes

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

Como prueba:

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

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

Produce:

true
true
true
true
true
true
Eric Duminil
fuente