Quanto devo scrivere?


35

Scrivere numeri è tra i mondi di programmazione Hello, spesso i numeri 1-10.

Voglio scrivere molti numeri! Molti, molti numeri. Ma quanti numeri devo scrivere?

Compito

Dato un input intero, fornisci un numero come output che mi darebbe il numero di cifre che sarebbero in una stringa contenente tutti i numeri interi compresi nell'intervallo da 0 all'input, incluso. L'identificatore di negazione ("-") conta come un singolo carattere.

Esempio di I / O

Input: 8
Scritto: 0,1,2,3,4,5,6,7,8
Output: 9

Ingresso: 101
scritto: 0,1,2,3 ...., 99.100.101
Uscita: 196

Input: 102
scritto: 0,1,2,3 ...., 100.101.102
output: 199

Ingresso -10
Scritto: 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10
uscita: 22

Questo è un . Vince il numero più basso di byte!

Risposte:


23

05AB1E , 3 byte

Codice:

ÝJg

Utilizza la codifica CP-1252 . Provalo online!

Spiegazione:

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


11

Röda , 23 byte

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

Provalo online!

Ha spiegato:

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. */


7

Utilità Bash + OS X (BSD), 24 22 byte

Grazie a @seshoumara per aver salvato 2 byte.

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

Il test viene eseguito su 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

Ecco una versione GNU:

Bash + coreutils, 40 38 byte

Ancora una volta, 2 byte salvati grazie a @seshoumara.

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

Provalo online!


@tuskiomi Ho scritto coreutils quando intendevo le utility BSD: l'ho testato su Mac OS X, dove funziona anche su input negativi (seq non è lo stesso di GNU seq).
Mitchell Spector

@DigitalTrauma Bella soluzione GNU. Vai avanti e pubblicalo tu stesso se lo desideri; Penso che sia troppo diverso per essere considerato una mia variante.
Mitchell Spector


Che ne dici di usare fold -1|wc -lper fare il conteggio? È più corto
seshoumara,

6

Python 2, 83 , 78 64 byte

versione più corta:

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

questa versione ha salvato 5 byte, grazie a @numbermaniac:

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

Provalo online!

questo mi è venuto in mente da solo dopo quello (stessa quantità di byte):

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

Provalo online!


È possibile utilizzare mapsulla seconda riga per 78 byte: print len(''.join(map(str,(range(x+1)if x>0 else range(0,x-1,-1))))). Si potrebbe risparmiare ancora di più, rendendo un lambda.
numbermaniac

1
@numbermaniac posso fare qualcosa di simile in questo modo?
micsthepick,

1
@numbermaniac qui è 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)))))per 71 byte
Felipe Nardi Batista

6

Java 7, 74 byte (ricorsivo - incluso il secondo parametro predefinito)

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

Spiegazione (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 byte (loop - parametro singolo)

Se 0per qualche motivo non è consentito avere un secondo parametro predefinito come per questo approccio ricorsivo, è possibile utilizzare un for-loop come questo:

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

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

Codice di prova:

Provalo qui.

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

Produzione:

9   9
196 196
199 199
22  22

1
Mi piace questa soluzione :)
tuskiomi,

4

RProgN 2 , 5 byte

n0R.L

explination

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

Soluzione semplice, funziona come un fascino.

Provalo online!


4

Brachylog , 5 byte

⟦ṡᵐcl

Provalo online!

Crea l'intervallo [0, input], converte ogni numero in stringa, si concatena in una singola stringa e restituisce la lunghezza del risultato


Ho notato che TIO ha una discussione Z; cosa succede con quello? Dovrebbe essere nel conteggio?
Steenbergh

3
@steenbergh: l'invio di Leo è una funzione, non un programma completo. Dare l'argomento Zall'interprete Brachylog gli dice di aggiungere un wrapper appropriato per rendere testabile la funzione. (Se lo avessi eseguito come un programma completo, non produrrebbe alcun output.) Qui consentiamo l'invio di programmi o funzioni, quindi non dovrebbe essere conteggiato nel conteggio dei byte, poiché in realtà non fa parte dell'invio.

4

PHP, 59 60 byte

Outgolfed di Roberto06 - https://codegolf.stackexchange.com/a/112536/38505

Grazie a roberto06 per aver notato che la versione precedente non funzionava con numeri negativi.

Crea semplicemente un array di numeri, lo inserisce in una stringa, quindi conta le cifre (e il segno meno)

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

