Définitions
Soit m
et n
soyez des entiers positifs. Nous disons que m
c'est une torsion du diviseurn
s'il existe des entiers 1 < a ≤ b
tels que n = a*b
et m = (a - 1)*(b + 1) + 1
. Si m
peut être obtenu à partir n
de l'application de zéro ou plusieurs torsions de diviseur, alors m
est un descendant de n
. Notez que chaque numéro est son propre descendant.
Par exemple, réfléchissez n = 16
. On peut choisir a = 2
et b = 8
, depuis 2*8 = 16
. alors
(a - 1)*(b + 1) + 1 = 1*9 + 1 = 10
ce qui montre que 10
c'est une torsion de diviseur de 16
. Avec a = 2
et b = 5
, on voit alors que 7
c'est une torsion de diviseur de 10
. Ainsi 7
est un descendant de16
.
La tâche
Étant donné un entier positif n
, calculer les descendants den
, répertoriés dans l'ordre croissant, sans doublons.
Règles
Vous n'êtes pas autorisé à utiliser des opérations intégrées qui calculent les diviseurs d'un nombre.
Les programmes complets et les fonctions sont acceptés, et le retour d'un type de données de collection (comme un ensemble quelconque) est autorisé, tant qu'il est trié et sans doublon. Le nombre d'octets le plus bas l'emporte et les failles standard sont interdites.
Cas de test
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]
la source
<
pour les nombres naturels, pour chaque n vous obtenez chaque nombre plus petit que lui mais pas lui-même. Je pense que cela devrait être quelque chose de similaire. De cette façon, je pense que seulement 4 serait son propre descendant (cependant, je n'en suis pas sûr).Réponses:
Python 2,
109988582 octetsDepuis
(a-1)*(b+1)+1 == a*b-(b-a)
etb >= a
, les descendants sont toujours inférieurs ou égaux au nombre d'origine. Nous pouvons donc simplement commencer par le nombre initial et continuer à générer des descendants strictement plus petits jusqu'à ce qu'il n'en reste plus.La condition
(n<x*x)>n%x
vérifie deux choses en une - celan<x*x
etn%x == 0
.(Merci à @xnor d'avoir retiré 3 octets du cas de base)
Pyth, 32 octets
Traduction directe de ce qui précède, à l'exception du fait que Pyth semble s'étouffer en essayant de sum (
s
) sur une liste vide.Cela définit une fonction
y
qui peut être appelée en ajoutanty<number>
à la fin, comme ceci ( essayez-le en ligne ):CJam,
4745 octetsEn utilisant également la même méthode, avec quelques modifications. Je voulais essayer CJam à titre de comparaison, mais malheureusement, je suis bien pire à CJam qu'à Pyth / Python, donc il y a probablement beaucoup de place pour l'amélioration.
Ce qui précède est un bloc (essentiellement la version de CJam des fonctions sans nom) qui prend un int et renvoie une liste. Vous pouvez le tester comme ça ( essayez-le en ligne ):
la source
set()
en avez besoin ? Vous ne pouvez pas simplement renvoyer la liste triée?set()
consiste à supprimer les doublons :)[n]+sum(...,[])
comme çasum(...,[n])
?[]
comme cas de base pour additionner des listes, alors j'ai complètement oublié!Java,
148146104 octetsVersion golfée:
Version longue:
Je fais donc mes débuts sur PPCG avec ce programme, qui utilise un
TreeSet
(qui trie automatiquement les nombres, heureusement) et une récursivité similaire au programme de Geobits, mais d'une manière différente, en vérifiant les multiples de n puis en les utilisant dans le fonction suivante. Je dirais que c'est un score assez juste pour un débutant (en particulier avec Java, qui ne semble pas être le langage le plus idéal pour ce genre de chose, et l'aide de Geobits).la source
a*b
à lan
ligne 9.c=n+a-b
intérieuradd()
. Alternativement, vous pouvez vous débarrasserc
complètement et simplement utilisern+a-b
aux deux endroits pour ces deux mêmes octets.add
deux fois. Attendez un instant ...a
que vous savez divisen
proprement, alors vous ne devriez pas faire de boucle pour le trouverb
, c'est justen/a
. À ce moment, il commence à se rapprocher de plus en plus du mien;)Java,
157121Voici une fonction récursive qui obtient les descendants de chaque descendant de
n
. Il renvoie unTreeSet
, qui est trié par défaut.Avec quelques sauts de ligne:
la source
Octave,
10796Jolie impression:
la source
end
plutôt queendfor
etendfunction
. Cela vous ferait économiser 11 octets.Haskell,
102100 octetsUtilisation:
p 16
quelles sorties[7,10,16]
La fonction
d
calcule récursivement tous les descendants, mais ne vérifie pas les doublons, donc beaucoup apparaissent plus d'une fois, par exempled [4]
retourne une liste infinie de4
s. La fonctionp
prend les premiersn
éléments de cette liste, supprime les doublons et trie la liste. Voilà.la source
CJam - 36
Essayez-le en ligne
Ou, méthode différente:
Je les ai écrits il y a presque 2 jours, je suis resté coincé à 36 ans, je suis frustré et je me suis endormi sans poster.
la source