¿Cuánto dura mi número?

26

Reto

Dado un número entero, Qen el rango -(2^100) ≤ Q ≤ 2^100, genera el número de dígitos en ese número (en base 10).

Reglas

Sí, puede tomar el número como una cadena y encontrar su longitud.

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 tendrá un punto decimal.

Cero puede tener uno o cero dígitos.

Suponga que la entrada siempre será un número entero válido.

Ejemplos

Input > Output

-45 > 2
12548026 > 8
33107638153846291829 > 20
-20000 > 5
0 > 1 or 0

Victorioso

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

Decaimiento Beta
fuente

Respuestas:

10

Brachylog , 1 byte

l

Pruébalo en línea!

Otra solución integrada, pero esta tiene el nombre más corto (a menos que alguien encuentre un idioma que realice esta tarea en cero bytes). Esto debería funcionar tanto en Brachylog 1 como en Brachylog 2.

Esta es una presentación de función (el enlace TIO contiene un argumento de línea de comando que hace que el intérprete ejecute una función individual en lugar de un programa completo), en parte porque de lo contrario tendríamos que gastar bytes en la salida, en parte porque la sintaxis de Brachylog para negativo números es algo inusual y hacer de este programa una función resuelve cualquier posible argumento sobre la sintaxis de entrada.

A menudo me molesta que la mayoría de los componentes integrados de Brachylog traten los números negativos como positivos, pero ese hecho terminó siendo útil aquí. Supongo que hay compensaciones involucradas con cada lenguaje de golf.


fuente
Aquí es donde dejo de desplazarme ... ¡esto es indignante!
Bogdan Alexandru
39

Taxi , 1118 bytes

1 is waiting at Starchild Numerology.Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to Chop Suey.Go to Chop Suey:n 1 r 1 l 4 r 1 l.Pickup a passenger going to Crime Lab.'-' is waiting at Writer's Depot.Go to Writer's Depot:n 1 l 3 l.Pickup a passenger going to Crime Lab.Go to Crime Lab:n 1 r 2 r 2 l.Switch to plan "n" if no one is waiting.-1 is waiting at Starchild Numerology.[n]0 is waiting at Starchild Numerology.Go to Starchild Numerology:s 1 r 1 l 1 l 2 l.Pickup a passenger going to Cyclone.Pickup a passenger going to Addition Alley.Go to Cyclone:e 1 l 2 r.[r]Pickup a passenger going to Cyclone.Pickup a passenger going to Addition Alley.Go to Zoom Zoom:n.Go to Addition Alley:w 1 l 1 r.Pickup a passenger going to Addition Alley.Go to Chop Suey:n 1 r 2 r.Switch to plan "f" if no one is waiting.Pickup a passenger going to Sunny Skies Park.Go to Sunny Skies Park:n 1 l 3 l 1 l.Go to Cyclone:n 1 l.Switch to plan "r".[f]Go to Addition Alley:n 1 l 2 l.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:n 1 r 1 r.Pickup a passenger going to Post Office.Go to Post Office:n 1 l 1 r.

Pruébalo en línea!

Sin golf:

1 is waiting at Starchild Numerology.
Go to Post Office: west 1st left 1st right 1st left.
Pickup a passenger going to Chop Suey.
Go to Chop Suey: north 1st right 1st left 4th right 1st left.
Pickup a passenger going to Crime Lab.
'-' is waiting at Writer's Depot.
Go to Writer's Depot: north 1st left 3rd left.
Pickup a passenger going to Crime Lab.
Go to Crime Lab: north 1st right 2nd right 2nd left.
Switch to plan "n" if no one is waiting.
-1 is waiting at Starchild Numerology.
[n]
0 is waiting at Starchild Numerology.
Go to Starchild Numerology: south 1st right 1st left 1st left 2nd left.
Pickup a passenger going to Cyclone.
Pickup a passenger going to Addition Alley.
Go to Cyclone: east 1st left 2nd right.
[r]
Pickup a passenger going to Cyclone.
Pickup a passenger going to Addition Alley.
Go to Zoom Zoom: north.
Go to Addition Alley: west 1st left 1st right.
Pickup a passenger going to Addition Alley.
Go to Chop Suey: north 1st right 2nd right.
Switch to plan "f" if no one is waiting.
Pickup a passenger going to Sunny Skies Park.
Go to Sunny Skies Park: north 1st left 3rd left 1st left.
Go to Cyclone: north 1st left.
Switch to plan "r".
[f]
Go to Addition Alley: north 1st left 2nd left.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: north 1st right 1st right.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st left 1st right.

