Escrever números está entre os mundos Hello da programação, geralmente os números 1 a 10.
Eu quero escrever muitos números! Muitos, muitos números. Mas quantos números eu tenho que escrever?
Tarefa
Dada uma entrada inteira, forneça um número como saída que me daria o número de dígitos que estariam em uma sequência contendo todos os números inteiros no intervalo de 0 à entrada, inclusive. O identificador de negação ("-") conta como um único caractere.
Exemplo de E / S
Entrada: 8
Escrita: 0,1,2,3,4,5,6,7,8
Saída: 9
Entrada: 101
gravada: 0,1,2,3 ...., 99,100,101
Saída: 196
Entrada: 102
gravada: 0,1,2,3 ...., 100.101.102
saída: 199
Entrada -10
Gravada: 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10
saída: 22
Este é um código de golfe . O menor número de bytes vence!
Utilitários Bash + OS X (BSD),
2422 bytesObrigado a @seshoumara por salvar 2 bytes.
O teste é executado no Mac OS X:
Aqui está uma versão do GNU:
Bash + coreutils,
4038 bytesMais uma vez, foram salvos 2 bytes graças a @seshoumara.
Experimente online!
fonte
fold -1|wc -l
para fazer a contagem? É mais curto.Python 2,
83,7864 bytesversão mais curta:
esta versão economizou 5 bytes, graças a @numbermaniac:
Experimente online!
este que eu criei sozinho depois disso (mesma quantidade de bytes):
Experimente online!
fonte
map
na segunda linha de 78 bytes:print len(''.join(map(str,(range(x+1)if x>0 else range(0,x-1,-1)))))
. Você pode economizar ainda mais transformando-o em uma lambda.print sum(map(len,map(str,(range(x+1)if x>0 else range(0,x-1,-1)))))
lambda x:sum(map(len,map(str,(range(x+1)if x>0 else range(0,x-1,-1)))))
para 71 bytesJava 7, 74 bytes (recursivo - incluindo o segundo parâmetro padrão)
Explicação (1):
Java 7,
8179 bytes (loop - parâmetro único)Se
0
não for permitido ter um segundo parâmetro padrão para essa abordagem recursiva, por algum motivo, um loop for como este pode ser usado:Explicação (2)
Código do teste:
Experimente aqui.
Saída:
fonte
RProgN 2 , 5 bytes
Explicação
Solução simples, funciona como um encanto.
Experimente online!
fonte
Braquilog , 5 bytes
Experimente online!
Cria o intervalo [0, entrada], converte cada número em sequência, concatena em uma única sequência e retorna o comprimento do resultado
fonte
Z
; o que há com isso? Deveria estar na contagem?Z
ao interpretador Brachylog solicita que ele adicione um wrapper apropriado para tornar a função testável. (Se você o executasse como um programa completo, ele não produziria nenhuma saída.) Permitimos envios de programas ou funções aqui, para que não sejam contabilizados na contagem de bytes, pois na verdade não faz parte do envio.PHP,
5960 bytesOutgolfed by Roberto06 - https://codegolf.stackexchange.com/a/112536/38505
Obrigado a roberto06 por perceber que a versão anterior não funcionava para números negativos.
Simplesmente cria uma matriz de números, coloca-a em uma string e conta os dígitos (e o sinal de menos)
Execute o exemplo:
php -f 112504.php 8
fonte
join
vez deimplode
porque é um alias.[--9]
Haskell ,
3938 bytesExperimente online! Editar: salvou 1 byte graças a @xnor!
Explicação:
Em Haskell para números
a
eb
[a..b]
é o intervalo dea
atéb
1 em incrementos ou 1 em decréscimos, dependendo seb
é maiora
. Portanto, para um positivo,n
a primeira lista[0..n]++[n..0]
é[0,1,2,...,n]
e a segunda está vazia. Para negativo,n
o segundo intervalo cede[0,-1,-2,...,n]
e o primeiro está vazio. No entanto, se osn=0
dois intervalos produzirem a lista[0]
, a concatenação[0,0]
levaria a um resultado falso de2
. É por isso0
é tratado como um caso especial.O
=<<
operador-em uma lista é o mesmo queconcatMap
, portanto, cada número é convertido em uma cadeia de caracteres porshow
e todas essas cadeias são concatenadas em uma cadeia longa, da qual elalength
finalmente é retornada.Antes da dica do xnor, usei em
[0,signum n..n]
vez de[0..n]++[n..0]
.signum n
é-1
para números negativos,0
para zero e1
para números positivos, e um intervalo do formulário[a,b..c]
cria a lista de números dea
parac
com incrementob
. Assim,[0,signum n..n]
cria o intervalo[0,1,2,...,n]
para positivon
e[0,-1,-2,...,n]
negativon
. Poisn=0
criaria a lista infinita, por[0,0,0,...]
isso também precisamos lidar0
com um caso especial.fonte
[0..n]++[n..0]
deveria fazer por[0,signum n..n]
.PHP,
4135 bytesGuardado 6 bytes graças a user59178
Como a resposta de was estava errada para uma entrada negativa, decidi criar uma nova solução:
Esta função:
0
para$argv[1]
(também conhecida como entrada)Experimente aqui!
fonte
preg_match()
:(range()
se não fosse para a sua solução, eu acho que estamos quites;)join()
vez deimplode()
. é um apelido para a mesma coisa. php.net/manual/en/function.join.phpimplode
, mas não sabia que poderia omitir o parâmetro gue. Obrigado !Ruby ,
20 2629 bytesExperimente online!
fonte
R,
2620 bytessum(nchar(0:scan()))
Abordagem muito básica:
Faça um vetor 0: x
Contar os caracteres em cada valor (será coagido a uma sequência automaticamente)
Não sabe se existem truques para reduzir a definição de função?6 bytes salvos graças a Giuseppe, recebendo a entrada de stdin.fonte
sum(nchar(0:scan()))
e ler an
partir de stdin.Mathematica,
484746 bytes-1 byte graças a Martin Ender !
Função anônima, tomando o número como argumento.
Solução mais curta de Greg Martin , 39 bytes
fonte
Sign@#
para#/Abs@#
.1-#~Min~0+Tr@IntegerLength@Range@Abs@#&
. A inicial é1
responsável pelo dígito 0, enquanto-#~Min~0
a todos os sinais negativos, se a entrada for negativa.Lote, 110 bytes
Computa
sum(min(0,abs(n)+1-10^k),k=0..9)+(n<0?1-n:1)
. (Eu só tenho que ir9
devido às limitações da aritmética de número inteiro do lote).fonte
Python 2 , 68 bytes
Experimente online!
Mais do que mas diferente de outras soluções Python. Define uma função recursiva chamada como por exemplo
f(10)
fonte
MATL , 11 bytes
Experimente online!
fonte
PowerShell , 23 bytes
Experimente online! (vomitará no TIO para entradas muito grandes (absolutas))
Usa o
..
operador range para construir um intervalo0
para a entrada$args
(convertido como uma string para converter a partir da matriz de entrada). Isso é-join
editado em uma sequência (por exemplo,01234
) e, em seguida, oLe
número é deduzido. Isso é deixado no pipeline e a saída está implícita.fonte
Perl 6 , 18 bytes
Tente
Expandido:
fonte
QBIC , 25 bytes
Explicação:
fonte
JavaScript, 50 bytes
Colaborou com @ETHproductions
fonte
Bash + coreUtil GNU, 28
Experimente online .
fonte
Retina , 28 bytes
Experimente online!
Explicação
Converta o número em unário, mantendo o sinal intocado.
Cada 1 é substituído por tudo, além de uma nova linha. Com isso, obtemos um intervalo de 1 a n se n for positivo, de -1 a n com um adicional
-
no início se for negativo. Todos os números são unários e separados por novas linhas.Converta cada sequência de unidades para o número decimal correspondente.
Coloque um
0
no início, substituindo o extra,-
se estiver lá.Conte o número de caracteres (que não são de nova linha).
fonte
Emacs, 20 bytes
O comando em si é de 20 pressionamentos de tecla, mas preciso esclarecer como isso deve ser contado como bytes. Eu raciocinei que contar cada pressionamento de tecla como 1 byte seria o mais justo. O comando acima é escrito convencionalmente para facilitar a leitura.
Explicação
Comece a definir uma macro do teclado.
Crie um novo contador de macro. Grava
0
no buffer; o valor do contador é agora 1.Finalize a definição da macro do teclado.
Depois de pressionar META, digite seu número de entrada. O
C-x e
então executa a macro tantas vezes.Defina a marca para o início do buffer (que seleciona todo o texto gerado).
Execute a contagem de caracteres na região selecionada. O número de caracteres será impresso no minibuffer.
Exemplo
Desculpas pela terrível cor de destaque. Este é um exemplo de uso deste comando com a entrada 100. A saída está no minibuffer na parte inferior da tela.
fonte
Lua, 52 bytes
Repete um loop for da entrada 0, converte o número inteiro
i
em uma string e adiciona o comprimento da stringt
antes de imprimirt
fonte
Perl 5 , 32 bytes
31 bytes de código +
-p
sinalizador.Experimente online!
fonte
C #,
7773 bytes-4 bytes graças a @Kevin Cruijssen
Função Lambda:
Ungolfed e com casos de teste:
fonte
while
quefor
para salvar um 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 )Func<int, int>
poderá chamar as funções comor=>...
salvar 2 bytes (provavelmente pode fazer isso de qualquer maneira).JavaScript, 44 bytes
fonte
REXX, 56 bytes
fonte