Esegui esempio: php -f 112504.php 8


Questo non funziona per un input negativo, vedi qui
roberto06

È possibile salvare 3 byte utilizzando joininvece che implodeperché è un alias.
Mario

non è necessario sfuggire al meno -1 byte. D'altra parte puoi cambiare la tua regex in[--9]
Jörg Hülsermann

4

Haskell , 39 38 byte

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

Provalo online! Modifica: salvato 1 byte grazie a @xnor!

Spiegazione:

In Haskell per i numeri aed b [a..b]è l'intervallo da aa bin incrementi di 1 o in 1 decremento, a seconda che bsia maggiore a. Quindi per un positivo nla prima lista [0..n]++[n..0]è [0,1,2,...,n]e la seconda è vuota. Per negativo nil secondo intervallo produce [0,-1,-2,...,n]e il primo è vuoto. Tuttavia, se n=0entrambi gli intervalli generano l'elenco [0], la concatenazione [0,0]porterebbe a un risultato falso di 2. Ecco perchè0 viene gestito come un caso speciale.

L' =<<operatore in un elenco è lo stesso di concatMap, quindi ogni numero viene convertito in una stringa da showe tutte quelle stringhe vengono concatenate in una lunga stringa di cui lengthviene infine restituito.


Prima del consiglio di xnor ho usato [0,signum n..n]invece di [0..n]++[n..0]. signum nè -1per i numeri negativi, 0per zero e 1per i numeri positivi e un intervallo del modulo [a,b..c]crea l'elenco di numeri da aa ccon incremento b. In tal modo [0,signum n..n]costruisce l'intervallo [0,1,2,...,n]per positivo ne [0,-1,-2,...,n]per negativo n. Perché n=0costruirebbe la lista infinita, [0,0,0,...]quindi dobbiamo gestirla anche 0come un caso speciale.


Penso che [0..n]++[n..0]dovrebbe fare per [0,signum n..n].
xnor

4

PHP, 41 35 byte

6 byte salvati grazie all'utente59178

Poiché la risposta di ʰᵈ era errata per un input negativo, mi sono preso la responsabilità di costruire una nuova soluzione:

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

Questa funzione:

  • Costruisce un array da 0a $argv[1](noto anche come input)
  • Lo implode con un carattere vuoto (cioè lo trasforma in una stringa)
  • Fa eco alla lunghezza della stringa

Provalo qui!


Questa è una soluzione migliore per me, idk perché pensavo di preg_match()
doverlo

Bene, non ci avrei pensato range()se non fosse per la tua soluzione, immagino che siamo pari;)
roberto06

1
puoi salvare 3 byte usando join()invece di implode(). è un alias per la stessa cosa. php.net/manual/en/function.join.php
user59178

1
E altri 3 omettendo il parametro 'colla'.
user59178

Sapevo che c'era un alias per implode, ma non sapevo di poter omettere il parametro gue. Grazie !
roberto06


4

R, 26 20 byte

sum(nchar(0:scan()))

Approccio molto basilare:

  • Crea un vettore 0: x

  • Contare i caratteri in ciascun valore (verrà forzato automaticamente su una stringa)

  • Somma

Non sei sicuro che ci siano dei trucchi per ridurre la definizione della funzione? 6 byte salvati grazie a Giuseppe, prendendo invece input da stdin.


invece potresti fare sum(nchar(0:scan()))e leggere nda stdin.
Giuseppe,

4

Mathematica, 48 47 46 byte

-1 byte grazie a Martin Ender !

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

Funzione anonima, prendendo il numero come argomento.

Soluzione più breve di Greg Martin , 39 byte

1-#~Min~0+Tr@IntegerLength@Range@Abs@#&

1
Puoi usare Sign@#per #/Abs@#.
Martin Ender,

1
È possibile salvare un paio di byte con un approccio leggermente diverso: 1-#~Min~0+Tr@IntegerLength@Range@Abs@#&. I 1conti iniziali rappresentano la cifra di 0, mentre -#~Min~0rappresentano tutti i segni negativi se l'input è negativo.
Greg Martin

3

Lotto, 110 byte

@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%

Calcola sum(min(0,abs(n)+1-10^k),k=0..9)+(n<0?1-n:1). (Devo solo andare a 9causa dei limiti dell'aritmetica intera di Batch.)


3

Python 2 , 68 byte

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

Provalo online!

Più lungo che diverso dalle altre soluzioni Python. Definisce una funzione ricorsiva chiamata come ad esf(10)


3

MATL , 11 byte

0hSZ}&:VXzn

