Biorąc pod uwagę dwie dodatnie liczby całkowite a
i b
wyprowadzamy dwie dodatnie liczby całkowite c
i d
takie, że:
c
dzielia
d
dzielib
c
id
są pierwszorzędne- najmniejszej wspólnej wielokrotności of
c
ad
równa najmniejszą wspólną wielokrotnośća
ib
.
Jeśli istnieje więcej niż jedna możliwa odpowiedź, możesz wydrukować tylko jedną lub wszystkie z nich.
Przypadki testowe:
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
To jest golf golfowy . Najkrótsza odpowiedź w bajtach wygrywa.
code-golf
arithmetic
number-theory
Leaky Nun
źródło
źródło
d
dzielib
Odpowiedzi:
Galaretka ,
2113 bajtówWypróbuj online!
Innymi słowy: zacznij od (c, d) = (a, b) . Następnie, dla każdej liczby pierwszej, podziel tę liczbę pierwszą aż do faktoryzacji albo c lub d : w zależności od tego, który ma najmniejszy wykładnik dla tej liczby pierwszej. (W tej implementacji, w przypadku remisu, c traci wykładnik).
Więc jeśli a = 2250 = 2 1 · 3 2 · 5 3 i b = 360 = 2 3 · 3 2 · 5 1 ,
następnie c = 2 0 · 3 0 · 5 3 = 125 i D = 2 3 · 3 2 · 5 0 = 72 .
Jonathan Allan grał w golfa aż 8 bajtów! Dziękuję ~
źródło
ÆEZ×Ụ’$€$ZÆẸ
[1,18]
za[15,18]
. Początkowa wersja zwracała poprawną odpowiedź ([5,18]
).ÆEz®0iṂ$¦€ZÆẸ
powinien załatwić sprawę za 13.R,
143139123 bajtów(Dzięki @Giuseppe za 19 bajtów off!)
Z wcięciami, znakami nowej linii i niektórymi objaśnieniami:
Przypadki testowe:
źródło
!
ma wyższy priorytet niż&
a|
, ale niższa niż+
a*
; powinieneś być w stanie grać w golfa o kilka bajtów w ten sposób; tzn.!i%%q&j%%q
powinien być równoważny z!i%%q+j%%q
GCD(c,d)==1
, toLCM(c,d)==c*d
. Możemy więc przetestować,GCD(c,d)==1
a następnie sprawdzić, czyc*d==a*b/GCD(a,b)
skoro to drugie jestLCM(a,b)
...a*b/GCD(a,b)
nie są krótsze niżLCM(a,b)
).Łuska , 10 bajtów
Brutalna siła. Pobiera i zwraca listy i działa również dla więcej niż dwóch liczb. Wypróbuj online!
Wyjaśnienie
źródło
Mathematica, 82 bajty
źródło
Select[...][[1]]
zamiastFirst@Select[...]
zapisać bajt?#&@@
zamiast[[1]]
zaoszczędzić jeszcze jednego ;-)JavaScript (ES6),
908480 bajtówPobiera dane wejściowe w składni curry
(a)(b)
i zwraca tablicę 2 liczb całkowitych.Przypadki testowe
Pokaż fragment kodu
W jaki sposób?
źródło
MATL ,
1716 bajtówWypróbuj online!
Ta sama metoda, co rozwiązanie Jelly firmy Lynn
Minęło trochę czasu, odkąd użyłem MATL (lub Matlaba w tym przypadku), więc prawdopodobnie jest możliwych wiele ulepszeń.
źródło
Haskell ,
5048474542 bajtyPomysł: zauważyłem to
c*d = a*b/gcd(a,b)
. Algorytm wykonuje więc dwa kroki:c' = a/gcd(a,b)
id' = b
. Spełnia to wszystkie wymagania oprócz tegoc'
id'
musi być współdzielone.e = gcd(c',d')
a następnie ustawiamc = c'*e
id = d'/e
. Zachowuje to wszystkie właściwości (ponieważ połączone czynniki pozostają takie same), ale ponieważ usuwam wszystkie wspólne czynnikid
, tworzęc
id
kopiuję.W mojej implementacji
c'
właśnie się nazywac
.Wypróbuj online!
-3 bajty dzięki Laikoni
źródło
c
pozwala zaoszczędzić 3 bajty: Wypróbuj online!05AB1E , 12 bajtów
Wypróbuj online! lub jako pakiet testowy
źródło
R , 126 bajtów
Wypróbuj online!
To wymaga innego (i pozornie mniej Golfy) podejście do znalezienia wartości niż drugi R odpowiedź .
Wyjaśnienie:
z wyjątkiem tego, że podsuwam wszystkie definicje jako domyślne argumenty i wykonuję wszystkie obliczenia w jednym wierszu dla golfisty.
źródło
J , 19 bajtów
Wypróbuj online!
Na podstawie rozwiązania @ Lynn .
Wyjaśnienie
źródło
Haskell ,
9174 bajtówWypróbuj online!
Zaoszczędź 17 bajtów dzięki Laikoni
źródło
u*v`div`gcd u v
zapisuje bajt.lcm
funkcji?rem a x+rem b y+gcd x y<2
Powinien też działać.lcm
istniało.rem a x+rem b y+gcd x y<2
działa i zastanawiam się, czyrem a x+rem b y+gcd x y+lcm a b-lcm x y<2
działa. Być może istnieje (matematyczna) gwarancjalcm a b>=lcm x y
.lcm a b>=lcm x y
ponieważ 1.x=x1*...*xi
(rozkład pierwotny)y=y1*...yj
,lcm x y=z1*...*zk
gdziez1,...,zk
są wspólne dlax1,...,xi
iy1,...,yj
. 2.a=u1*...*um*x1*...*xi
(rozkład pierwotny)b=v1*...vn*y1*...yj
,lcm a b=t1*...*tl
gdziet1,...,tl
są wspólne dlau1*...*um*x1*...*xi
iv1*...vn*y1*...yj
. To oczywiste, żet1,...,tl
zawieraz1,...,zk
, w ten sposóblcm a b>=lcm x y
. Ale to nie jest przydatne do zapisania warunku jako sumy.Python 2, 75 bytes
Input is taken as a list, which the function modifies in place.
Try it online!
źródło
Python 3, 129 bytes
Try it online! or Try the test suite.
Outputs all possible combinations in the form of a nested list.
źródło
-~a
and-~b
can just be rewritten asa+1
andb+1
for readability :PJelly,
19 1514 bytes-4 with pointer from Leaky Nun (use divisor built-in)
I am almost 100% certain this is not the way to actually do this one, but here is a first attempt.
Let's see who outgolfs it with a seven or eight byter!
Yep... see Lynn's answer with explanation!
A monadic link taking a list of the two numbers and returning a list of lists of the possibilities.
Try it online!
How?
źródło
ÆD
but (shrug) brain obviously not in gear...Perl 6, 72 bytes
Try it online!
Takes a list (a, b). Returns a list of all possible lists (c, d).
Explanation:
źródło
Python 2,
126121 bytesTry it online!
źródło
Python 2 + sympy, 148 bytes
Try it online!
-1 thanks to Jonathan Frech.
This answer works in Python 2 (not Python 3), using
sympy.gcd
andsympy.lcm
instead ofmath.gcd
andmath.lcm
which are only available in Python 3. And yes, this is brute force :)źródło
Q=c==z;
(+7 bytes) at the start of the while loop and replacingor(c==z)+d
withor Q+d
(-4 bytes) andc=+(c==z)or
withc=+Q or
(-4 bytes). (TIO)+
operator ind=+E
orc=+(c==z)
to convert a boolean into an integer?True
andFalse
instead of1
and0
in sympy.+...
has any use.Jelly, 13 bytes
Try it online! My first Jelly answer! Edit:
ÆEz0µỤ€’×µZÆẸ
also works for 13 bytes. Explanation:źródło
PARI/GP, 86 bytes
This just does what Lynn says in her answer:
If I do not count the
f(a,b)=
part, it is 79 bytes.źródło
05AB1E,
322624222019 bytesTry it online! I still have no idea how to write in this language, but at least it's not a brute-force algorithm. Explanation:
źródło