Explicación:

Pickup the input and split it into individual characters
Pickup the value 1.
If the first character a hyphen, add -1. Otherwise, add 0.
Keep picking up characters and adding 1 until you're out.
Convert the running total to a string and print to stdout.
Tostadas de ingeniero
fuente
8
He estado al acecho en este intercambio durante mucho tiempo, pero nunca he visto algo así
Copa de Java
77
¿Se quedará sin gasolina si el número es lo suficientemente largo?
Robert Fraser
55
Este es un cerebro más grande que el cerebro.
Omega
1
@RobertFraser Es por eso que nos detenemos Zoom Zoomen cada ciclo de plan "r". Solo lo probé hasta 100,000 dígitos y nunca se quedó sin gasolina. No lo calculé, pero supongo que se necesita una tarifa más que suficiente para pagar el gas que está usando, por lo que llena el tanque en cada circuito.
Engineer Toast
1
@CupofJava OH MY GOSH cómo me olvidé de Shakespeare .
Engineer Toast
18

Mathematica, 13 bytes

IntegerLength

Hay un incorporado ... vuelve 0para 0.

Martin Ender
fuente
2
Mathematica prevalece: D
Beta Decay
1
no en el código de golf que no :)
Greg Martin
8
There's a built-in: ¿Cuándo no está allí?
TheLethalCoder
14

dc, 3

?Zp

Tenga en cuenta que normalmente dcrequiere que se den números negativos en _lugar de los más habituales -. Sin embargo, en este caso, cualquiera puede ser utilizado. Si -se da, entonces dctrata esto como una resta en una pila vacía, tira dc: stack emptyy luego continúa con el resto del número; Por lo tanto, el resultado no es diferente.

Pruébalo en línea .

?    # input
 Z   # measure length
  p  # print
Trauma digital
fuente
¿No podría ser esto solo Zcomo una presentación de función? dcEs un lenguaje concatenante con operadores quote + dup + eval, por lo tanto, puede reutilizar cadenas de código arbitrarias.
12

Retina , 2 bytes

\d

Pruébalo en línea!

Retina realmente no sabe qué son los números, por lo que la entrada se trata como una cadena y simplemente contamos los caracteres de los dígitos.

Martin Ender
fuente
5

05AB1E , 2 bytes

Äg

Pruébalo en línea! o prueba todas las pruebas!

Ä  # Absolute value
 g # Length
Riley
fuente
Ä¿eh? No þ? Lo suficientemente justo.
Urna mágica de pulpo
@carusocomputing Pensé Äprimero, pero þmanejaría un punto decimal, así que supongo que es un poco mejor.
Riley
Simplemente genial cómo 2 personas idearon 2 soluciones diferentes de 2 bytes con 2 minutos de diferencia, no creo que haya una tercera; tratando de pensar en uno.
Urna de pulpo mágico
5

Alice , 16 bytes

//; 'q<)e
o!@i -

Pruébalo en línea!

Explicación

Encontrar un diseño medio decente para esto fue bastante complicado. Todavía no estoy muy contento con él debido a los espacios, el <y el ;, pero esto es lo mejor que puedo hacer por ahora.

La longitud de la cadena es una de esas incorporaciones muy comunes que no existen en Alice, porque su entrada es una cadena y su salida es un entero (y todos los comandos de Alice son estrictamente enteros a enteros o cadenas a cadenas). Podemos medir la longitud de una cadena escribiéndola en la cinta en modo Ordinal y luego encontrando su final en modo Cardinal.

/      Reflect to SE. Switch to Ordinal. While in Ordinal mode, the IP will bounce
       diagonally up and down through the code.
!      Store an implicit empty string on the tape, does nothing.
;      Discard an implicit empty string, does nothing.
i      Read all input as a string.
'-     Push "-".
<      Set the horizontal component of the IP's direction to west, so we're bouncing
       back now.
-      Remove substring. This deletes the minus sign if it exists.
'i     Push "i".
;      Discard it again.
!      Store the input, minus a potential minus sign, on the tape.
/      Reflect to W. Switch to Cardinal. The IP immediately wraps to the
       last column.
e)     Search the tape to the right for a -1, which will be found at the end
       of the string we stored there.
<      Does nothing.
q      Push the tape head's position, which is equal to the string length.
'<sp>  Push " ".
;      Discard it again.
/      Reflect to NW. Switch to Ordinal. The IP immediately bounces off
       the top boundary to move SW instead.
