La tâche consiste à calculer la somme des diviseurs d'un nombre étant donné sa factorisation première.
Contribution
Deux tableaux (ou quelque chose d'équivalent) de longueur n , l'un contenant le facteur premier et l'autre contenant l'exposant correspondant.
Production
La somme de tous les diviseurs (y compris le nombre lui-même).
Exemple
Le nombre 240 a 2, 3 et 5 comme facteurs premiers avec 4, 1 et 1 comme exposants respectifs. La sortie attendue serait alors de 744.
Input: [2,3,5] [4,1,1]
Output: 744
Notation
Le code le plus court en octets gagne!
Si la complexité d'exécution de votre solution est O (somme des exposants) plutôt que O (produit des exposants), votre score peut être multiplié par 0,8.
Il y avait une question similaire publiée ici, mais ce n'était pas un défi. Je pense que le problème est assez intéressant pour être joué au golf.
Le gagnant sera choisi ce week-end
Réponses:
Pyth, 13 octets * 0,8 = 10,4
Manifestation.
Cette réponse fonctionne quelque peu différemment de celles ci-dessus. Afin de calculer la somme des facteurs des puissances premières du nombre, au lieu d'utiliser une formule arithmétique, les facteurs sont explicitement construits et additionnés.
Par exemple, sur la paire [prime, exposant]
[2, 4]
, nous mappons2 ^ x
sur0, 1, 2, 3, 4
, donnant[1, 2, 4, 8, 16]
, qui est ensuite additionné à 31.Les résultats sont ensuite multipliés et imprimés.
Si l'exponentiation est correctement implémentée, ou s'il existe une mise en cache des résultats intermédiaire, ce sera le cas
O(sum of exponents)
.la source
O(n)
si nous pouvons supposer que la base est une constante.CJam, 15 octets * 0,8 = 12
Essayez-le en ligne . L'ordre d'entrée est d'abord la liste des exposants, puis la liste des nombres premiers (-3 octets grâce à @Dennis) .
Pour chaque paire d'exposants premiers,
(p, e)
trouverpuis trouvez le produit de tous ces éléments. Par exemple, pour 240, ce serait
Selon la façon dont l'exponentiation est mise en œuvre, cela peut être mieux que
O(sum of exponents)
.la source
APL,
1813 octets * 0,8 = 10,4Cela crée un train de fonctions dyadiques qui prend le tableau des facteurs à gauche et les exposants à droite.
Essayez-le en ligne . Notez que c'est la même approche que la réponse CJam incroyablement intelligente du Sp3000 .
5 octets enregistrés grâce à Dennis!
la source
TI-BASIC, 17 octets * 0,8 = 13,6
Utilise également la méthode de Sp3000, bien que je l'ai trouvée indépendamment. Prend une liste de Input et une de l'écran d'accueil.
L'utilisation de prod (deux fois est plus petite car elle nous permet d'utiliser gratuitement la parenthèse ouverte. Notez que cette réponse ne prend pas en charge les tableaux vides, car il n'y a pas de tableaux vides dans TI-BASIC.
la source
Haskell, 38 * 0,8 = 30,4
Usage:
La fonction anonyme prend
(p,e)
la somme des diviseurs pourp^e
via la somme des séries géométriques. Le fait de compresser les deux listes avec cela comme la jonction et la prise du produit donne le résultat.Je n'ai pas pu trouver quelque chose de plus court que l'expression arithmétique
Peut-être qu'il existe un moyen de se débarrasser de la
(\p e->_)
.La définition de la fonction Infix donne la même longueur (38):
la source
C ++,
1118077 octets * 0,8 = 61,6Cela calcule (p ^ (e + 1) -1) / (p-1) et multiplie récursivement tous les facteurs. Je l'ai découvert il y a un an.
Merci d'avoir aidé, totalement oublié l'utilisation booléenne de style c ++.
la source
n==0
simplifie!n
- ou vous pouvez inverser les résultats et simplement utilisern
Matlab, 53
Exemple:
la source
s
, puis teste tous les diviseurs possibles de1
às
. C'est donc (au moins) O (s), qui est probablement entre O (somme des exposants) et O (produit des exposants)Python 2156
Contribution
Production
Explication
Ce programme reçoit une liste de 2 listes: facteurs et exposants.
Ensuite, il crée une liste de toutes les combinaisons possibles de la liste des exposants.
et le zip avec les facteurs:
Calculez les facteurs de la puissance des exposants:
et multipliez chaque liste (cela nous donne tous les diviseurs):
Enfin, additionnez toutes les listes et imprimez:
la source
Python 3,
134120117Entrée: deux tableaux séparés par des virgules séparés par des virgules.
Exemple:
Avec NumPy peut être réduit à 100 octets:
la source
operator
pourmul
une utilisation unique, vous pouvez utiliserfloat.__mul__
pour enregistrer un tas d'octets.Gelée, non compétitive
Cette réponse n'est pas concurrente, car le défi est antérieur à la création de Jelly.
5 octets (sans bonus)
Essayez-le en ligne!
Comment ça fonctionne
7 octets (5,6 octets après bonus)
Comment ça fonctionne
Essayez-le en ligne!
la source
APL, 12 octets * 0,8 = 9,6
Cela lit deux listes sur le clavier, les exposants en premier, à savoir:
Explication:
⎕
: lire une liste depuis le clavier (les exposants)⍳¨
: pour chaque numéro de la liste, générez une liste[1..n]
.⎕*
: lire une autre liste à partir du clavier (les nombres premiers), et élever chaque nombre premier à chacun des exposants dans les listes correspondantes+/¨
: additionner chaque liste1+
: ajouter un à chaque résultat, pour compenser les manquantsx^0
dans chacune des listes×/
: prendre le produit des résultatsla source
Raquette (schéma), 65 * 0,8 = 52 octets
Même arithmétique que tout le monde
Explication:
la source
Python 2, 80 octets * 0,8 = 64
Cela suppose que l'entrée arrive l'une après l'autre. Suit la même formule que celle décrite dans la réponse CJam du Sp3000.
Si cela n'est pas autorisé, je vais l'utiliser comme une solution, qui obtient un score de 84 octets * 0,8 = 67,2. L'entrée doit être séparée par une virgule, c'est-à-dire
[2,3,5],[4,1,1]
.Psst. Hey! Ceci est une solution possible dans Symbolic, quelque chose sur laquelle je travaille:
Ƥ(П([~-(x**-~y)/~-xϝx,yϊʐ(Ί,Ί)],1))
la source
Mathematica, 40 octets
Sans utiliser aucune des incrustations qui traitent des diviseurs, pour se différencier de l'autre solution mathématique dans le fil.
L'entrée est (en utilisant l'exemple)
[{2, 3, 5}, {4, 1, 1}]
la source
Perl 5, 96 octets
Évidemment, ce n'est pas gagnant, mais j'ai décidé de l'écrire pour le plaisir.
C'est un sous-programme:
Voyez-le en action ainsi:
Comment ça fonctionne:
($b,$e)=@_
lit les tableaux de références d'entrée$b
(bases) et$e
(exposants).$s=1
initialise le produit.map$s*=$b->[$_]**$e->[$_],0..@$b-1
multiplie$s
par les puissances successives d'exposant de base. Maintenant$s
c'est le nombre composite.$_=1x$s
définit$_
égal à une chaîne de uns,$s
longue.$i
est initialisé à 0.for$j(1..$s){$i+=$j*/^(.{$j})*$/}
essaie, pour chaque nombre$j
entre 1 et$s
, de se$_
séparer en$j
répétant les caractères autant de fois que nécessaire . Si c'est le cas, alors$j
divise$s
, et/^(.{$j})*$/
est 1 (sinon c'est 0), et$i
est augmenté de$j
. Ainsi, nous ajoutons au$i
nombre de partitions dans une partition de taille égale de$_
. Comme le souligne Omar E. Pol ,$i
c'est le nombre que nous recherchons.$i
à la fin revient$i
.la source
J, 14 octets * 0,8 = 11,2
Usage
la source