0. DEFINIÇÕES
Uma sequência é uma lista de números.
Uma série é a soma de uma lista de números.
O conjunto de números naturais contém todos os "números inteiros não negativos maiores que zero".
Um divisor (neste contexto) de um número natural j é um número natural i , de modo que j ÷ i também é um número natural.
1. PREÂMBULO
Algumas outras perguntas neste site mencionam o conceito de alíquota, ou a sequência de divisores de um número natural a que são menores que a . A determinação de números amigáveis envolve o cálculo da soma desses divisores, denominada soma de alíquotas ou série de alíquotas. Todo número natural tem sua própria soma de alíquotas, embora o valor da soma de alíquotas de um número não seja necessariamente exclusivo desse número. ( Exemplo : todo número primo tem uma soma alíquota de 1.)
2. DESAFIO
Dado um número natural n
, retorne o n
dígito da sequência de somas de alíquotas. As primeiras várias séries na sequência, começando pela série para 1, são:
{0, 1, 1, 3, 1, 6, 1, 7, 4, 8, 1, 16, 1, 10, 9, 15, 1, 21, 1, 22, 11, 14, 1, 36, 6, 16, 13}
Concatenadas, elas se parecem com:
0113161748116110915121122111413661613
A entrada pode ser indexada em zero ou indexada em um, de acordo com sua preferência. As soluções devem ser programas ou funções capazes de retornar o 10.000 dígito (entrada até 9999
ou 10000
). A solução de trabalho mais curta vence.
3. CASOS DE ENSAIO
Os pares de entrada-saída corretos devem incluir, entre outros, o seguinte:
0 or 1 -> 0
4 or 5 -> 1
12 or 13 -> 6
9999 or 10000 -> 7
O número que precede o "ou" é indexado em 0; o número a seguir é indexado em 1.
Casos de teste adicionais podem ser fornecidos mediante solicitação.
4. REFERÊNCIAS
OEIS possui uma lista de números e suas somas de alíquotas.
Respostas:
05AB1E ,
141110 bytesCalcule n = 9999 em cerca de 15 segundos. Código:
Explicação:
Usa a codificação CP-1252 . Experimente online! .
fonte
Mathematica, 51 bytes
Uma função sem nome que pega e retorna um número inteiro e usa indexação baseada em 1. Lida com a entrada
10000
instantaneamente.Explicação
Esta é uma implementação muito direta da definição, fazendo uso do fato de que as
n
somas do primeiro divisor são sempre suficientes para determinar on
th dígito. Como sempre, a ordem de leitura do Mathematica jogado no golfe é um pouco engraçada:Isso gera uma lista com todos os resultados da aplicação da função sem nome à esquerda em todos os valores
i
de1
paran
inclusivo.Começamos calculando os divisores de
i
, somando-osTr
e subtraindoi
-os para que seja apenas a soma dos divisores menor quei
.Isso transforma o resultado em uma lista de seus dígitos decimais.
E isso remove o cabeçalho "list", para que todas as listas de dígitos sejam automaticamente concatenadas no resultado de
Array
. Para mais detalhes sobre como##
funciona, consulte a seção "Sequências de argumentos" nesta postagem .Por fim, selecionamos o
n
dígito th do resultado.fonte
Braquilog , 40 bytes
É indexado em 1, leva cerca de 0,15 segundos por
N = 100
, 15 segundos porN = 1000
. No momento, estou concorrendoN = 10000
, informarei o tempo de execução assim que terminar (se minha estimativa estiver correta, levará cerca de 8 horas)Edit : corrigindo a propagação prematura de restrições no Brachylog, agora (em um código de 3 bytes a mais) leva cerca de
2.5
minutos para,10000
mas retorna umout of global stack
erro.Explicação
Predicado principal:
Input = N
Predicado 1: calcula a soma dos divisores
Predicado 2: unifica a saída com um divisor da entrada
fonte
-G
opção O padrão é apenas128M
. Você pode usar, por exemplo:swipl -G2G
para usar 2 GO.Pitão,
26212015 bytesExperimente online. Suíte de teste.
Usa indexação baseada em 0. O programa é O (n²) e termina para n = 9999 em cerca de 14 minutos na minha máquina de 2008.
fonte
f!%dTr1d
é muito mais curto (mas também mais lento)f!%TYtUT
é o que eu costumava ter.Geléia,
131110 bytes2 bytes graças a @Adnan e mais 1 graças a @Dennis.
Experimente online!
Usa indexação baseada em 1. Conclui por n = 10000 em menos de 2 segundos online.
fonte
ÆDṖSDµ€Fị@
salva um byte.€
a toda a primeira cadeia?€
é aplicadochain.pop() if chain else chains.pop()
. A cadeia iniciada recentemente está vazia; portanto, a última cadeia finalizada é usada.PHP, 90 bytes
0 indexado
Absolutamente não sutil ou com uma maneira inteligente de abordá-lo.
Além disso, como sempre, produz três avisos que são ignorados.
fonte
J , 34 bytes
O índice é zero e usa a fórmula abaixo para calcular as somas do divisor.
Explicação
fonte
MATL ,
1615 bytesA indexação é baseada em 1.
O último caso de teste atinge o tempo limite no compilador online, mas fornece o resultado correto com o compilador offline, em cerca de 15 segundos.
Experimente online!
fonte
Haskell, 52 bytes
Exemplo de uso:
(([1..]>>= \n->show$sum[m|m<-[1..n-1],mod n m<1])!!) 12
->6
.É uma implementação direta da definição: foreach
n
soma seus divisores e converte-o em uma string. Concatene todas essas cadeias e escolha o elemento no índice solicitado. A preguiça de Haskell leva apenasn
s da lista infinita,[1..]
conforme necessário.fonte
Python 3.5,
1039392 bytes:Implementação bastante direta do método descrito no post.
Experimente Online! (Ideona)
Não termina nos 5 segundos alocados no compilador online para entrada
10000
, mas termina na minha máquina para a mesma entrada em cerca de 8,5 segundos.fonte
Oitava, 71 bytes
Este é apenas oitava. Não vai funcionar no MATLAB. É criada uma função virtual que funciona em números indexados em 1. Provavelmente pode ser simplificado um pouco mais. Vai dar uma olhada esta noite.
Você pode tentar online aqui .
Simplesmente execute o comando acima, prefixado com
a=
ou o que quer que seja (apenas para que você possa usá-lo várias vezes) e, em seguida, façaa(10000)
ou o que for. Demora cerca de 7 segundos para calcular que o 10000º dígito é um 7.fonte
Java 8, 220 bytes
Bem, pelo menos é rápido. A média é de 0,3 segundos para obter o elemento 9999/10000 na minha máquina. Ele gera apenas tantas somas de alíquotas quanto o índice que você especificou. Isso significa que a string será um pouco mais longa que o seu índice na maioria dos casos, já que algumas somas de alíquotas têm 2 ou mais dígitos, mas na maioria das vezes, ela gera apenas o comprimento de uma string necessária.
Uso:
Ungolfed:
fonte