Diberikan dua bilangan bulat positif a
dan b
, menghasilkan dua bilangan bulat positif c
dan d
sedemikian rupa sehingga:
c
membagia
d
membagib
c
dand
co-prime- yang paling umum beberapa dari
c
dand
sama dengan beberapa paling umum daria
danb
.
Jika ada lebih dari satu jawaban yang mungkin, Anda hanya dapat menampilkan satu atau semua jawaban.
Kasus uji:
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
Ini adalah kode-golf . Jawaban terpendek dalam byte menang.
code-golf
arithmetic
number-theory
Biarawati Bocor
sumber
sumber
d
membelahb
Jawaban:
Jelly ,
2113 byteCobalah online!
Dengan kata lain: mulai dari (c, d) = (a, b) . Kemudian, untuk masing-masing prime, bagi prime itu semua jalan keluar dari faktorisasi c atau d : mana yang memiliki eksponen terkecil untuk prime itu. (Dalam implementasi ini, dalam kasus seri, c kehilangan eksponennya.)
Jadi jika a = 2250 = 2 1 · 3 2 · 5 3 dan b = 360 = 2 3 · 3 2 · 5 1 ,
maka c = 2 0 · 3 0 · 5 3 = 125 dan d = 2 3 · 3 2 · 5 0 = 72 .
Jonathan Allan bermain golf sebanyak 8 byte! Terima kasih ~
sumber
ÆEZ×Ụ’$€$ZÆẸ
[1,18]
untuk[15,18]
. Versi awal mengembalikan jawaban yang benar ([5,18]
).ÆEz®0iṂ$¦€ZÆẸ
harus melakukan trik untuk 13.R,
143139123 byte(Terima kasih kepada @Giuseppe untuk off 19 byte itu!)
Dengan lekukan, baris baru, dan beberapa penjelasan:
Kasus uji:
sumber
!
memiliki prioritas lebih tinggi dari&
dan|
tetapi lebih rendah dari+
dan*
; Anda harus bisa menurunkan beberapa byte dengan cara itu; yaitu,!i%%q&j%%q
harus setara dengan!i%%q+j%%q
GCD(c,d)==1
, laluLCM(c,d)==c*d
. Jadi kita dapat mengujiGCD(c,d)==1
dan kemudian memeriksa apakahc*d==a*b/GCD(a,b)
karena yang terakhir adalahLCM(a,b)
...a*b/GCD(a,b)
tidak lebih pendek dariLCM(a,b)
).Sekam , 10 byte
Paksaan. Mengambil dan mengembalikan daftar, dan bekerja untuk lebih dari dua angka juga. Cobalah online!
Penjelasan
sumber
Mathematica, 82 byte
sumber
Select[...][[1]]
alih-alihFirst@Select[...]
menyimpan byte?#&@@
alih-alih[[1]]
menyimpan satu lagi ;-)JavaScript (ES6),
908480 byteMengambil input dalam sintaks currying
(a)(b)
dan mengembalikan array 2 integer.Uji kasus
Tampilkan cuplikan kode
Bagaimana?
sumber
MATL ,
1716 byteCobalah online!
Metode yang sama dengan solusi Lynn's Jelly
Sudah lama sejak saya menggunakan MATL (atau matlab dalam hal ini) begitu banyak perbaikan yang mungkin dilakukan.
sumber
Haskell ,
5048474542 byteIde: Saya perhatikan itu
c*d = a*b/gcd(a,b)
. Jadi algoritma melakukan dua langkah:c' = a/gcd(a,b)
dand' = b
. Ini memenuhi semua persyaratan kecuali ituc'
dand'
harus co-prime.e = gcd(c',d')
lalu mengaturc = c'*e
dand = d'/e
. Ini membuat semua properti (karena faktor gabungan tetap sama), tetapi karena saya menghapus semua faktor yang dibagikand
, saya membuatc
dand
coprime.Dalam implementasi saya,
c'
baru saja dipanggilc
.Cobalah online!
-3 byte terima kasih kepada Laikoni
sumber
c
menghemat 3 byte: Cobalah secara online!05AB1E , 12 byte
Cobalah online! atau sebagai Test suite
sumber
R , 126 byte
Cobalah online!
Ini mengambil pendekatan yang berbeda (dan tampaknya kurang golf) untuk menemukan nilai daripada jawaban R lainnya .
Penjelasan:
kecuali saya shoehorn semua definisi sebagai argumen default dan melakukan semua perhitungan pada satu baris untuk golfiness.
sumber
J , 19 byte
Cobalah online!
Berdasarkan solusi @ Lynn .
Penjelasan
sumber
Haskell ,
9174 byteCobalah online!
Disimpan 17 byte berkat Laikoni
sumber
u*v`div`gcd u v
menghemat satu byte.lcm
fungsi bawaan?rem a x+rem b y+gcd x y<2
harus bekerja.lcm
ada builtin .rem a x+rem b y+gcd x y<2
bekerja, dan saya ingin tahu apakahrem a x+rem b y+gcd x y+lcm a b-lcm x y<2
berhasil. Ada mungkin sebuah (matematika) jaminan bahwalcm a b>=lcm x y
.lcm a b>=lcm x y
karena 1.x=x1*...*xi
(dekomposisi utama)y=y1*...yj
,, dilcm x y=z1*...*zk
manaz1,...,zk
umumx1,...,xi
dany1,...,yj
. 2.a=u1*...*um*x1*...*xi
(dekomposisi utama)b=v1*...vn*y1*...yj
,, dilcm a b=t1*...*tl
manat1,...,tl
umumu1*...*um*x1*...*xi
danv1*...vn*y1*...yj
. Jelas sudaht1,...,tl
mengandungz1,...,zk
, jadilcm a b>=lcm x y
. Tapi itu tidak berguna untuk menulis kondisi sebagai penjumlahan.Python 2 , 75 byte
Input diambil sebagai daftar, yang diubah fungsi pada tempatnya.
Cobalah online!
sumber
Python 3 , 129 byte
Cobalah online! atau Coba test suite.
Keluarkan semua kombinasi yang mungkin dalam bentuk daftar bersarang.
sumber
-~a
dan-~b
hanya dapat ditulis ulang sebagaia+1
danb+1
untuk dibaca: PJelly ,
19 1514 byte-4 dengan pointer dari Leaky Nun (gunakan pembagi bawaan)
Saya hampir 100% yakin ini bukan cara untuk benar-benar melakukan ini, tetapi di sini adalah upaya pertama.
Mari kita lihat siapa yang mengalahkannya dengan tujuh atau delapan byter!
Yap ... lihat jawaban Lynn dengan penjelasan!
Tautan monadik mengambil daftar dari dua angka dan mengembalikan daftar daftar kemungkinan.
Cobalah online!
Bagaimana?
sumber
ÆD
tapi otak (jelas-jelas) tidak jelas ...Perl 6 , 72 byte
Cobalah online!
Mengambil daftar (a, b). Mengembalikan daftar semua daftar yang mungkin (c, d).
Penjelasan:
sumber
Python 2 ,
126121 byteCobalah online!
sumber
Python 2 + sympy , 148 byte
Cobalah online!
-1 terima kasih kepada Jonathan Frech .
Jawaban ini bekerja di Python 2 (bukan Python 3), menggunakan
sympy.gcd
dansympy.lcm
bukannyamath.gcd
danmath.lcm
yang hanya tersedia di Python 3. Dan ya, ini adalah kekuatan brutal :)sumber
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:sumber
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.sumber
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:
sumber