¿Cuánto tengo que escribir?

35

Escribir números se encuentra entre los mundos de programación de Hello, a menudo los números 1-10.

¡Quiero escribir muchos números! Muchos, muchos números. ¿Pero cuántos números tengo que escribir?

Tarea

Dada una entrada entera, dar un número como salida que me daría el número de dígitos que estaría en una cadena que contiene todos los números enteros en el rango de 0 a la entrada, inclusive. El identificador de negación ("-") cuenta como un solo carácter.

Ejemplo de E / S

Entrada: 8
Escrito: 0,1,2,3,4,5,6,7,8
Salida: 9

Entrada: 101
escrita: 0,1,2,3 ...., 99,100,101
Salida: 196

Entrada: 102
escrita: 0,1,2,3 ...., 100,101,102
salida: 199

Entrada -10
Escrito: 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10
salida: 22

Este es un . ¡El número más bajo de bytes gana!

tuskiomi
fuente

Respuestas:

23

05AB1E , 3 bytes

Código:

ÝJg

Utiliza la codificación CP-1252 . Pruébalo en línea!

Explicación:

Ý     # Range [0 .. input]
 J    # Join into one string
  g   # Get the length of the string
Adnan
fuente
11

Röda , 23 bytes

f x{[#([seq(0,x)]&"")]}

Pruébalo en línea!

Explicado:

f x{[#([seq(0,x)]&"")]}
f x{                  } /* Defines function f with parameter x. */
        seq(0,x)        /* Creates a stream of numbers from 0 to x. */
       [        ]       /* Creates an array. */
                 &""    /* Joins with "". */
     #(             )   /* Calculates the length of the resulting string. */
    [                ]  /* Returns the value. */
fergusq
fuente
10

Python 2 , 41 bytes

f=lambda n:len(`n`)+(n and f(n+cmp(0,n)))

Pruébalo en línea!

Dennis
fuente
+1: Realmente no puedes superar esta solución recursiva hecha de forma inteligente con Python
micsthepick
7

Bash + OS X (BSD) utilidades, 24 22 bytes

Gracias a @seshoumara por guardar 2 bytes.

seq 0 $1|fold -1|wc -l

La prueba se ejecuta en Mac OS X:

$ for n in 8 101 102 -10 -1 0 1; do printf %6d $n; ./digitcount $n; done
     8       9
   101     196
   102     199
   -10      22
    -1       3
     0       1
     1       2

Aquí hay una versión de GNU:

Bash + coreutils, 40 38 bytes

Nuevamente, 2 bytes guardados gracias a @seshoumara.

(seq $1 0;seq 0 $1)|uniq|fold -1|wc -l

Pruébalo en línea!

Mitchell Spector
fuente
@tuskiomi Escribí coreutils cuando me refería a las utilidades BSD: lo probé en Mac OS X, donde también funciona en entradas negativas (seq no es lo mismo que GNU seq).
Mitchell Spector
@DigitalTrauma Nice GNU solution. Siga adelante y publíquelo usted mismo si lo desea; Creo que es demasiado diferente para contarlo como una variante mía.
Mitchell Spector
Ok, aquí estás :)
Digital Trauma
¿Qué tal usar fold -1|wc -lpara hacer el conteo? Es mas corto.
seshoumara
6

Python 2, 83 , 78 64 bytes

versión más corta:

lambda x:sum(map(len,map(str,(range(0,x+cmp(x,.5),cmp(x,.5))))))

Esta versión ahorró 5 bytes, gracias a @numbermaniac:

x=input()
print len(''.join(map(str,(range(x+1)if x>0 else range(0,x-1,-1)))))

Pruébalo en línea!

este se me ocurrió después de eso (la misma cantidad de bytes):

x=input()
print sum(map(len,map(str,(range(x+1)if x>0 else range(0,x-1,-1)))))

Pruébalo en línea!

micsthepick
fuente
Se puede utilizar mapen la segunda línea de 78 bytes: print len(''.join(map(str,(range(x+1)if x>0 else range(0,x-1,-1))))). Usted puede ahorrar aún más por lo que es un lambda.
numbermaniac
1
@numbermaniac, ¿puedo hacer algo similar de esta manera?
micsthepick
1
@numbermaniac aquí es un equivalente:print sum(map(len,map(str,(range(x+1)if x>0 else range(0,x-1,-1)))))
micsthepick
lambda x:sum(map(len,map(str,(range(x+1)if x>0 else range(0,x-1,-1)))))por 71 bytes
Felipe Nardi Batista
6

Java 7, 74 bytes (recursivo, incluido el segundo parámetro predeterminado)

int c(int r,int n){r+=(n+"").length();return n>0?c(r,n-1):n<0?c(r,n+1):r;}

Explicación (1):

int c(int r, int n){     // Recursive method with two integer parameters and integer return-type
                         // Parameter `r` is the previous result of this recursive method (starting at 0)
  r += (n+"").length();  //  Append the result with the current number's width
  return n > 0 ?         //  If the input is positive
     c(r, n-1)           //   Continue recursive method with n-1
    : n < 0 ?            //  Else if the input is negative
     c(r, n+1)           //   Continue recursive method with n+1
    ?                    //  Else (input is zero)
     r;                  //   Return the result
}                        // End of method

Java 7, 81 79 bytes (bucle - parámetro único)

Si 0no se permite tener un segundo parámetro predeterminado para este enfoque recursivo por alguna razón, en su lugar se podría usar un bucle for:

int d(int n){String r="x";for(int i=n;i!=0;i+=n<0?1:-1)r+=i;return r.length();}

Explicación (2)

int d(int n){                 // Method with integer parameter and integer return-type
  String r = "x";             //  Initial String (with length 1 so we won't have to +1 in the end)
  for(int i=n; i != 0;        //  Loop as long as the current number isn't 0
      i += n < 0 ? 1 : 1)     //   After every iteration of the loop: go to next number
    r += i;                   //   Append String with current number
                              //  End of loop (implicit / single-line body)
  return r.length();          //  Return the length of the String
}                             // End of method

Código de prueba:

Pruébalo aquí

class M{
  static int c(int r,int n){r+=(n+"").length();return n>0?c(r,n-1):n<0?c(r,n+1):r;}

  static int d(int n){String r="x";for(int i=n;i!=0;i+=n<0?1:-1)r+=i;return r.length();}

  public static void main(String[] a){
    System.out.println(c(0, 8) + "\t" + d(8));
    System.out.println(c(0, 101) + "\t" + d(101));
    System.out.println(c(0, 102) + "\t" + d(102));
    System.out.println(c(0, -10) + "\t" + d(-10));
  }
}

Salida:

9   9
196 196
199 199
22  22
Kevin Cruijssen
fuente
1
Me gusta esta solución, :)
tuskiomi
4

RProgN 2 , 5 bytes

n0R.L

Explicacion

n0R   # A Stack of all numbers between 0 and the input converted to a number.
   .L # The length of the stringification of this.

Solución simple, funciona como un encanto.

Pruébalo en línea!

Un taco
fuente
4

Brachylog , 5 bytes

⟦ṡᵐcl

Pruébalo en línea!

Construye el rango [0, entrada], convierte cada número en una cadena, concatena en una sola cadena y devuelve la longitud del resultado

León
fuente
Noté que TIO tiene una discusión Z; ¿Que pasa con eso? ¿Debería estar en el recuento?
steenbergh
3
@steenbergh: la presentación de Leo es una función, no un programa completo. Dar el argumento Zal intérprete Brachylog le dice que agregue un contenedor apropiado para que la función sea verificable. (Si lo ejecutó como un programa completo, no produciría ningún resultado). Permitimos el envío de programas o funciones aquí, por lo que no debería contar contra el recuento de bytes, ya que en realidad no es parte del envío.
4

PHP, 59 60 bytes

Superado por Roberto06 - https://codegolf.stackexchange.com/a/112536/38505

Gracias a roberto06 por notar que la versión anterior no funcionaba para números negativos.

Simplemente construye una matriz de números, lo pone en una cadena, luego cuenta los dígitos (y el signo menos)

<?=preg_match_all("/\-|\d/",implode(",",range(0,$argv[1])));

Ejecute el ejemplo: php -f 112504.php 8

ʰᵈˑ
fuente
Esto no funciona para una entrada negativa, mira aquí
roberto06
Podría guardar 3 bytes usando en joinlugar de implodeporque es un alias.
Mario
no hay necesidad de escapar del byte menos -1. Por otro lado, puede cambiar su expresión regular a[--9]
Jörg Hülsermann
4

Haskell , 39 38 bytes

f 0=1
f n=length$show=<<[0..n]++[n..0]

Pruébalo en línea! Editar: ¡guardado 1 byte gracias a @xnor!

Explicación:

En Haskell para números ay b [a..b]es el rango de aa ben incrementos de 1 o decrementos de 1, dependiendo de si bes mayor a. Entonces, para un positivo, nla primera lista [0..n]++[n..0]es [0,1,2,...,n]y la segunda está vacía. Para negativo, nel segundo rango rinde [0,-1,-2,...,n]y el primero está vacío. Sin embargo, si n=0ambos rangos producen la lista [0], entonces la concatenación [0,0]conduciría a un resultado falso de 2. Por eso 0se maneja como un caso especial.

El =<<operador de una lista es el mismo que concatMap, por lo que cada número se convierte en una cadena showy todas esas cadenas se concatenan en una cadena larga de la que lengthfinalmente se devuelve.


Antes de la sugerencia de xnor, usé en [0,signum n..n]lugar de [0..n]++[n..0]. signum nes -1para números negativos, 0para cero y 1para números positivos y un rango del formulario [a,b..c]construye la lista de números desde ahasta ccon incremento b. De este modo [0,signum n..n]construye el rango [0,1,2,...,n]para positivo ny [0,-1,-2,...,n]negativo n. Para n=0ello se construiría la lista infinita, [0,0,0,...]por lo que también debemos manejarlo 0como un caso especial.

Laikoni
fuente
Creo que [0..n]++[n..0]debería hacerlo [0,signum n..n].
xnor
4

PHP, 41 35 bytes

Guardado 6 bytes gracias al usuario59178

Como la respuesta de ʰᵈ era incorrecta para una entrada negativa, me encargué de construir una nueva solución:

<?=strlen(join(range(0,$argv[1])));

Esta función :

  • Construye una matriz de 0a $argv[1](también conocido como la entrada)
  • Lo emplea con un carácter vacío (es decir, lo transforma en una cadena)
  • Echo la longitud de la cuerda

Pruébalo aquí!

roberto06
fuente
Esta es una solución mejor a la mía, idk por qué pensé que tenía que hacer eso preg_match():(
ʰᵈˑ
Bueno, no lo habría pensado range()si no fuera por su solución, supongo que estamos a la par;)
roberto06 10/03
1
puede guardar 3 bytes usando en join()lugar de implode(). Es un alias para lo mismo. php.net/manual/en/function.join.php
user59178
1
Y 3 más omitiendo el parámetro 'pegamento'.
user59178
Sabía que había un alias para implode, pero no sabía que podía omitir el parámetro gue. Gracias !
roberto06
4

Rubí , 20 26 29 bytes

->x{[*x..-1,0,*1..x]*''=~/$/}

Pruébalo en línea!

GB
fuente
¿Por qué el aumento?
Brian Minton
La primera versión no funcionaba para números negativos, la segunda versión tenía un problema con cero como entrada.
GB
4

R, 26 20 bytes

sum(nchar(0:scan()))

Enfoque muy básico:

  • Haz un vector 0: x

  • Cuente los caracteres en cada valor (se convertirá automáticamente en una cadena)

  • Suma

¿No está seguro de si hay algún truco para reducir la definición de la función? 6 bytes guardados gracias a Giuseppe, tomando la entrada de stdin en su lugar.

usuario2390246
fuente
podrías hacer en su sum(nchar(0:scan()))lugar y leer nde stdin en su lugar.
Giuseppe
4

Mathematica, 48 47 46 bytes

-1 byte gracias a Martin Ender !

StringLength[""<>ToString/@Range[0,#,Sign@#]]&

Función anónima, tomando el número como argumento.

Solución más corta por Greg Martin , 39 bytes

1-#~Min~0+Tr@IntegerLength@Range@Abs@#&
numbermaniac
fuente
1
Puedes usar Sign@#para #/Abs@#.
Martin Ender
1
Usted puede ahorrar unos pocos bytes con un enfoque ligeramente diferente: 1-#~Min~0+Tr@IntegerLength@Range@Abs@#&. Las 1cuentas iniciales para el dígito de 0, mientras que -#~Min~0explica todos los signos negativos si la entrada es negativa.
Greg Martin
3

Lote, 110 bytes

@set/a"n=%1,t=n>>31,n*=t|1,t=1-t*n,i=0
@for /l %%i in (0,1,9)do @set/a"t+=(i-n)*(i-n>>31),i=i*10+9
@echo %t%

Computa sum(min(0,abs(n)+1-10^k),k=0..9)+(n<0?1-n:1). (Solo tengo que hacerlo 9debido a las limitaciones de la aritmética de enteros de Batch).

Neil
fuente
3

Python 2 , 68 bytes

def f(i,j=1):
 if i==0:print j
 else:j+=len(`i`);f((i-1,i+1)[i<0],j)

Pruébalo en línea!

Más largo que pero diferente de otras soluciones de Python. Define una función recursiva llamada como egf(10)

ElPedro
fuente
3

MATL , 11 bytes

0hSZ}&:VXzn

Pruébalo en línea!

0h           % Implicitly input n. Append a 0: gives array [n 0]
  S          % Sort
   Z}        % Split array: pushes 0, n or n, 0 according to the previous sorting
     &:      % Binary range: from 0 to n or from n to 0
       V     % Convert to string. Inserts spaces between numbers
        Xz   % Remove spaces
          n  % Length of string. Implicit display
Luis Mendo
fuente
3

PowerShell , 23 bytes

-join(0.."$args")|% Le*

Pruébalo en línea! (vomitará en TIO para entradas muy grandes (absolutas))

Utiliza el ..operador de rango para construir un rango desde 0la entrada $args(emitido como una cadena para convertir desde la matriz de entrada). Eso se edita -joinen una cadena (por ejemplo, 01234) y luego Lese toma la ngth de la misma. Eso se deja en la tubería y la salida es implícita.

AdmBorkBork
fuente
La solución exacta que tenía en mi cabeza cuando leí esta pregunta 😝
briantist
3

Perl 6 , 18 bytes

{chars [~] 0...$_}

Intentalo

Expandido:

{  # bare block lambda with implicit parameter 「$_」

  chars        # how many characters (digits + '-')
    [~]        # reduce using string concatenation operator &infix:<~>
      0 ... $_ # deductive sequence from 0 to the input
}
Brad Gilbert b2gills
fuente
3

QBIC , 25 bytes

:[0,a,sgn(a)|A=A+!b$]?_lA

Explicación:

:[0,a     Read 'a' from the cmd line, start a FOR loop from 0 to 'a'
,sgn(a)|  with incrementer set to -1 for negative ranges and 1 for positive ones
A=A+!b$   Add a string cast of each iteration (var 'b') to A$
]         NEXT
?_lA      Print the length of A$
Steenbergh
fuente
3

JavaScript, 50 bytes

Colaborado con @ETHproductions

n=>{for(t="";n;n<0?n++:n--)t+=n;alert(++t.length)}
Oliver
fuente
3

Retina , 28 bytes

\d+
$*
1
$`1¶
1+
$.&
^-?
0
.

Pruébalo en línea!

Explicación

\d+
$*

Convierta el número a unario, manteniendo intacto el signo.

1
$`1¶

Cada 1 se reemplaza por todo en sí mismo más una nueva línea. Con esto obtenemos un rango de 1 a n si n fue positivo, de -1 a n con un adicional -al inicio si fue negativo. Todos los números están en unario y separados por nuevas líneas.

1+
$.&

Convierta cada secuencia de unos al número decimal correspondiente.

^-?
0

Pon un 0al comienzo, reemplazando el extra -si está allí.

.

Cuente el número de caracteres (no de nueva línea).

León
fuente
3

Emacs, 20 bytes

C-x ( C-x C-k TAB C-x ) M-{input} C-x e C-x h M-=

El comando en sí es de 20 pulsaciones de teclas, pero necesito una aclaración sobre cómo se debe contar como bytes. Pensé que contar cada pulsación de tecla como 1 byte sería lo más justo. El comando anterior está escrito convencionalmente para facilitar la lectura.

Explicación

C-x (

Comience a definir una macro de teclado.

C-x C-k TAB

Crea un nuevo macro contador. Escribe 0en el búfer; el valor del contador ahora es 1.

C-x )

Fin de la definición de macro de teclado.

M-{input} C-x e

Después de presionar META, ingrese su número de entrada. La C-x econtinuación, ejecuta la macro que muchas veces.

C-x h

Establezca la marca al comienzo del búfer (que selecciona todo el texto así generado).

M-=

Ejecute el recuento de caracteres en la región seleccionada. El número de caracteres se imprimirá en el minibúfer.

Ejemplo

Disculpas por el terrible color de resaltado. Este es un ejemplo del uso de este comando con la entrada 100. La salida está en el minibúfer en la parte inferior de la pantalla.

Ejemplo de ejecución con entrada de 100

cherilio
fuente
Sí, estoy bastante seguro de que una pulsación de tecla es un byte.
NoOneIsHere
@NoOneIsHere Hay dos pensamientos que tuve sobre eso: 1) ¿Se puede representar el carácter Ctrl + como un solo byte? Y 2) Veo muchas respuestas aquí que cuentan los caracteres Unicode como un byte, pero no lo son, así que pensé que quizás CodeGolf tenga su propia definición de "byte". Gracias.
cheryllium
Realmente no lo se. Pero puedes preguntar por Meta .
NoOneIsHere
3

