Esse desafio é escrever um programa ou script que conte a soma de todos os dígitos dentro dos números inteiros, de 1 até e incluindo um determinado número.
Entrada, um número inteiro positivo. Saída, a soma dos dígitos nesse número e todos os números menores.
Exemplos:
Input: 5
Integer Sequence: 1, 2, 3, 4, 5
Sum of Digits: 1 + 2 + 3 +4 + 5 = 15
Input: 12
Integer Sequence: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
Sum of Digits: 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 1 + 0 + 1 + 1 + 1 + 2 = 51
Para ficar claro, isso é contar uma soma dos dígitos - não dos números inteiros. Para entradas de um dígito, será o mesmo. No entanto, entradas maiores que 10 terão respostas diferentes. Esta seria uma resposta incorreta :
Input: 12
Output: 78
Outro exemplo, para mostrar a diferença:
Input: 10
Integer Sequence: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Sum of Integers (INCORRECT RESPONSE): 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55
Digit Sequence: 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0
Sum of Digits (CORRECT RESPONSE): 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 1 + 0 = 46
Um caso de teste maior (RESPOSTA CORRETA):
Input: 1000000
Output: 27000001
Regras e Diretrizes:
- O código enviado deve ser um programa ou script completo - não apenas uma função. Se o código exigir inclusões, importações, etc., eles deverão ser incluídos no código publicado.
- O número deve ser inserido pelo usuário - não codificado. A entrada pode ser recebida como argumento da linha de comando, arquivo, stdin ou qualquer outro meio pelo qual seu idioma possa receber a entrada do usuário.
- O código deve ser capaz de manipular adequadamente as entradas pelo menos até
(2^64)-1
. - O código deve gerar apenas a soma.
- Os programas e scripts enviados devem ser fáceis de usar e não desperdiçar recursos de computador (por exemplo: eles não devem declarar matrizes incrivelmente grandes para conter todos os caracteres). Não há bônus ou penalidade estrita para isso, mas seja um bom programador.
Pontuação:
O mecanismo de pontuação principal é pelo tamanho do código. Pontuações mais baixas são melhores. Os seguintes bônus e penalidades também se aplicam:
- -25 Bônus se o seu código puder lidar com todos os números positivos, por exemplo:
1234567891234567891234564789087414984894900000000
- -50 Bônus se o seu código puder lidar com expressões simples, por exemplo
55*96-12
. Para se qualificar para esse bônus, o código deve manipular+ - / *
operadores (adição, subtração, divisão, multiplicação) e impor a ordem das operações. Divisão é divisão inteira regular.- O exemplo dado (
55*96-12
) é avaliado como5268
. Seu código deve retornar o mesmo para qualquer uma dessas entradas - a resposta correta é81393
.
- O exemplo dado (
- -10 Bônus se o seu código se qualifica para o bônus -50 e pode lidar com o
^
operador (expoente). - Bônus -100 se o seu código se qualifica para o bônus -50 e não usa
eval
ou similar para manipular expressões. - +300 de penalidade se o seu código depender de quaisquer recursos da web.
55*96-12
retornar?Respostas:
Perl 6: 108 - (25 + 50 + 100) + 0 = -67 pontos
Solução Golfed (linha final baseada na excelente solução do xfix ):
Solução sem golfe:
A etapa de avaliação funciona por iteração sobre cada símbolo de
*
,/
,+
,-
, encontrar quando que fica entre dois inteiros, e substituindo que usar a função que o símbolo representa.Mais detalhadamente: ele pega cada símbolo (por exemplo
+
) e a função infix que deve representar (por exemplo,&[+]
qual é a abreviação para&infix:<+>
a mesma função que o Perl 6 chama quando você executa1 + 2
) e faz uma substituição global (s:g[…] = …
que é como o Perl 5s/…/…/ge
), que corresponde a dois números inteiros separados pelo símbolo ((\d+) $sym (\d+)
) e o substitui pela saída da função infix correspondente chamada com esses números inteiros (infix($0, $1)
).Finalmente, essa expressão avaliada é inserida
say [+] (1..$expression)».comb
, o que xfix explica muito bem em sua solução .Desculpe estar atrasado para a festa ☺
Edição: Removido suporte para expoentes; eram exatamente 10 caracteres de qualquer maneira e não faziam associatividade corretamente.
fonte
my $g
você pode querer usar algo pré-declarado (acho que$!
poderia funcionar, mas não testei).my$g=get;for <* / + -> {$g~~s:g[(\d+)$^s(\d+){}]=infix:[$^s] |@()};say [+] (1..$g)».comb
Isso iria obter a pontuação até 88 caracteres ou -97 pontosMathematica 30- (10 + 50) = -30
Encurtado por 4 caracteres graças a ybeltukov.
Range@n
retorna os números de 1 an
.Integerdigits@n
divide cada um desses números em seus dígitos.Total[n,2]
soma os dígitos. O 2 é para permitir a soma entre diferentes níveis, ou seja, listas de listas.Teste
Expressões
fonte
Tr@Flatten
pode ser reduzida aTotal[...,2]
:IntegerDigits@Range@#~Total~2&
.C:
150138 - (100 + 50) = -12Muito vergonhosamente roubando a resposta @Fors daqui para fazer a avaliação da expressão: https://codegolf.stackexchange.com/a/11423/13877
Uso da amostra:
Nota: a implementação da expressão não assume precedência do operador e consome valores à medida que os recebe; ex,
1+2*3 = 9
ao invés do típico7
.fonte
sed,
411283- 25 = 258Não posso me incomodar em jogar mais agora. :-) Não recomendado para uso com números inteiros grandes remotamente, mas tecnicamente ele pode lidar com números inteiros arbitrariamente grandes (você provavelmente ficará sem memória RAM muito rapidamente, porém, já que eu (mais ou menos) preciso codificar o número em unário).
Uso da amostra
(Linhas de entrada recuadas para facilitar a leitura.)
fonte
python, 55- (50 + 25 + 10) = -30
Ineficiente, porém mais curto e também capaz de lidar com expressões.
EDIT: Obrigado Wolframh e legoStormtroopr pelos truques: D
python, 149- (25 + 50 + 10) = 64
Minha primeira versão
entrada:
saída:
fonte
xrange
solução no1234567891234567891234564789087414984894900000000
xrange
: Deval(raw_input())
porinput()
. Owhile
loop pode serwhile t:s+=sum(map(int,
t));t-=1
.input()
vez deeval(raw_input())
, comoinput
jáeval
é a expressão! Isso significa que você pode obter o bónus -10 pelo símbolo de poder e o bônus -100 por não usareval
!!!eval
e semelhantes , então eu acho que o -100 não contariaPython - 108 caracteres menos 85 bônus, 23 golpes, lida com entradas muito, muito muito grandes
A maioria dessas soluções parece estar repetindo todas as entradas menos que a entrada e somando todas as somas de dígitos. Isso funciona, mas eu acho que é deselegante e questionaria se eles são realmente elegíveis para o bônus de 25 pontos, já que eu não acho que eles seriam capazes de lidar com a entrada
1234567891234567891234564789087414984894900000000
durante nossas vidas. De fato, em uma entrada den
dígitos, essas soluções levamO(10^n)
tempo. Em vez disso, optei por jogar matemática nesse problema.O conjunto de todos os
x
números de dígitos é isomórfico para o conjunto{0,1,2,3,4,5,6,7,8,9}^x
. Para um fixo,(n,sig)
existemx
diferentes valores parasig
,10^x-1
pontos com osig
th índice definido comon
, e a soma de todos os dígitos0-9
é 45. Isso é tudo tratado porf
.g
é algo com o qual provavelmente todos estamos familiarizadosmagic
pega todos os dígitos do número de entrada e os repete do menos para o mais significativo. É mais fácil rastrear isso com um exemplo de entrada, digamos1,234,567
.Para lidar com o intervalo
1,234,567-1,234,560
, precisamos somar todos os dígitos de1
até7
e adicionar às7
vezes a soma dos outros dígitos, para lidar com todos os números maiores que1,234,560
. Agora precisamos lidar com o restante.Para lidar com o intervalo
1,234,560-1,234,500
, adicionamos6
(val
) e diminuímos o limite superior para1,234,559
. Ao fazer o restante da queda, veremos todos os números de um dígito 6 vezes (val*f(sig)
). Veremos todos os números de0
até5
exatamente10
cada vez ((10**sig)*g(val-1)
). Veremos todos os outros dígitos desse número exatamente 60 vezes ((val*10**sig)*sum(digits[sig+1:])
). Agora, lidamos com todos os números estritamente maiores que1,234,500
. A mesma lógica será aplicada indutivamente em todos os significados.Jogar com este recurso, graças ao WolframH, reduz essa solução a
E a soma dos dígitos de todos os números inteiros até
1234567891234567891234564789087414984894900000000
é265889343871444927857379407666265810009829069029376
O maior número que eu consegui jogar na versão de golfe é 10 ^ 300, momento em que os carros alegóricos começam a transbordar e a instabilidade numérica começa a causar problemas. Com uma rápida função de exponenciação quadrática e multiplicada, esse problema desapareceria.
E o suporte ao LaTeX seria realmente útil ...
fonte
2.65889343871e+50
, que é uma aproximação de ponto flutuante da solução real. Aparentemente, você imprimiu emint(t)
vez det
como no código que você deu. Isso esta errado; a verdadeira solução é265889343871444899381999757086453238874482500000214
. Apenas evite usar flutuadores, ou seja, substitua**(x-1)
pelos mais curtos**x/10
.d
(porque é usado duas vezes). Eliminando os outros (e usando alguns truques), chega-se ad=map(int,str(input()))\nprint sum(v*(10**s*((v-1)/2+sum(d[:~s]))-~s*9*10**s/2)for s,v in enumerate(d[::-1]))
(108 caracteres). Funciona bem em entradas de qualquer tamanho (comoint("1"*1000)
).10**-1
é0.1
, e a partir daí tudo se transforma em carros alegóricos.1/10
é0
(divisão inteira) e tudo pode permanecerint
s.TI-BASIC, 137 - (50 + 10 + 100) = -23
A entrada manipula números até
1E100
e avalia automaticamente. Pode lidar com expressões.Embora seja uma variedade incrivelmente grande, não estou desperdiçando recursos do computador (isso é executado a partir de uma calculadora ).
fonte
eval
não deve ser recebido.Scala 66
fonte
C,
7774C,
150124 - 25 = 99Aqui está uma versão alternativa que tecnicamente deve ser elegível para o bônus de 25 para "qualquer" número inteiro positivo, mas é impraticável lentamente, pois o algoritmo tem tempo linear em sua entrada. Independentemente disso, foi divertido escrever. Subtrai manualmente um número lido como caracteres ASCII. Esta versão é 150 caracteres. (Agora, com código horrível, debochado e cheio de argumentos!)
C,
229224- (50 + 100) = 74Variação de manipulação de expressão. Implementos precedência do operador de acordo com regras típicas:
/ * - +
. Limitado a 97 tokens = 48 termos.fonte
GolfScript 18 - 50 = -32
Explicação: Suponha que a entrada seja "12":
A pilha é
[0,1,2,3,...,12]
.A pilha é
"01234...9101112"
.A pilha é
"0 1 2 ... 1 0 1 1 1 2"
.A pilha é
[0,1,2,...,9,1,0,1,1,1,2]
.A pilha é 51, conforme desejado.
A entrada aqui pode ser qualquer expressão válida do GolfScript, que pode incluir expoentes. Por exemplo:
Desde então
2(5 + 5) - 8 = 12
. Eu acho que isso deve se qualificar para o bônus, mas talvez fosse esperado que fosse apenas se na forma normal, não na notação polonesa reversa do GolfScript.fonte
^
??
^
, não?
oupow
e etc.Rubi, 37 - 50 = -13
Avaliação dupla, por todo o céu! Como nas outras soluções Ruby, acho que teoricamente isso deve funcionar com números arbitrariamente grandes, mas o tempo de execução seria ... terrível.
Versão mais antiga (pontuação de 49 a 50)
Supondo que o bônus de 10 caracteres realmente exija que o exponenciação seja um sinal de intercalação, a maneira mais curta que eu poderia acrescentar é:
O que custa mais caracteres do que o bônus daria.
fonte
p"#{[*1..eval(gets)]}".chars.map(&:to_i).inject :+
&
quase o suficiente no golfe. Na verdade, você não precisa do espaço entreinject
e:+
tampouco.Perl 6 (28 - 75 + 0 = -47 bytes)
Ele pode lidar com todos os números positivos (no entanto, os grandes levarão um longo tempo, porque atualmente as implementações do Perl 6 são lentas, mas o Perl 6 suporta inteiros grandes nativamente). Ele usa
eval
, para implementar uma calculadora simples (pena de cinco caracteres por cinquenta caracteres vale a pena). É lento apenas porque as implementações atuais são lentas, mas, em teoria, deve ser rápido o suficiente (quando as implementações do Perl 6 melhorarem, isto é). Surpreendentemente, também ganhei com o Mathematica (por enquanto).»
nesse código, na verdade, não é necessário, mas eu o coloquei aqui por razões de desempenho (caso contrário, o programa alocaria uma string inteira. A razão pela qual está aqui é que o Perl 6 não possui seqüências infinitas, mas possui listas infinitas.De qualquer forma, você pode perguntar como esse código funciona. Bem, eu vou passar parte por parte.
get.eval
Isso obtém uma linha (
get
função) e a avalia (eval
método).1..get.eval
Depois disso, o Perl 6 prepara um objeto de intervalo, do
1
valor avaliado. Esse é um intervalo, então nada de grande é alocado.».comb
.comb
O método divide a string em caracteres (a menos que seja chamado com um argumento ). Por exemplo,'cat'.comb
retorna'c', 'a', 't'
.»
mapeia os elementos da lista, para que.comb
seja executado em todos os itens - não apenas na lista em si (por exemplo,(4, 9)».sqrt
fornece2, 3
). Isso também não aloca mais do que o necessário, porque o Perl 6 possui listas infinitas (como Haskell, por exemplo).»
O caractere realmente não é necessário, pois.comb
pode ser usado diretamente na lista, mas isso envolve coerção implícita de strings (e o Perl 6 não possui infinitas strings, portanto isso desperdiçaria memória). Por exemplo, a1, 2, 3
lista após a conversão na string é retornada1 2 3
. Para Perl 6, um espaço é um número perfeitamente fino que significa 0, portanto o código funcionaria, mesmo com essa conversão. No entanto, abusaria dos recursos de computação.[+]
Este é um operador de redução. Basicamente,
[]
nesse caso, você pode usar um operador+
. A lista depois reduzir operador é reduzido, de modo que[+] 1, 2, 3
é1 + 2 + 3
, o que é6
. O Perl 6 usa operadores separados para números e seqüências de caracteres, portanto não será considerado concatenação.say
Finalmente,
say
gera o resultado. Afinal, você quer ver o resultado final, não é?fonte
[+] 1,2,3,4,5,6,7,8,9,10
é1+2+3+4+5+6+7+8+9+10
, estou certo?>
pode ser encadeado, então isso3 > 2 > 1
é verdade. A mesma propriedade se aplica à redução de operadores, portanto,[>] 3, 2, 1
ainda é verdade, pois significa3 > 2 > 1
-[>]
pode ser usada para determinar se os números estão em ordem decrescente.get.Int
vez deeval
? Precisa de expressões matemáticas?sort
sem argumento do método de comparação).Perl 31 - Sem bônus
Saída de amostra:
Perl 5 com
-p
, 50 - 28 bytes: -22Experimente online!
fonte
J, 22
Explicação
A avaliação prossegue da direita para a esquerda.
fonte
+/,10#.inv>:i.
seria mais curto. Mas ainda é uma função e não um programa completo, como o OP pediu.R, 64 - (50 + 10) = 4
Quando isso é executado, o usuário é solicitado a inserir.
Versão antiga (não pode lidar com expressões): 46 caracteres:
fonte
u<-function(x) utf8ToInt(x)
e assim por diante.u <- utf8ToInt
semfunction
. Isso pode ser útil para o código de golfe se a função for usada várias vezes.Rcheatcodegolf
pacote, é legal usar as funções predefinidas nesse pacote? :-)Lote - (181 - 50) - 131
Só por diversão.
Vou torná-lo um pouco mais legível:
O método antigo usa o loop for para obter a saída do comando powershell, em vez de gravar e ler um arquivo:
Defina a entrada como uma variável -
v
- usando/a
para aceitar expressões aritméticas.Infelizmente, era necessário ativar a expansão atrasada.
Use um loop for para contar de 1 ao valor inserido -
v
.Para lidar com números maiores que 9, tive que usar o powershell para obter o comprimento da string e usar outro loop for para dividir essa string e adicioná-la à soma -
s
.Você pode alterar o nome
powershell.exe
parap.exe
em C: \ WINDOWS \ System32 \ WindowsPowerShell \ v1.0 \ e chamá-lo com apenasp "&{'%%a'.length-1}
, economizando 9 bytes. Mas isso não está realmente no espírito disso.Deixei o segundo correndo enquanto eu tomava meu almoço.
Eu realmente não posso testá-lo com números que são também muito maior do que isso devido à forma como retardá-lo é. No entanto, deve funcionar para números razoavelmente grandes.
2147483647
é o maior número necessário (número inteiro máximo de 32 bits) antes de fornecer o seguinte erro -É claro que isso me desqualifica do desafio.
fonte
v
e usá-la%1
diretamente. 2. Você pode subtrair 1 no script do PowerShell em vez do longo, o@set /a b=%%b-1
que economiza muito. Com essas mudanças, eu tê-lo para baixo para 211 a partir do original 240. :-)[decimal]
tipo permite valores de até (2 ^ 96) -1.Dyalog APL , 9-160 * = -151
Experimente online!
⎕
obter entrada avaliada,por exemplo,
"7+5"
dá12
⍳
índices 1 ... n[1,2,3,4,5,6,7,8,9,10,12]
⍕¨
formate cada número em string["1","2","3","4","5","6","7","8","9","10","11","12"]
∊
alistar-se (achatar)"123456789101112"
⍎¨
executar cada caractere (produz uma lista de números de um dígito)[1,2,3,4,5,6,7,8,9,1,0,1,1,1,2]
+/
soma51
* Pontuação
-50 de bônus, pois até aceita expressões como entrada. A expressão deve ser APL válida, aceitável de acordo com OP .
-10 de bônus porque porque ele também lida com o
^
(*
no APL).-100 de bônus porque a entrada de expressão é manipulada sem o uso explícito de
eval
(ou seja,⍎
no APL).fonte
eval
ou similar para manipular expressões. " Como⍎¨
parece executar cada caractere um por um, é quase o mesmo que um eval (exceto que executa os caracteres um por um em vez de todos ao mesmo tempo, comoeval
faz).⍎¨
é usado apenas para converter dígitos em números inteiros, não para manipular expressões.⎕
tipo de entrada + avaliação integrada então, ou a avaliação é sempre feita implicitamente quando as expressões são inseridas?⎕
sempre pega uma expressão como entrada, avalia-a e retorna seu resultado. Então, para inserir uma string, você precisará colocar aspas. O fato de um built-in (⍞
) retornar a entrada como texto bruto não deve importar (especialmente porque os símbolos indicam que⎕
é o método de entrada principal e⍞
é uma variante especial), pois, caso contrário, obter o bônus exigiria a implementação de uma matemática avaliador - uma tarefa totalmente diferente da principal. Eu não gosto de bônus, e o -100 é bobo ou tinha APL em mente, mas imho, parece um ajuste exato para o bônus.⎕
fato, é a maneira normal de obter informações e manipular expressões automaticamente, eu também acho que isso se encaixa no bônus, portanto, +1 de mim. De qualquer forma, os bônus são bobos hoje em dia, mas é uma maneira agradável de utilizá-los para minimizar sua pontuação.C # (161)
Bonita
fonte
Python3 + Bash (78 - 185 = -107)
Se o resultado da expressão não for inteiro, ele será truncado primeiro. Se o resultado da expressão for negativo, o resultado será indefinido.
Use-o como:
1: a menos que você conte invocando o Python do Bash como tal, mas não acho que seja esse o caso. Se você acha que realmente é, então a pontuação ajustada é -7.
fonte
Java, 254
Manipula expressões. Dê a expressão que desejar no alvo. Alças até que o comprimento possa suportar. Se você limpar a remoção de todos os espaços em uma linha e nenhuma declaração para imprimir, ela conta com 254 caracteres (considerando as longas palavras baseadas na programação Java).
PS: Este é um programa completo, não apenas lógico. Contagem de palavras dada para o programa, não apenas a lógica.
fonte
Java (JDK8), 272
Meu primeiro desafio, sugestões são bem-vindas =)
Recuado:
fonte
CJam, 9 - 25 = -16
O CJam é alguns meses mais novo que esse desafio, portanto, não é elegível para a marca de seleção verde. Além disso, isso não está superando o Perl. ;) Eu gostei bastante da abordagem, então queria publicá-la de qualquer maneira.
Teste aqui.
A idéia é criar um intervalo de 0 a N. Esse intervalo é então convertido em uma string, que apenas concatena os números inteiros consecutivos. Para N = 12, teríamos
Cada caractere é convertido em um número inteiro com
:~
(produzindo uma matriz de números inteiros) e, em seguida, resumido com:+
. O CJam pode lidar com números inteiros arbitrariamente grandes.fonte
Python 3 + astor ,
10171007 bytes - (25 + 50 + 100) = Pontuação:842834salvou 10 bytes removendo
ts
e alterandop
edit: Não consigo testar o número inteiro ridiculamente longo (1234567891234567891234564789087414984894900000000) [trava o meu computador], mas, pelo que sei, o Python 3 suporta números inteiros arbitrariamente longos.
Esta implementação
usaabusa da AST. Eu não consideraria abusar do AST como "eval ou similar".Com preguiça de escrever sem limites, então eu vou lhe dar uma explicação das aulas:
A última linha apenas executa essas classes na ordem apropriada na entrada, para preservar a ordem das operações e evitar comportamentos indesejados.
Exemplo de uso ($ ou> significa entrada do usuário) e, a propósito, o programa real recebe entrada apenas uma vez:
fonte
C # (108)
Bonita
fonte
int
; em C, tudo é padronizado comoint
... Ah, é c #.Rubi -> 83-50 = 33
Versão "Para testar":
Resultados dos testes
fonte
C # (80)
É minha outra tentativa.
Bonita
fonte
n--
e é+
necessário? Eu não acho que seja em outras linguagens de estilo C.2^64-1
não cabe em 64 bits.4.5
; 2) a soma média de 20 dígitos é90
(2^64
possui 20 dígitos); então o valor esperado estará em torno de90 * 2^64 ≈ 1.66*10^21
. Então você precisaria de pelo menos71
bits, no máximo72
.Ruby 69-50 = 19 (ou -4)
Definitivamente, isso pode ser jogado juntos, mas aqui está a
primeiraquinta tentativaEle também funciona para todos os números, mas é muito lento para eles, pois é mais lento que O (n), então eu não adicionaria o -25. Se a lentidão for boa, seria -4, embora
Ruby 133-50-25 = 58
Esta é a versão mais rápida, executada em menos de O (n) tempo (e usa matemática real!), Para que possa fornecer resultados rapidamente para números inteiros grandes, adicionando -25:
fonte
Haskell, 74-25 = 49
main=getLine>>=print.sum.map(\c->read[c]).concatMap show.(\x->[0..x]).read
fonte
interact
e o fato de que>>=
para listas é o mesmo queflip concatMap
você pode jogar até 63 caracteres como este:main=interact$show.sum.map(\c->read[c]). \x->[0..read x]>>=show
\c->read[c]
éread.(:[])
ECMAScript 6, 86 - 50 = 36
fonte
for(i=eval(prompt(s=""));i;s+=i--)alert(s.replace(/\d/g,c=>Array(-~c).join()).length)
..join()
):for(i=eval(prompt(s=""));i;s+=i--)alert(s.replace(/\d/g,c=>Array(-~c)).length)
. 78 - 50 = 28 !R (72 pontos)
Saída:
fonte