o      Implicitly convert the string length to a string and print it.
       IP bounces off the bottom left corner, moves back NE.
/      Reflect to S. Switch to Cardinal.
!      Store an implicit 0 on the tape, irrelevant.
       The IP wraps back to the first line.
/      Reflect to NE. Switch to Ordinal. The IP immediately bounces off
       the top boundary to move SE instead.
@      Terminate the program.

También intenté cuidar el signo menos en modo Cardinal con H(valor absoluto), pero el cambio de modo adicional siempre terminó siendo más costoso en mis intentos.

Martin Ender
fuente
4

PHP, 23 bytes

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

Pruébalo en línea!

log de base 10 del valor absoluto más un elenco a int

para cero como entrada log10 devuelve lo INFque se interpreta como falso

La mejor manera es reemplazar $argncon $argn?:1+3 bytes

PHP, 27 bytes

<?=strlen($argn)-($argn<0);

la longitud de la cadena menos booleana es menor que cero

+2 bytes para comparar cadenas $argn<"0"

Pruébalo en línea!

PHP, 32 bytes

<?=preg_match_all("#\d#",$argn);

Pruébalo en línea!

Regex cuenta todos los dígitos

35 bytes

<?=strlen($argn)-strspn($argn,"-");

Pruébalo en línea!

longitud de cadena menos recuento -

strspn

Jörg Hülsermann
fuente
1
El primero no funciona, por ejemplo, para 10, porque ^tiene menor prioridad. Puedes arreglarlo con -~.
user63956
¿Por qué no simplemente <?=strlen(abs($argn));?
roberto06
@ user63956 La versión con log10 no puede funcionar en casos de entrada cero, así que la elimino.
Jörg Hülsermann
1
@ JörgHülsermann ¿Por qué no solo $argn?:1? Sería 26 bytes con log10()y abs().
user63956
1
@ JörgHülsermann -~$xes equivalente a ((int)$x)+1. <?=-~log10(abs($argn?:1));parece funcionar.
user63956
4

Fortran 95 (gfortran), 121 96 95 bytes

program c
character b
call get_command_argument(1,b,length=i)
print*,i-index(b,'-')
end program

Explicación:
Resta el índice del signo '-' de la longitud del argumento.
Las matrices comienzan en 1 en Fortran, e index () devuelve 0 si no se encuentra el símbolo.

Editar: Cambiado al entero implícito "i", también argumento consolidado getter.

Editar: -1 byte gracias a @Tsathoggua

Waffleston
fuente
1
Bienvenido a PPCG!
Martin Ender
3

PowerShell, 24 bytes

"$args"-replace'-'|% Le*

convierte el valor "absoluto" de los argumentos de entrada en una cadena y obtiene la propiedad "longitud" de la misma.

1 byte más corto que "".Length

hasta que alguien encuentre una mejor manera de obtener los abdominales de un número en PS, esto probablemente sea lo más breve posible.

colsw
fuente
¿Qué tal "$args".trim('-')|% Le*? :)
lo que sea
3

05AB1E , 2 bytes

þg

Pruébalo en línea!

   # Implicit input [a]...
þ  # Only the digits in [a]...
 g # length of [a]...
   # Implicit output.
Urna de pulpo mágico
fuente
3

brainfuck , 37 bytes

-[+>+[+<]>+]>->,[-<->]<[>+>],[<+>,]<.

La salida es por valor de byte.

Pruébalo en línea!

Explicación

-[+>+[+<]>+]>->  Constant for 45 (from esolangs wiki)
,                Read a byte of input
[-<->]           Subtract that byte from 45
<[>+>]           If the result is nonzero then increment a cell and move to the right
                 (0 means it was a minus; so not counted)
,[<+>,]          Read a byte and increment the cell to its left until EOF is reached
<.               Print the cell that was being incremented
Gato de negocios
fuente
¿Es posible agregar un pie de página al enlace TIO que genera el resultado como un número?
Beta Decay
@BetaDecay Añadido
Business Cat
Eso es genial, gracias: D
Beta Decay
3

Ruby, 15 11 + 1 = 16 12 bytes

Usa la -nbandera.

p~/$/-~/\d/

Pruébalo en línea!

Explicación

                  # -n flag gets one line of input implicitly
p                 # Print
 ~/$/             # Position of end of line (aka string length) in input
     -            # minus
      ~/\d/       # Position of first digit (1 if negative number, 0 otherwise)
Tinta de valor
fuente
1
Que magia es esta
Chowlett
2
@Chowlett agregó una explicación.
Value Ink
2

Jalea , 2 bytes