Lua, 52 bytes

t=0;for i=0,io.read()do t=t+#tostring(i)end;print(t)

Itera a través de un bucle for desde 0 - input, convierte el entero ien una cadena y agrega la longitud de la cadena tantes de imprimirt

Josh
fuente
2

C #, 77 73 bytes

-4 bytes gracias a @Kevin Cruijssen

Función lambda:

(r)=>{var l="";for(int i=0,s=r<0?-1:1;i!=r+s;i+=s)l+=i;return l.Length;};

Sin golf y con casos de prueba:

class P
{
    delegate int numbers(int e);
    static void Main()
    {
        numbers n = (r) =>
        {
            var l = ""; 
            for (int i = 0, s = r < 0 ? -1 : 1; i != r + s; i += s)
                l += i; 
            return l.Length;
        };
        System.Console.WriteLine(n(8));
        System.Console.WriteLine(n(101));
        System.Console.WriteLine(n(102));
        System.Console.WriteLine(n(-10));
        System.Console.ReadKey();
    }
}
Mr Scapegrace
fuente
Puede cambiar el whilepara forguardar un par de bytes: (r)=>{var l="";for(int i=0,s=r<0?-1:1;i!=r+s;i+=s)l+=i;return l.Length;};( 73 bytes )
Kevin Cruijssen
@ Kevin Cruijssen Tienes razón, gracias.
Mr Scapegrace
Probablemente pueda usar un contador int y agregar la longitud dentro del bucle para guardar algunos bytes. Si compila a un Func<int, int>puede llamar a las funciones como r=>...guardar 2 bytes (probablemente puede hacer esto de todos modos).
TheLethalCoder
2

JavaScript, 44 bytes

f=(n,i=1)=>n<0?f(-n)-n:n<i?1:n+1-i+f(n,i*10)
<input type=number oninput=o.textContent=f(+this.value)><pre id=o>

Neil
fuente
2

REXX, 56 bytes

arg n
l=0
do i=0 to n by sign(n)
  l=l+length(i)
  end
say l
idrougge
fuente