Un nombre étrange est un nombre dont la somme des diviseurs appropriés est supérieure au nombre lui-même et aucun sous-ensemble de diviseurs appropriés n'est égal à ce nombre.
Exemples:
70 est un nombre étrange car ses diviseurs appropriés (1, 2, 5, 7, 10, 14 et 35) totalisent 74, ce qui est supérieur à 70, et aucune combinaison de ces nombres ne correspond à 70.
18 n'est pas un nombre étrange car ses diviseurs propres (1, 2, 3, 4, 6, 9) totalisent 25, ce qui est supérieur à 18, mais 3, 6 et 9 totalisent 18.
Votre tâche consiste à écrire le programme le plus court qui entre via std-in n'importe quel nombre n et calcule et imprime dans un fichier ou std-out les n premiers nombres étranges avec séparation de nouvelle ligne. Aucun codage en dur des réponses n'est autorisé (désolé de ne pas l'avoir spécifié au début).
Pour plus d'exemples, consultez cette page: http://mathworld.wolfram.com/WeirdNumber.html
Réponses:
Mathematica
999487Espaces non nécessaires. Lent!:
Au détriment de quelques caractères, il s'agit d'une version plus rapide qui ne vérifie que les nombres pairs et ignore les multiples
6
qui ne sont jamais étranges:c'est encore trop lent pour un but utile. Trouve les deux premiers en quelques secondes mais devient de plus en plus lent à mesure que le nombre de diviseurs augmente.
la source
Haskell - 129
Je suis sûr qu'il y a beaucoup à jouer au golf ici, mais comme la compétition semble faible pour l'instant, je vais y jeter un coup d'œil.
N'essayez pas d'exécuter cela cependant, j'ai réussi à attendre seulement les deux premiers éléments, le troisième commencera à prendre des minutes.
la source
Python 2.7 (255 octets)
la source
PHP, 267 octets
Et voici le code source original:
Vous remarquerez qu'il faut un certain temps pour produire les chiffres car il effectue une vérification par force brute (vous devriez cependant arriver à 70 assez rapidement).
la source
R, 164
Version sans golf:
Cela prend du temps en raison de la force brute.
la source
Rubis - 152
Ruby avec ActiveSupport - 138
Vraiment lent et je suis presque sûr qu'il y a encore de la place pour le golf ...
la source
Smalltalk, 143
contribution:
production:
la source
SageMath:
143131 octetsC'est même pas du golf, il n'y a pas trop de golf de toute façon dans le code. La chose la plus importante est que vous devez faire le test en
2*x>=sum(l)
premier, cela économiserait beaucoup de temps de calcul. Il faut comprendre quemax
sur les booléens, laor
deuxième chose est quew(x)
c'estFalse
pour les nombres étranges etTrue
pour les nombres non étranges. Version non golfée:la source
C ++ - 458
Ce n'est pas toute ma solution car j'ai dû demander à SO de l'aide pour calculer la somme des sous-ensembles, mais tout le reste est à moi:
Version longue:
Il n'a actuellement calculé que les deux premiers (70 et 836). Je l'ai tué après ça.
la source
Perl, 173
Permettez-moi d'ajouter une autre solution inutile. Cette solution est si lente qu'elle ne peut même pas sortir quoi que ce soit après le premier nombre étrange. J'ose dire que c'est la solution la plus lente de toutes ici.
Démo
Le même code écrit en Java (avec lequel je suis plus à l'aise) ne peut même pas reconnaître le 2ème numéro bizarre (836), et j'ai déjà alimenté le numéro directement dans la méthode de vérification (au lieu de boucler et de vérifier chaque numéro).
Le cœur de cette solution réside dans l'expression rationnelle:
Et comment la chaîne est configurée pour être 3 fois le nombre que nous vérifions.
La longueur de la chaîne est configurée pour être 3 fois le nombre que nous vérifions
i
: les 2 premiers serventi
à faire correspondre la somme des facteurs et le dernier 1i
est réservé pour vérifier si un nombre est un facteur dei
.(?=(.+)\1{2}$)
est utilisé pour capturer le nombre que nous vérifions.((.+)(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))(?=.*(?=\1$)\3+$))+
correspond aux facteurs du nombre. Une itération ultérieure correspondra à un facteur plus petit qu'une itération antérieure.(.+)
et(?=.*(?=\1$)\3+$)
ensemble sélectionnent un facteur du nombre vérifié.(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))
s'assure que le facteur sélectionné est plus petit que le nombre vérifié lors de la première itération, et est plus petit que le facteur précédent dans les itérations suivantes.L'expression régulière essaie de faire correspondre autant de facteurs du nombre que possible dans la limite de 2
i
. Mais nous ne nous soucions pas de la valeur réelle de la somme des diviseurs, nous nous soucions seulement de savoir si le nombre est abondant.Ensuite, le 2e regex, qui est le premier regex avec
\1{2}$
ajouté. Par conséquent, l'expression régulière s'assure que la somme de (certains) facteurs du nombre contrôlé est égale au nombre lui-même:La contrainte ajoutée obligera le moteur d'expression régulière à effectuer une recherche de retour arrière sur tous les sous-ensembles possibles de facteurs, donc cela va être extrêmement lent.
la source
Perl,
176174 octetsLe nombre de nombres étranges est attendu dans STDIN et les nombres trouvés sont imprimés dans STDOUT.
Version non golfée
Limites
la source