Provalo online!

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

3

PowerShell , 23 byte

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

Provalo online! (funzionerà su TIO per input (assoluti) molto grandi)

Utilizza l' ..operatore di intervallo per costruire un intervallo 0dall'input $args(cast come stringa per la conversione dall'array di input). Quel -joinEd insieme in una stringa (ad esempio, 01234) e poi la Length è presa della stessa. Rimane sulla pipeline e l'output è implicito.


La soluzione esatta che avevo nella mia testa quando ho letto questa domanda 😝
briantista

3

Perl 6 , 18 byte

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

Provalo

Allargato:

{  # 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
}

3

QBIC , 25 byte

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

Spiegazione:

:[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$

3

JavaScript, 50 byte

Collaborato con @ETHproductions

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


3

Retina , 28 byte

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

Provalo online!

Spiegazione

\d+
$*

Converti il ​​numero in unario, mantenendo intatto il segno.

1
$`1¶

Ogni 1 è sostituito da tutto fino a se stesso più una nuova riga. Con questo otteniamo un intervallo da 1 a n se n era positivo, da -1 a n con un ulteriore -all'inizio se era negativo. Tutti i numeri sono in unario e separati da nuove righe.

1+
$.&

Converti ciascuna sequenza di quelle nel numero decimale corrispondente.

^-?
0

Metti 0a all'inizio, sostituendo il extra -se è lì.

.

Contare il numero di caratteri (non newline).


3

Emacs, 20 byte

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

Il comando stesso ha 20 sequenze di tasti, ma ho bisogno di chiarimenti su come questo dovrebbe essere conteggiato come byte. Ho pensato che contare ogni sequenza di tasti come 1 byte sarebbe il più giusto. Il comando sopra è scritto in modo convenzionale per facilitare la lettura.

Spiegazione

C-x (

Inizia a definire una macro di tastiera.

C-x C-k TAB

Crea un nuovo contatore macro. Scrive 0nel buffer; il valore del contatore è ora 1.

C-x )

Termina la definizione macro della tastiera.

M-{input} C-x e

Dopo aver premuto META, digitare il numero di input. L' C-x eallora esegue la macro che molte volte.

C-x h

Imposta il segno all'inizio del buffer (che seleziona tutto il testo così generato).

M-=

Esegui il conteggio dei caratteri nella regione selezionata. Il numero di caratteri verrà stampato nel minibuffer.

Esempio

Ci scusiamo per il terribile colore di evidenziazione. Questo è un esempio dell'uso di questo comando con l'ingresso 100. L'output si trova nel minibuffer nella parte inferiore dello schermo.

Example execution with input of 100


Sì, sono abbastanza sicuro che una sequenza di tasti è un byte.
NoOneIsHere

@NoOneIsHere Ci sono due pensieri a riguardo: 1) Ctrl + carattere può essere rappresentato come un singolo byte? E 2) Vedo molte risposte qui contando i caratteri Unicode come un byte, ma non lo sono, quindi ho pensato che forse CodeGolf abbia forse una sua definizione di "byte"? Grazie.
cheryllium,

Davvero non lo so. Ma puoi chiedere su Meta .
NoOneIsHere

3

Lua, 52 byte

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

Scorre un ciclo for da 0 - input, converte l'intero iin una stringa e aggiunge la lunghezza della stringa tprima della stampat



2

C #, 77 73 byte

-4 byte grazie a @Kevin Cruijssen

Funzione lambda:

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

Ungolfed e con casi di test:

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

È possibile modificare il whilein forper salvare un paio di byte: (r)=>{var l="";for(int i=0,s=r<0?-1:1;i!=r+s;i+=s)l+=i;return l.Length;};( 73 byte )
Kevin Cruijssen

@Kevin Cruijssen Hai ragione, grazie.
Mr Scapegrace,

Probabilmente puoi usare un contatore int e aggiungere la lunghezza all'interno del ciclo per salvare alcuni byte. Se lo compili in un Func<int, int>puoi chiamare le funzioni come r=>...salvare 2 byte (probabilmente puoi farlo comunque).
TheLethalCoder

2

JavaScript, 44 byte

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>


2

REXX, 56 byte

arg n
l=0
do i=0 to n by sign(n)
  l=l+length(i)
  end
say l
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.