Dada uma entrada n
, escreva um programa ou função que produz / retorna a soma das somas digitais de n
todas as bases de 1 a n
.
Exemplo:
n = 5
Crie o intervalo [1...n]
:[1,2,3,4,5]
Para cada elemento x
, obtenha uma matriz dos x
dígitos base de n
: [[1,1,1,1,1],[1,0,1],[1,2],[1,1],[1,0]]
base- bijectiva 1
de 5
seja[1,1,1,1,1]
base- 2
(binária) de 5
é[1,0,1]
base 3
de 5
é[1,2]
base 4
de 5
é[1,1]
base 5
de 5
é[1,0]
Soma os dígitos: 13
Casos de teste:
1 1
2 3
3 6
4 8
5 13
6 16
7 23
8 25
9 30
10 35
36 297
37 334
64 883
65 932
A sequência pode ser encontrada no OEIS: A131383
Pontuação:
código-golfe : A finalização com a menor pontuação vence.
227 -> 9999
. E também:1383 -> 345678
.Respostas:
Tela , 3 bytes
Experimente aqui!
Lona batendo Jelly?
fonte
Haskell , 46 bytes
Experimente online!
Explicação
A função[ 0 ... b ]n
\b n -> mapM(pure[0..b])[1..n]
gera todas as strings em ordem lexicográfica. Por exemplo:A indexação nele com1 ( n + 1 ) 1 [ 1 , … , 1 ⏟ n vezes ] [ n ]( N + 1 ) 1 [ 1 , ... , 1n vezes] [ n ]
(!!n)
isso pode ser usada para convertern
em baseb+1
, mas isso não funcionará para unário (base ), mas estamos somando os resultados. Podemos até salvar alguns bytes com e usando base- vez de uma para a base uma vez que faltam que é o mesmo que ao somar.a <- [1..n]
Usar
do
-notation apenas concatena todas as listas em vez de aninhá-las:fonte
APL (Dyalog Unicode) , 14 bytes
Experimente online!
Explicação
Alguns parênteses estão implícitos e podem ser adicionados (mais leve que o parênteses "oficial"):
Este é um monádico no topo. Dado um argumento
Y
, essa função se comporta como:As duas funções são aplicadas em ordem. Começaremos do caminho certo:
Existem três funções neste trem, portanto, este é um garfo. Dado um argumento
Y
, ele atua como:Podemos facilmente reduzir isso (o monádico
⊢
retorna seu argumento, portanto chamado identidade ):Agora, sabemos que
Y
é um número inteiro (escalar simples, ou seja, número ou caractere), já que recebemos um. Portanto⍳Y
, com⎕IO=1
, retorna1 2 ... Y
.⍳Y
na verdade, retorna uma matriz com formaY
(Y
deve ser um vetor), onde cada escalar é o próprio índice na matriz (é por isso que a monádica⍳
é chamada de gerador de índice ). Esses índices são vetores, exceto no caso em que1≡⍴Y
onde estão escalares (este é o nosso caso).Vamos analisar a função do meio
(⍴⊤⊣)¨
, a seguir.⍴⊤⊣
é o operando de¨
( each ) e a função é diádica; portanto, o¨
operador remodelará primeiro cada argumento de comprimento 1 para a forma do outro (ou seja, pega o elemento e o usa para substituir todos os escalares do outro argumento) e, em seguida, aplique a função a cada par dos dois argumentos. Neste caso,⍳Y
é um vector eY
um escalar, portanto, sen≡⍴⍳Y
, em seguida,Y
irá ser convertido emn⍴Y
(⍴
representa a forma (monadic) e remodelar () funções diádicos). Ou seja, em termos mais simples,Y
será convertido em uma matriz contendoY
temposY
.Agora, para cada par, vamos chamar o argumento esquerdo
X
e o direitoZ
(para que não entremos em conflito com a entradaY
).⍴⊤⊣
é uma bifurcação diádica, então ela será expandida para:Vamos fazer o primeiro passo fácil de reduzir
X⊣Z
paraX
(diádico⊣
é a função esquerda ):OX, Z∈ N XZ X Z X X1 X
⍴
inX⍴Z
é, novamente, a função remodelar , portantoX⍴Z
, no nosso caso, são simplesmenteX
temposZ
.⊤
é a função de codificação . Dadas duas matrizes de números, em que a matriz esquerda é a base de cada dígito no resultado (não precisa ser inteiro ou positivo), ou seja, a codificação e a direita é uma matriz de números, retorna a matriz transposta daqueles números na codificação especificada (transposição é a reversão das dimensões de uma matriz em relação aos seus elementos). A representação de um dígito é baseada no quociente da divisão do número e no produto das bases menos significativas. Se houver uma base0
, ela atua como base + ∞. Os escalares dos argumentos são todos simples. ComoX
é um número inteiro positivo, eX⍴Z
é um vetor de elementos iguais, este é realmente apenas um caso de conversãoX
para baseZ
e remodelação paraX
dígitos. Para , ( na base ) não pode ter mais de dígitos, pois tem dígitos. Portanto, é suficiente para nossos propósitos.X⍴Z
O resultado deY1= [ 1 , 1 , . . . , 1 ]Y Y× 1 = Y
Y(⍴⊤⊣)¨⍳Y
é, portanto,Y
convertido em cada base de 1 paraY
, possivelmente com zeros à esquerda. No entanto, há um problema: no APL, a base 1 não é especial, enquanto esse desafio é especial, então precisamos incluir a soma dos dígitos da base 1 deY
nós mesmos. Felizmente, esta soma é apenasY
, uma vez , então a soma é simplesmente . Daqui resulta que temos que adicionar algum lugar à matriz. É assim que nós fazemos:Y
Eu já incluí esta parte aqui. Dyadic
,
é a concatenar função, ele concatena seus argumentos em seus últimos eixos, e os erros se isso não é possível. Aqui, simplesmente concatenamos o escalarY
para o vetorY(⍴⊤⊣)¨⍳Y
, para incrementar a soma pela qual calcularemosY
, conforme explicado acima.A parte final é a função esquerda do nosso topo
+/∘∊
:∘
é o operador de composição .f∘g Y
é o mesmo quef g Y
. No entanto, estamos usando aqui para que nosso trem não bata no∊
. Então, podemos reduzir:Agora, é hora da soma, mas espere ... há um problema. A matriz não é plana, portanto, não podemos somar seus elementos antes de nivelá-la primeiro. A função alistar
∊
nivela uma matriz. Agora que o array foi achatado, finalmente usamos+/
para somar./
é o operador de redução , ele aplica uma função diádica entre os elementos de uma matriz em seu penúltimo eixo, com prioridade da direita para a esquerda. Se a classificação (número de dimensões, ou seja, comprimento da forma) da matriz não diminuir, a matriz será incluída, embora esse não seja o caso aqui. A função aplicada aqui é+
, qual é a vantagemfunção que adiciona os pares nos últimos eixos de duas matrizes (e erros se as matrizes não puderem ser adicionadas assim). Aqui, ele simplesmente adiciona dois números várias vezes para que a redução seja concluída.Eis que nosso trem:
fonte
+/∘∊⊢,⊢⊤¨⍨⊢⍴¨⍳
Ruby ,
3937O único golfe aqui é remover algum espaço em branco. Experimente online
fonte
n
(37b):->n{(2..n).sum{|b|n.digits(b).sum}+n}
Python 2 , 57 bytes
Isso usa a fórmula que funciona desde .a ( n ) = ∑b = 2n + 1∑i = 0n - 1⌊ nbEu⌋ modb, ⌊ n( N + 1 )0 0⌋ mod(n+1)=n
Experimente online!
fonte
Java 8,
7665 bytes-11 bytes graças a @ OlivierGrégoire .
Experimente online.
Explicação:
fonte
i
, então ... 65 bytes.Desmos, 127 bytes
Experimente aqui! Define uma função , chamada como . Usa a fórmula dada na resposta de Dennis .f f( N )
Aqui está o gráfico resultante (aponte para ):( 65 , 932 )
Desmos, 56 bytes
Isso pode não funcionar em todos os navegadores, mas funciona no meu. Basta copiar e colar a fórmula. Este é no link acima.f2( N )
fonte
^n
deve ser suficiente.\sum_{b=2}^{n+1}
paran+\sum_{b=2}^n
salvar outros 2 bytesSAS,
8174 bytesA entrada é inserida após a
cards;
instrução, em novas linhas, da seguinte forma:Gera um conjunto de dados que contém a resposta
s
(junto com variáveis auxiliares), com uma linha para cada valor de entradaUngolfed:
fonte
Japonês
-x
, 6 bytesTente
Tente
fonte
J ,
2423 bytesExperimente online!
fonte
05AB1E (herdado) , 5 bytes
Experimente online!
Explicação:
Em 05AB1E (legado), a base 1 de 5 é [0,0,0,0,0], não [1,1,1,1,1]. Portanto, depois de somar o intervalo, adicione a entrada para contabilizar a base 1 ausente.
Estou usando 05AB1E (legado) porque no atual 05AB1E, a base 1 de 5 é [1]. Para explicar isso, eu precisaria diminuir o resultado em 1 ou remover o primeiro elemento do intervalo, que custaria 1 byte.
fonte
Perl 6 ,
4541 bytes-4 bytes graças a Jo King
Experimente online!
fonte
Espaço em branco , 153 bytes
Letras
S
(espaço),T
(tabulação) eN
(nova linha) adicionadas apenas como destaque.[..._some_action]
adicionado apenas como explicação.Experimente online (apenas com espaços brutos, guias e novas linhas).
Porta da minha resposta do Java 8 , porque o Whitespace não possui nenhum recurso de conversão Base.
Exemplo de execução:
input = 3
O programa para com um erro: Nenhuma saída encontrada. (Embora eu possa adicionar três novas linhas finais
NNN
para se livrar desse erro.)fonte
R , 60 bytes
Experimente online!
Falha
n>143
desde que144^144
é maior do que umdouble
pode obter. Agradecemos a Josh Eller por sugerir a substituiçãolog(n,i)
por simplesmenten
.O abaixo irá trabalhar para
n>143
; não tenho certeza em que ponto ele irá parar de funcionar.R , 67 bytes
Experimente online!
Usa o
n%/%i^(0:log(n,i))%%i
método clássico para extrair osi
dígitos basen
de cada baseb>1
, depois os soma e acumula a soma emF
, que é inicializada e0
, em seguida, adicionandon
(a1
representação básica den
)F
e retornando o resultado. Poisn=1
, ele pula as bases e simplesmente adicionan
aF
.fonte
0:log(n,i)
, você não poderia usar0:n
? Sempre haverá no máximo n dígitos em qualquer representação básica de n, e tudo após oslog(n,i)
dígitos iniciais deve ser 0, para que não afete a soma.n=144
, uma vez que143^143
existe1.6e308
e144^144
avalia comoInf
. Obrigado!Python 2 , 61 bytes
Experimente online!
Embora essa seja a solução de Dennis mais longa, ela considera o método divertido demais para não ser compartilhado.
O objetivo é se dedicar tanto ao corte do último dígito
n->n/b
quanto ao incremento da baseb->b+1
, mas queremos impedir que a base seja aumentada depois que um ou mais dígitos foram cortados. Isso é feito transformando a base emb
um flutuador, para que, após a atualizaçãon->n//b
, o flutuador sejab
infectadon
com sua flutuabilidade. Dessa forma, sen
é um float ou não, é um sinalizador de bit para se removemos algum dígiton
.Exigimos que a condição
1/n==0
seja atendida para recorrer ao incrementob
, que os números inteirosn
satisfazem porque a divisão do piso é feita, mas os flutuadores falham. (n=1
também falha, mas não queremos recursá-lo de qualquer maneira.) Caso contrário, os flutuadores funcionam como números inteiros na função porque temos o cuidado de fazer a divisão do pison//b
, e a saída é um número inteiro.fonte
C (gcc),
6756 bytesPorta da minha resposta Java 8 .
-11 bytes graças ao golfe de @ OlivierGrégoire na minha resposta Java.
Experimente online.
Explicação:
fonte
JavaScript (ES6), 42 bytes
Esta versão é quase idêntica à minha resposta principal, mas depende do fluxo aritmético para interromper a recursão. O valor mais alto suportado depende do tamanho da pilha de chamadas.
Experimente online!
JavaScript (ES6),
51 4844 bytesExperimente online!
Comentado
fonte
APL (Dyalog Unicode) , 22 bytes
Experimente online!
fonte
Casca , 6 bytes
Eu realmente gostaria que houvesse algo como
M
porcmap
:(Experimente online ou teste tudo!
Explicação
Como alternativa, 6 bytes
Experimente online ou teste tudo!
Explicação
fonte
Pari / GP , 30 bytes
Experimente online!
fonte
Gelatina , 4 bytes
Experimente online!
Como funciona
fonte
Anexo , 25 bytes
Experimente online!
Explicação
fonte
Carvão , 12 bytes
fonte
Retina 0.8.2 , 49 bytes
Experimente online! O link inclui casos de teste. Explicação:
Converta para unário.
Use divmod repetido para converter o número original em cada base.
Exclua a lista de bases, deixando apenas os dígitos da conversão de base.
Pegue a soma e converta para decimal.
fonte
Desmos, 51 bytes
Inspirado pela resposta de Conor O'Brien e olhando para a entrada da OEIS, criei minha própria solução Desmos:
Experimente online!
fonte
APL (NARS), 29 caracteres, 58 bytes
pequeno teste de como usar:
fonte