DL

Pruébalo en línea!

Esto hace literalmente lo que se le pidió:

DL - Main link number n         e.g. -45
D  - convert to a decimal list       [-4,-5]
 L - get the length                  2
Jonathan Allan
fuente
Esa es una característica interesante, ¿ Dfunciona en decimales? Would -1.2salida [-1,-0.2]? Lo intenté yo mismo, no lo hace.
Urna de pulpo mágico
1
No del todo, la conversión de base solo se reduce a las unidades, por lo que, por ejemplo, 654.321Dproduciría [6,5,4.321](bueno, en realidad [6.0,5.0,4.321000000000026])
Jonathan Allan
[-6.0, -5.0, -4.321000000000026], en realidad, aparentemente.
Urna mágica de pulpo
Ah, sí, solo editado, aritmética de coma flotante.
Jonathan Allan
2

CJam , 5 bytes

q'--,

Basado en cadenas.

Pruébalo en línea!

9 bytes para una solución puramente matemática:

riz)AmLm]

O otros 5 con conversión de base:

riAb,
Gato de negocios
fuente
O también 5: rizs,.
Martin Ender
2

Japt , 5 bytes

a s l

Pruébalo en línea!

Explicación

 a s l
Ua s l
Ua     # take the absolute value of the input
   s   # and turn it into a string
     l # and return its length
Luke
fuente
2

JavaScript (ES6), 27 26 25 24 bytes

Toma la entrada como una cadena.

s=>s.match(/\d/g).length
  • Ahorró dos bytes gracias a Arnauld.
Lanudo
fuente
Su título dice 23 bytes, pero su código es 24 ... Sin embargo, esto es 23 bytes s=>`${s>0?s:-s}`.length:!
Dom Hastings
Gracias, @DomHastings. Debes publicar la tuya como una respuesta separada, ya que es un enfoque diferente al mío.
Shaggy
2

JavaScript (ES6), 23 bytes

s=>`${s>0?s:-s}`.length

Enfoque diferente a la respuesta de Shaggy .

Dom Hastings
fuente
3
s=>s.length-(s<0)ahorra 6 bytes
Johan Karlsson
2

Java, 30 24 bytes

i->(""+i.abs()).length()

Asume que ies a BigInteger. Además, el tipo está contextualizado, por lo que no se requieren importaciones, como se muestra en el código de prueba.

Prueba

// No imports
class Pcg120897 {
  public static void main(String[] args) {
    java.util.function.ToIntFunction<java.math.BigInteger> f =
        // No full class declaration past here
        i->(""+i.abs()).length()
        // No full class declaration before here
      ;
    System.out.println(f.applyAsInt(new java.math.BigInteger("-1267650600228229401496703205376"))); // -(2^100)
    System.out.println(f.applyAsInt(new java.math.BigInteger("1267650600228229401496703205376"))); // (2^100)
  }
}

Ahorra

  • 30 -> 24 bytes: gracias a @cliffroot
Olivier Grégoire
fuente
+""en lugar de .toString()?
Cliffroot
2
+1 para proporcionar un código de muestra que muestra cómo se invoca esto y para aclarar el tipo de ien su respuesta. Creo que más respuestas lambda deberían hacer esto.
Poke
1

Python 2 , 31 22 bytes

-9 bytes gracias a Rod.

lambda i:len(`abs(i)`)

Pruébalo en línea!

totalmente humano
fuente
1
len(`abs(s)`)con número ya que la entrada es más corta
Rod
2
Lástima que Python no tenga composición de funciones. Sería justo len∘repr∘abs.
Roberto Bonvallet
1

Brain-Flak , 63 bytes

([({})]((((()()()()())){}{})){}{})((){[()](<{}>)}{})([{}][]<>)

Pruébalo en línea!

Esto es 62 bytes de código y +1 byte para la -abandera.

Intenté otros dos enfoques, pero desafortunadamente ambos fueron más largos:

([]<({}[((((()()()()())){}{})){}{}]<>)((){[()](<{}>)}{})>)({}[{}])

([]<>)<>({}<>)((((([][]())){}{})){}{}[{}])((){[()](<{}>)}{})([{}]{})

Esta debería ser una respuesta muy corta. De hecho, si no tuviéramos que soportar números negativos, podríamos hacer:

([]<>)

Pero primero tenemos que comparar la primera entrada con 45 (ASCII -), que es la mayor parte del recuento de bytes de esta respuesta.

Una solución aritmética podría ser más corta.

