¿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.


¿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...


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!


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


¿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


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

4

Mi respuesta del otro desafío todavía funciona:

Brachylog , 1 byte

l

Pruébalo en línea!

La lconstrucción está sobrecargada, pero en los enteros, toma el número de dígitos del entero, ignorando el signo.


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())))))






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


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));}







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.


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




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.



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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.