Definições
Let m
E n
Ser inteiros positivos. Dizemos que m
é uma torção divisora de n
se existem números inteiros, 1 < a ≤ b
tais que n = a*b
e m = (a - 1)*(b + 1) + 1
. Se m
pode ser obtido n
aplicando zero ou mais torções divisórias a ele, então m
é um descendente de n
. Observe que todo número é seu próprio descendente.
Por exemplo, considere n = 16
. Nós podemos escolher a = 2
e b = 8
, desde então 2*8 = 16
. Então
(a - 1)*(b + 1) + 1 = 1*9 + 1 = 10
o que mostra que 10
é uma torção divisória de 16
. Com a = 2
e b = 5
, vemos então que 7
é uma torção divisória de 10
. Assim 7
é um descendente de 16
.
A tarefa
Dado um número inteiro positivo n
, calcule os descendentes de n
, listados em ordem crescente, sem duplicatas.
Regras
Você não tem permissão para usar operações internas que computam os divisores de um número.
Programas e funções completos são aceitos e o retorno de um tipo de dados de coleção (como um conjunto de algum tipo) é permitido, desde que seja classificado e sem duplicação. A contagem de bytes mais baixa vence e as brechas padrão não são permitidas.
Casos de teste
1 -> [1]
2 -> [2] (any prime number returns just itself)
4 -> [4]
16 -> [7, 10, 16]
28 -> [7, 10, 16, 25, 28]
51 -> [37, 51]
60 -> [7, 10, 11, 13, 15, 16, 17, 18, 23, 25, 28, 29, 30, 32, 43, 46, 49, 53, 55, 56, 60]
fonte
<
para os números naturais, para cada n, cada número será menor que ele, mas não ele próprio. Eu acho que isso deve ser algo semelhante. Dessa forma, acho que apenas 4 seriam seus próprios descendentes (embora não tenham certeza disso).Respostas:
Python 2,
109988582 bytesDesde
(a-1)*(b+1)+1 == a*b-(b-a)
eb >= a
, os descendentes são sempre menores ou iguais ao número original. Assim, podemos começar com o número inicial e continuar gerando descendentes estritamente menores até que não haja mais nenhum.A condição
(n<x*x)>n%x
verifica duas coisas em uma - quen<x*x
en%x == 0
.(Agradecemos a @xnor por remover 3 bytes do gabinete base)
Pitão, 32 bytes
Tradução direta do exposto acima, exceto pelo fato de Pyth parecer engasgar ao tentar somar (
s
) em uma lista vazia.Isso define uma função
y
que pode ser chamada anexandoy<number>
no final, assim ( tente online ):CJam,
4745 bytesTambém usando o mesmo método, com algumas modificações. Eu queria experimentar o CJam para comparação, mas infelizmente sou muito pior no CJam do que no Pyth / Python, então provavelmente há muito espaço para melhorias.
O acima é um bloco (basicamente a versão do CJam de funções sem nome) que recebe um int e retorna uma lista. Você pode testá-lo assim ( tente on-line ):
fonte
set()
lá? Você não pode simplesmente retornar a lista classificada?set()
é remover duplicados :)[n]+sum(...,[])
comosum(...,[n])
?[]
como base para resumir listas, então esqueci completamente!Java,
148146104 bytesVersão Golfed:
Versão longa:
Então, eu estou fazendo minha estréia no PPCG com este programa, que usa a
TreeSet
(que classifica automaticamente os números, felizmente) e recursão semelhante ao programa do Geobits, mas de uma maneira diferente, verificando múltiplos de n e depois usá-los no próxima função. Eu diria que essa é uma pontuação bastante justa para quem está iniciando (especialmente com Java, que não parece ser a linguagem ideal para esse tipo de coisa, e a ajuda do Geobits).fonte
a*b
an
na linha 9.c=n+a-b
dentroadd()
. Como alternativa, você pode se livrarc
completamente e usarn+a-b
nos dois lugares os mesmos dois bytes.add
duas vezes. Espere um momento ...a
que você sabe que divide de maneiran
limpa, não deve procurar para encontrarb
, é són/a
. Nesse ponto, ele começa a se aproximar cada vez mais do meu;)Java,
157121Aqui está uma função recursiva que obtém descendentes de cada descendente de
n
. Retorna aTreeSet
, que é classificado por padrão.Com algumas quebras de linha:
fonte
Oitava,
10796Pretty-print:
fonte
end
um pouco do queendfor
eendfunction
. Isso economizaria 11 bytes.Haskell,
102100 bytesUso:
p 16
quais saídas[7,10,16]
A função
d
calcula recursivamente todos os descendentes, mas não verifica se há duplicatas; muitas aparecem mais de uma vez; por exemplo,d [4]
retorna uma lista infinita de4
s. As funçõesp
obtêm os primeirosn
elementos dessa lista, remove duplicatas e classificam a lista. Voilà.fonte
CJam - 36
Experimente online
Ou, método diferente:
Escrevi-os há quase 2 dias, fiquei preso aos 36 anos, fiquei frustrado e fui dormir sem postar.
fonte