DJMcMayhem
fuente
Cuento 62 bytes ..?
totalmente humano
1
@totallyhuman mira mi edición.
DJMcMayhem
49 bytes:([{}]((((()()()()())){}{})){}{})({(<()>)}{}[]<>)
Nitrodon
1

Rubí, 20 bytes

->a{a.abs.to_s.size}
marmeladze
fuente
FYI: para llamarlo, debe hacerlo:->a{a.abs.to_s.size}[-95]
Filip Bartuzi
o simplemente de manera clásica->a{a.abs.to_s.size}.call(-92)
marmeladze
2
no es una forma de golf: D
Filip Bartuzi
1

R, 18 bytes

nchar(abs(scan()))
Sven Hohenstein
fuente
1

Alice , 10 bytes (no competitiva)

 /d/
O@IHc

Pruébalo en línea!

Esta es una solución no competitiva, porque en el momento en que se publicó este desafío, el comando cestaba en el intérprete oficial (y solo: D). Martin Ender lo arregló mientras tanto, así que esto ahora funciona.

Explicación

El puntero de instrucciones pasa a través de los dos espejos ( /) varias veces, por lo que puede ser un poco difícil de seguir. Trataré de explicarlo lo más claramente posible, usando direcciones cardinales (por ejemplo, N está arriba, SW está abajo a la izquierda ...). Llamaré /1al espejo más a la izquierda y /2al más a la derecha.

Command    Direction    Comment
               E        Execution starts from the upper-left corner going right
   /1        E → SE     Passing through the mirror changes direction and switches
                        to ordinal mode (string operations)
   I        SE → NE     Push the input string to the stack, then bounce against
                        the bottom of the code
   /2       NE → S      Back to cardinal mode (numeric operations)
   H           S        Pop n, push abs(n). Execution wraps from bottom to top
   /2        S → SE     Ordinal mode again
   c        SE → NW     Pop s, push each char of s separatedly. Bounce against
                        the bottom right corner
   /2       NW → W      Cardinal mode
   d           W        Push the depth of the stack (which is now equal to 
                        the number of characters in abs(input))
   /1     W → NW → SW   Pass through the mirror, then bounce agains the top
   O        SW → NE     Output the result, then bounce on the bottom left corner
   /1       NE → S      Last mirror, I promise
   @           S        Terminate execution
León
fuente
1

Marca GNU , 78 bytes

Estilo imperativo:

$(eval T=$1)$(foreach D,$(shell seq 9),$(eval T=$(subst $D,? ,$T)))$(words $T)

Estilo funcional, 113 bytes:

$(eval 2?=$(shell seq 9))$(if $2,$(call $0,$(subst $(word 1,$2),? ,$1),$(wordlist 2,$(words $2),$2)),$(words $1))

Pure Make, 83 bytes:

$(eval T=$1)$(foreach D,0 1 2 3 4 5 6 7 8 9,$(eval T=$(subst $D,? ,$T)))$(words $T)
eush77
fuente
1

C ++, 80 76 bytes

#include<string>
int main(int,char**c){printf("%d",strlen(c[1])-(*c[1]<46));}

Imprime la longitud del argumento, menos 1 si el primer carácter es un menos porque boolgarantiza la conversión a 1si trueo 0sifalse

  • 4 bytes gracias a @Squidy por señalar que puedo usar en <46lugar de =='-', y para deferenciar la matriz en lugar de[]
Tas
fuente
Puede eliminar 4 bytes reemplazándolos c[1][0]=='-'con, *c[1]<46ya que podemos suponer que la entrada siempre será un número entero válido. (A menos que se permitan prefijos que no sean '-' ...)
Squidy
@Squidy oh wow bonito hallazgo! ¡Me revolví el cerebro durante años tratando de acortar esto y nunca se me ocurrió eso! Gracias por la sugerencia, y especialmente por suscribirte a PCCG para avisarme.
Tas
1

TI-Basic (TI-84 Plus CE, OS 5.2+), 6 bytes

length(toString(abs(Ans

TI-Basic es un lenguaje tokenizado; length(y toString(son dos bytes cada uno.

Ansse usa como entrada implícita; el último (solo) valor de la línea se devuelve implícitamente.

Bastante simple, toma el valor absoluto para deshacerse de un signo menos, convierte a cadena, devuelve la longitud de la cadena.

Un enfoque matemático de 6 bytes que no funciona para 0:

1+log(abs(Ans
pizzapants184
fuente
¿Qué calculadoras tienen toString(?
kamoroso94
@ kamoroso94 TI-84 Plus CE
pizzapants184