Étant donné deux entiers positifs a
et b
, produire deux entiers positifs c
et d
tels que:
c
divisea
d
diviseb
c
etd
sont co-amorces- le plus petit multiple commun de
c
etd
est égal au plus petit multiple commun dea
etb
.
S'il existe plusieurs réponses possibles, vous ne pouvez en générer qu'une ou toutes.
Cas de test:
a b c d
12 18 4 9
18 12 9 4
5 7 5 7
3 6 1 6 or 3 2
9 9 9 1 or 1 9
6 15 2 15 or 6 5
1 1 1 1
C'est du code-golf . La réponse la plus courte en octets l'emporte.
code-golf
arithmetic
number-theory
Leaky Nun
la source
la source
d
diviseb
Réponses:
Gelée ,
2113 octetsEssayez-le en ligne!
En d'autres termes: partir de (c, d) = (a, b) . Ensuite, pour chaque nombre premier, divisez ce nombre tout au long de la factorisation de c ou d : celui qui a le plus petit exposant pour ce nombre premier. (Dans cette implémentation, en cas d'égalité, c perd son exposant.)
Donc, si a = 2250 = 2 1 · 3 2 · 5 3 et b = 360 = 2 3 · 3 2 · 5 1 ,
alors c = 2 0 · 3 0 · 5 3 = 125 et d = 2 3 · 3 2 · 5 0 = 72 .
Jonathan Allan a joué un énorme 8 octets! Merci ~
la source
ÆEZ×Ụ’$€$ZÆẸ
[1,18]
pour[15,18]
. La version initiale renvoyait la bonne réponse ([5,18]
).ÆEz®0iṂ$¦€ZÆẸ
devrait faire l'affaire pour 13.R,
143139123 octets(Merci à @Giuseppe pour ces 19 octets!)
Avec des indentations, des nouvelles lignes et quelques explications:
Cas de test:
la source
!
a une priorité plus élevée que&
et|
mais inférieure à+
et*
; vous devriez pouvoir jouer sur quelques octets de cette façon; c'est-à-dire,!i%%q&j%%q
devrait être équivalent à!i%%q+j%%q
GCD(c,d)==1
, alorsLCM(c,d)==c*d
. On peut donc testerGCD(c,d)==1
puis vérifier sic*d==a*b/GCD(a,b)
puisque ce dernier estLCM(a,b)
...a*b/GCD(a,b)
ne soit pas plus court queLCM(a,b)
).Husk , 10 octets
Force brute. Prend et renvoie des listes, et fonctionne également pour plus de deux numéros.Essayez-le en ligne!
Explication
la source
Mathematica, 82 octets
la source
Select[...][[1]]
au lieu d'First@Select[...]
enregistrer un octet?#&@@
au lieu d'[[1]]
en enregistrer un de plus ;-)JavaScript (ES6),
908480 octetsPrend l'entrée dans la syntaxe de curry
(a)(b)
et retourne un tableau de 2 entiers.Cas de test
Afficher l'extrait de code
Comment?
la source
MATL ,
1716 octetsEssayez-le en ligne!
Même méthode que la solution Jelly de Lynn
Cela fait un moment que je n'ai pas utilisé n'importe quel MATL (ou matlab d'ailleurs), de nombreuses améliorations sont probablement possibles.
la source
Haskell ,
5048474542 octetsIdée: je l'ai remarqué
c*d = a*b/gcd(a,b)
. Ainsi, l'algorithme effectue deux étapes:c' = a/gcd(a,b)
etd' = b
. Cela répond à toutes les exigences sauf celac'
etd'
doit être co-amorcé.e = gcd(c',d')
puis je règlec = c'*e
etd = d'/e
. Cela conserve toutes les propriétés (car les facteurs combinés restent les mêmes), mais comme je supprime tous les facteurs partagésd
, je créec
etd
coprime.Dans mon implémentation,
c'
vient d'être appeléc
.Essayez-le en ligne!
-3 octets grâce à Laikoni
la source
c
économise 3 octets: essayez-le en ligne!05AB1E , 12 octets
Essayez-le en ligne! ou comme suite de tests
la source
R , 126 octets
Essayez-le en ligne!
Cela prend une approche différente (et apparemment moins golfique) pour trouver les valeurs que l'autre réponse R .
Explication:
sauf que je chausse toutes les définitions comme arguments par défaut et fais tous les calculs sur une seule ligne pour le golfe.
la source
J , 19 octets
Essayez-le en ligne!
Basé sur la solution de @ Lynn .
Explication
la source
Haskell ,
9174 octetsEssayez-le en ligne!
17 octets enregistrés grâce à Laikoni
la source
u*v`div`gcd u v
enregistre un octet.lcm
fonction intégrée?rem a x+rem b y+gcd x y<2
fonctionner.lcm
existait.rem a x+rem b y+gcd x y<2
fonctionne, et je me demande si celarem a x+rem b y+gcd x y+lcm a b-lcm x y<2
fonctionne. Il y a peut - être une garantie (mathématique)lcm a b>=lcm x y
.lcm a b>=lcm x y
parce que 1.x=x1*...*xi
(décomposition premier),y=y1*...yj
,lcm x y=z1*...*zk
oùz1,...,zk
sont communs àx1,...,xi
ety1,...,yj
. 2.a=u1*...*um*x1*...*xi
(décomposition premier),b=v1*...vn*y1*...yj
,lcm a b=t1*...*tl
oùt1,...,tl
sont communs àu1*...*um*x1*...*xi
etv1*...vn*y1*...yj
. Il est évident quet1,...,tl
contientz1,...,zk
ainsilcm a b>=lcm x y
. Mais cela n'est pas utile pour écrire la condition sous forme de somme.Python 2 , 75 octets
L'entrée est considérée comme une liste, que la fonction modifie sur place.
Essayez-le en ligne!
la source
Python 3 , 129 octets
Essayez-le en ligne! ou Essayez la suite de tests.
Affiche toutes les combinaisons possibles sous la forme d'une liste imbriquée.
la source
-~a
et-~b
peuvent simplement être réécrits au fura+1
etb+1
à mesure de la lisibilité: PGelée ,
19 1514 octets-4 avec pointeur de Leaky Nun (utilisez le diviseur intégré)
Je suis presque sûr à 100% que ce n'est pas la façon de le faire, mais voici une première tentative.
Voyons voir qui le surpasse avec un sept ou huit octets!
Oui ... voir la réponse de Lynn avec explication!
Un lien monadique reprenant une liste des deux nombres et renvoyant une liste de listes des possibilités.
Essayez-le en ligne!
Comment?
la source
ÆD
mais (haussement d'épaules) le cerveau n'est évidemment pas en prise ...Perl 6 , 72 octets
Essayez-le en ligne!
Prend une liste (a, b). Renvoie une liste de toutes les listes possibles (c, d).
Explication:
la source
Python 2 ,
126121 octetsEssayez-le en ligne!
la source
Python 2 + sympy , 148 octets
Essayez-le en ligne!
-1 merci à Jonathan Frech .
Cette réponse fonctionne en Python 2 (pas Python 3), en utilisant
sympy.gcd
etsympy.lcm
au lieu demath.gcd
etmath.lcm
qui ne sont disponibles qu'en Python 3. Et oui, c'est de la force brute :)la source
Q=c==z;
(+7 octets) au début de la boucle while et en le remplaçantor(c==z)+d
paror Q+d
(-4 octets) etc=+(c==z)or
parc=+Q or
(-4 octets). ( TIO )+
opérateur dansd=+E
ouc=+(c==z)
pour convertir un booléen en entier?True
etFalse
au lieu de1
et0
en sympy.+...
a une utilité.Gelée , 13 octets
Essayez-le en ligne! Ma première réponse Jelly! Edit:
ÆEz0µỤ€’×µZÆẸ
fonctionne également pour 13 octets. Explication:la source
PARI / GP, 86 octets
Cela fait juste ce que Lynn dit dans sa réponse:
Si je ne compte pas la
f(a,b)=
partie, c'est 79 octets.la source
05AB1E ,
322624222019 octetsEssayez-le en ligne! Je ne sais toujours pas comment écrire dans cette langue, mais au moins ce n'est pas un algorithme de force brute. Explication:
la source