Entrada:
Um número inteiro positivo n que é 1 <= n <= 25000
.
Resultado:
- Nesta sequência, começamos com o número decimal 1 / n .
- Em seguida, tomar a soma dos dígitos até o n 'th dígitos depois da vírgula (1-indexado); seguido pela soma dos dígitos até ( n -1) 'ª, depois ( n -2)' ª, etc. Continue até n ser 1.
- A saída é a soma de tudo isso combinado.
Por exemplo:
n = 7
1/7 = 0.1428571428...
7th digit-sum = 1+4+2+8+5+7+1 = 28
6th digit-sum = 1+4+2+8+5+7 = 27
5th digit-sum = 1+4+2+8+5 = 20
4th digit-sum = 1+4+2+8 = 15
3rd digit-sum = 1+4+2 = 7
2nd digit-sum = 1+4 = 5
1st digit = 1
Output = 28+27+20+15+7+5+1 = 103
Regras do desafio:
- Se o decimal de 1 / n não tiver n dígitos após a vírgula, os que faltam serão contados como 0 (ou seja
1/2 = 0.50 => (5+0) + (5) = 10
). - Você pega os dígitos sem arredondar (ou seja, os dígitos de
1/6
são166666
e não166667
)
Regras gerais:
- Aplicam-se regras padrão à sua resposta, para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados, programas completos. Sua chamada.
- As brechas padrão são proibidas.
- Se possível, adicione um link com um teste para o seu código.
- Além disso, adicione uma explicação, se necessário.
Primeiro 1 - 50 na sequência:
0, 10, 18, 23, 10, 96, 103, 52, 45, 10, 270, 253, 402, 403, 630, 183, 660, 765, 819, 95, 975, 1034, 1221, 1500, 96, 1479, 1197, 1658, 1953, 1305, 1674, 321, 816, 2490, 2704, 4235, 2022, 3242, 2295, 268, 2944, 3787, 3874, 4097, 1980, 4380, 4968, 3424, 4854, 98
Últimos 24990 - 25000 na sequência:
1405098782, 1417995426, 1364392256, 1404501980, 1408005544, 1377273489, 1395684561, 1405849947, 1406216741, 1142066735, 99984
code-golf
sequence
number-theory
Kevin Cruijssen
fonte
fonte
Respostas:
Geléia , 9 bytes
Um pouco lento, mas curto. Experimente online! ou verifique os 50 primeiros casos de teste .
Como funciona
fonte
Mathematica, 42 bytes
ou
ou
Explicação
Veja o exemplo da especificação do desafio. Queremos calcular:
Reorganizando, isto é:
onde
.
é o produto escalar de dois vetores.Isso é praticamente toda a solução.
Isso nos fornece os primeiros
N
dígitos decimais de1/N
(#&@@
extrai o primeiro elemento doRealDigits
resultado, porque isso também retorna o deslocamento do primeiro dígito com o qual não nos importamos).Em seguida, reduzimos a lista
N
para1
usar(#-Range@#+1)
ouRange[#,1,-1]
, que são mais curtos queReverse@Range@#
, e utilizamos o produto escalar.Em vez disso, a solução alternativa usa
Accumulate
para calcular uma lista de todas as somas de prefixo e, em seguida, adiciona essas somas de prefixoTr
.Como isso é realmente rápido, mesmo para entradas grandes, aqui está um gráfico de dispersão da sequência até
N = 100,000
(fazer todas elas e plotá-las levou um tempo):Clique para uma versão maior.
A linha azul é o limite superior ingênuo de
9 N (N+1) / 2
(se todos os dígitos decimais forem9
) e a linha laranja é exatamente a metade disso. Sem surpresa, isso está dentro do ramo principal do gráfico, pois, estatisticamente, esperamos que o dígito médio seja 4,5.A fina linha de pontos de plotagem que você pode ver abaixo do ramo principal são frações que terminam
...3333...
, pois estão todas muito próximas3 N (N+1) / 2
.fonte
05AB1E ,
1211 bytesExperimente online! ou um conjunto de testes para os 50 primeiros números.
Explicação
Uma versão mais eficiente para experimentar grandes números no TIO
A diferença para a versão mais curta é que aqui somamos o produto dos dígitos e a reversão de seu índice baseado em 1 em vez de somar dígitos em prefixos.
Experimente online!
fonte
Java 8,
181169166153142 bytesExplicação:
Experimente aqui.
fonte
PHP,
6665 bytesAdaptado desta resposta (também por mim): Divisão de números não tão pequenos e a edição sugerida por Jörg Hülsermann. Use como:
edit: corrigiu um bug para +1 bytes e dobrou a atribuição de $ a em $ argv [1] para -2 bytes para uma rede de 1 byte a menos.
fonte
Scala, 84 bytes
Ungolfed:
Explicação:
Eu poderia salvar alguns bytes explorando a maneira como o compilador tokeniza: Ao chamar o argumento
&
, você pode escrever em1 to&map
vez de1 to n map
. A mesma regra se aplica adef?
.fonte
Gelatina , 11 bytes
TryItOnline
Primeiros 50
Muito lento para os grandes casos de teste.
Quão?
fonte
R⁵*
quanto a esquerda para o equivalente certo, mas, em seguida, viu a bela linha reta :)PHP, 76 bytes
(Editar -1 byte - Obrigado user59178 - sua solução é ainda melhor)
fonte
$c=blah
para a primeira parte dofor(;;)
MATL, 19 bytes
Experimente Online!
Explicação
fonte
Groovy, 87 bytes
Isso foi menos doloroso do que eu previa e é baseado na minha resposta aqui :
Explicação
1.0g
- Use a notação BigDecimal para esse..divide(n, n, 1)+""
- Divida por n com n precisão (somente na função BigDecimal) e converta para str.(...)[2..x+1].getChars()
- Obtenha a substring da iteração atual como uma matriz de caracteres..sum()-48*(x)
- Soma os valores ASCII dos caracteres e reduza em 48 para cada elemento. Isso transforma o valor de um dígito ASCII em um número inteiro essencialmente salvando bytes*.toInteger()
.(1..n).collect{...}.sum()
- Itere sobre cada um dos dígitos da divisão, executando esta função, obtenha todos em uma única matriz e soma.Economizou 2 bytes e eficiência sacrificada ...
Esta é uma versão mais eficiente que não recalcula o BigDecimal a cada iteração.
fonte
J, 27 bytes
Uso
A entrada é um número inteiro estendido.
O desempenho é bom e requer apenas cerca de 3 segundos para calcular os grandes casos de teste.
Explicação
fonte
Gelatina , 10 bytes
Não é a abordagem mais curta , mas é bastante eficiente. Experimente online! ou verifique todos os casos de teste .
Como funciona
fonte
Python 2, 90 bytes
Não é bonito, mas feito através da divisão de float, convertendo em uma string e, em seguida, selecionando iterativamente o índice de strings para obter o triângulo de números, depois realize a compreensão da lista e converta cada caractere em um int e, finalmente, somando todos eles.
fonte
JavaScript (ES6), 47 bytes
Como funciona
Esta resposta demonstra uma técnica para calcular c dígitos decimais de a / b :
Isso será um excelente ponto de partida para esse desafio. Primeiro, podemos alterá-lo levemente para calcular b dígitos decimais de 1 / b , reordenando os parâmetros e definindo os padrões:
Em seguida, podemos alterar isso para que calcule a soma dos primeiros b dígitos decimais, em vez de concatená-los (isso acaba com o
d
parâmetro):Estamos quase em uma solução; Agora, basta multiplicar cada dígito por c + 1 :
Hmm, isso parece um pouco longo. E se incrementássemos c por 1 para começar?
Isso economiza um byte. E aqui está uma maneira de salvar mais uma:
E agora temos a nossa resposta.
f(7)
é 103,f(11)
é 270,f(1)
é ... 2? Ah, esquecemos de explicar o caso em que a / b é 1 na primeira iteração (ou seja, b é 1). Vamos fazer algo sobre isso:1 mod b é sempre 1 , a menos que b seja 1 ; nesse caso, será 0 . Nosso programa agora está correto para todas as entradas, em 47 bytes .
fonte
Python 2, 49 bytes
Teste em Ideone .
fonte
C, 53 bytes
Abaixo o principal para fazer algum teste ...
fonte
f(n,i,x,s){while(i)x=10*(x%n),s+=i--*(x/n);return s;}
tem apenas 53 bytes.