Calculer le nombre, édition des diviseurs

11

Inspiré par cette question sur Math.

Laissez la factorisation d'un nombre, n , d' être représenté en tant que P (n) = 2 a x 3 b x 5 c x ... .
( En utilisant x comme symbole de multiplication.)
Ensuite , le nombre de diviseurs de n peut être représentée par D (n) = (a + 1) x (b + 1) x (c + 1) ... .
Ainsi, on peut facilement dire que le nombre de diviseurs de 2n est D (2n) = (a + 2) x (b + 1) x (c + 1) ... ,
le nombre de diviseurs de 3n est D (3n ) = (a + 1) x (b + 2) x (c + 1) ... ,
et ainsi de suite.

Défi:

Écrivez un programme ou une fonction qui utilise ces propriétés pour calculer n , compte tenu de certaines entrées de diviseur.

Contribution:

Un ensemble d'entiers, appelons-les w, x, y, z , avec toutes les définitions suivantes:

  • toutes les entrées sont supérieures à 1 - w, x, y, z > 1
  • x et z sont distincts -x<>z
  • x et z sont premiers - P(x)=x, D(x)=2et P(z)=z,D(z)=2
  • w est le nombre de diviseurs de xn -D(xn)=w
  • y est le nombre de diviseurs de zn -D(zn)=y

Pour le problème donné dans la question liée, un exemple d'entrée pourrait être (28, 2, 30, 3). Cela se traduit par D(2n)=28et D(3n)=30avec n=864.

Production:

Un seul entier, n , qui satisfait aux définitions et restrictions d'entrée ci-dessus. Si plusieurs nombres correspondent aux définitions, affichez le plus petit. Si aucun entier n'est possible, émettez une valeur de falsey .

Exemples:

(w, x, y, z) => output

(28, 2, 30, 3) => 864
(4, 2, 4, 5) => 3
(12, 5, 12, 23) => 12
(14, 3, 20, 7) => 0 (or some other falsey value)
(45, 13, 60, 11) => 1872
(45, 29, 60, 53) => 4176

Règles:

  • Les règles de code-golf standard et les restrictions contre les échappatoires s'appliquent.
  • Les règles d'entrée / sortie standard s'appliquent.
  • Les numéros d'entrée peuvent être dans n'importe quel ordre - veuillez spécifier dans votre réponse l'ordre que vous utilisez.
  • Les numéros d'entrée peuvent être dans n'importe quel format approprié: séparés par des espaces, un tableau, des arguments de fonction ou de ligne de commande séparés, etc. - votre choix.
  • De même, si la sortie vers STDOUT, les espaces blancs environnants, la nouvelle ligne de fin, etc. sont tous facultatifs.
  • L'analyse syntaxique d'entrée et le formatage de sortie ne sont pas les caractéristiques intéressantes de ce défi.
  • Dans l'intérêt d'une complexité saine et de débordements entiers, le numéro de défi n aura des restrictions telles que 1 < n < 100000- c'est-à-dire que vous n'avez pas à vous soucier des réponses possibles en dehors de cette plage.

en relation

AdmBorkBork
la source
Donc, si la plus petite solution est supérieure à 100 000, je peux choisir de renvoyer une solution ou zéro?
Dennis
@Dennis Si cela rend votre code plus court, bien sûr. L'un ou l'autre serait acceptable.
AdmBorkBork

Réponses:

3

Gelée , 17 16 octets

×€ȷ5R¤ÆDL€€Z=Ḅi3

Il s'agit d'une solution de force brute qui essaie toutes les valeurs possibles jusqu'à 100 000. Essayez-le en ligne!

Version non concurrente

La dernière version de Jelly a une correction de bogue qui permet de réduire le code ci-dessus à 15 octets .

ȷ5R×€³ÆDL€€=Ḅi3

Essayez-le en ligne!

Comment ça fonctionne

×€ȷ5R¤ÆDL€€Z=Ḅi3  Main link. Left input: x,z. Right input: w,y

     ¤            Combine the two atoms to the left into a niladic chain.
  ȷ5              Yield 100,000 (1e5).
    R             Apply range. Yields [1, ..., 100,000].
x€                Multiply each r in the range by x and z.
                  This yields [[x, ..., 100,000x], [z, ..., 100,000z]].
      ÆD          Compute the divisors of each resulting integer.
        L€€       Apply length to each list of divisors.
                  This counts the divisors of each integer in the 2D array.
           Z      Zip; group the divisors of kx and kz in pairs.
            =     Compare each [divisors(kx), divisors(kz)] with [w, y].
                  This yields a pair of Booleans.
             Ḅ    Convert each Boolean pair from binary to integer.
              i3  Find the first index of 3. Yields 0 for not found.
Dennis
la source
Félicitations, vous gagnez par défaut! : D
AdmBorkBork