Remarque: ce défi a été publié sur le bac à sable .
introduction
Ce défi est inspiré par Putnam B1 2009 , un problème dans un concours de mathématiques de premier cycle. Le problème est le suivant:
Montrer que tout nombre rationnel positif peut être écrit comme un quotient de produits de factorielles de nombres premiers (pas nécessairement distincts). Par exemple,
Défi
Votre défi est de prendre une paire d'entiers positifs relativement premiers, représentant le numérateur et le dénominateur d'un nombre rationnel positif (ou juste le nombre rationnel lui-même) en entrée, et de sortir deux listes (ou tableaux, etc.) de nombres premiers afin que le nombre rationnel entré est égal au rapport du produit des factorielles des nombres premiers dans la première liste au produit des factorielles des nombres premiers dans la deuxième liste.
Remarques
- Il peut ne pas y avoir de nombres premiers contenus à la fois dans la première liste et dans la deuxième liste; cependant, un nombre premier peut apparaître autant de fois que l'on souhaite dans l'une ou l'autre liste.
- Les entrées peuvent être supposées être chacune (sans restriction) entre 1 et 65535; cependant, on ne peut pas supposer que les factorielles des nombres que vous devrez produire seront dans cette plage.
Exemple d'entrée et de sortie
Voici des exemples d'entrées et de sorties légales.
input=>output
10,9 => [2,5],[3,3,3]
2,1 => [2],[]
3,1 => [3],[2]
1,5 => [2,3,2],[5] (elements of a list may be in any order)
3,2 => [3],[2,2]
6,1 => [3],[]
Les entrées (2,2), (0,3), (3,0), (3,6) et (1,65536) sont des entrées illégales (c'est-à-dire que votre programme n'a pas besoin de se comporter d'une manière particulière sur elles ). Voici quelques exemples de sorties illégales:
1,2 => [2],[2,2] (2 is in both returned lists)
5,2 => [5],[2,4] (4 is not prime)
2,1 => [2],[1] (1 is not prime either)
3,2 => [3],[2] (3!/2! = 3, not 3/2)
Notation
C'est le code-golf , donc le score le plus bas en octets gagne!
la source
10/9
=[2*5]/[3*3]
=[(2!/1!) * (5!/4!)] / [(3!/2!) * (3!/2!)]
=[2! * 5! * 2! * 2!] / [3! * 3! * 1! * 4!]
=(2! * 2! * 2! *5!) / (3! * 3! * 4!)
.10/9
plutôt que comme une paire de nombres10
et9
?Réponses:
05AB1E ,
545348464035333228 octetsEssayez-le en ligne! Edit: sauvé 2 octets grâce à @ ASCII uniquement. Sauvé
1234 octets grâce à @Emigna. (Je n'ai besoin d'en enregistrer qu'un de plus et je suis à la moitié de mon nombre d'octets d'origine!) Explication:la source
¦D
Mathematica,
175177169154108 octetsEssayez-le en ligne!
Comment ça fonctionne
C'est la composition de deux fonctions. Le premier, qui dégoûte pour
est une fonction récursive pour calculer réellement la factorisation souhaitée. Plus précisément, étant donné une entrée rationnelle
x
, nous calculons les nombres premiers dont les factorielles devraient être au numérateur et au dénominateur, et nous retournons la fraction avec tous ces nombres premiers multipliés ensemble. (Par exemple, en entrée10/9 = 2!*5!/(3!*3!*3!)
, nous revenons10/27 = 2*5/(3*3*3)
.)Nous le faisons en traitant le plus grand facteur premier à chaque étape: si p e se produit dans la factorisation de x, nous nous assurons que p! e se produit dans la factorisation factorielle, et récurrence sur x divisé par p! e .
(Plus tôt, j'avais une stratégie plus intelligente qui évite les grands nombres en regardant le nombre premier précédent avant p, mais Mathematica peut gérer des nombres aussi grands que 65521! Facilement, donc cela ne sert à rien. L'ancienne version que vous pouvez trouver dans l'historique est beaucoup plus rapide: sur mon ordinateur, il a fallu 0,05 seconde sur les entrées que cette version gère en 1,6 seconde.)
La deuxième fonction transforme la sortie de la première fonction en listes de nombres premiers.
Pour
s=1
(puissances positives) ets=-1
(puissances négatives), et pour chaque terme{prime,exponent}
de la factorisationr@#
, nous répétons le nombre premierprime
exponent*s
plusieurs fois.Version sans concurrence avec
10962 octetsComme ci-dessus, mais au lieu de donner la sortie sous forme de liste, donne la sortie sous forme d'expression, en utilisant l'opérateur ∇ (car il n'a pas de signification intégrée) comme substitut pour les factorielles. Ainsi, une entrée de
10/9
donne une sortie de(∇2*∇5)/(∇3)^3
à représenter(2!*5!)/(3!)^3
.Ceci est plus court car nous sautons la deuxième partie de la fonction.
+2 octets: l'affectation
f=First
doit être effectuée au bon endroit pour empêcher Mathematica de se fâcher.-8 octets: correction d'un bug pour les sorties entières, ce qui raccourcissait le code.
-15 octets:
FactorInteger
renvoie une sortie triée, dont nous pouvons tirer parti.-46 octets: nous n'avons pas vraiment besoin d'être intelligents.
la source
Python 2,
220202195183 octetsEssayez-le en ligne! Edit:
1825 octets enregistrés grâce à @ Mr.Xcoder. 12 octets enregistrés grâce à @JonathanFrech.la source