Dalam representasi desimal dari setiap bilangan rasional p/q
, Anda memiliki ekor periodik, kepala non-periodik, dan bagian sebelum titik desimal dalam format berikut:
(before decimal point).(non-periodic)(periodic)
Beberapa contoh termasuk:
1/70 = 0.0142857... = (0).(0)(142857)
10/7 = 1.428571... = (1).()(428571) ## no non-periodic part
1/13 = 0.076923... = (0).()(076923)
3/40 = 0.075 = (0).(075)() ## no periodic part
-2/15 = -0.13... = -(0).(1)(3) ## negative
75/38 = 1.9736842105263157894... = (1).(9)(736842105263157894)
## periodic part longer than float can handle
25/168 = 0.148809523... = (0).(148)(809523)
120/99 = 40/33 = 1.212121... = (1).()(21)
2/1 = 2 = (2).()() ## no periodic, no non-periodic
0/1 = 0 = (0).()()
0/2 = 0 = (0).()()
299/792 = 0.37752... = (0).(377)(52)
95/-14 = -6.7857142... = -(6).(7)(857142)
-95/-14 = 6.7857142... = (6).(7)(857142)
Tantangannya adalah untuk menukar bagian-bagian periodik dan non-periodik, meninggalkan yang before decimal point
sendirian, untuk membuat nomor baru. Sebagai contoh:
25/168 = 0.148809523... = (0).(148)(809523)
=> (0).(809523)(148) = 0.809523148148... = 870397/1080000
Jika suatu angka tidak memiliki bagian periodik seperti 0.25
ubahlah angka itu menjadi angka periodik baru, dan sebaliknya.
1/4 = 0.25 = (0).(25)() => (0).()(25) = 0.252525... = 25/99
4/9 = 0.444444... = (0).()(4) => (0).(4)() = 0.4 = 2/5
5/1 = 5 = (5).()() => (5).()() = 5 = 5/1
Tantangan
- Ambil sebagian kecil
x
sebagai input, sebagai string, dua input, angka rasional, atau metode apa pun yang sesuai dengan bahasa Anda. - Tukar bagian periodik dan non-periodik dari representasi desimal
x
untuk membuat angka baru, dan tinggalkan bagian sebelum desimal saja. Bagian periodik selalu dimulai sesegera mungkin sehingga bagian non-periodik sesingkat mungkin. Contohnya di bawah ini. - Kembalikan nomor yang ditukar sebagai fraksi baru. Input tidak harus dikurangi meskipun output seharusnya. Format input diperbolehkan berbeda dari format output.
- Pembilang
p
darix
akan integer dengan nilai absolut dari satu juta atau kurang dan penyebutq
darix
akan menjadi non-nol bilangan bulat dengan nilai absolut dari satu juta atau kurang. - Pembilang
r
dan penyebuts
hasilnya tidak dijamin kurang dari satu juta. Mengingat panjang bagian periodik dari angka-angka ini, disarankan agar Anda tidak langsung mengkonversi menjadi pelampung. - Ini kode golf. Jawaban terpendek dalam byte menang.
Contohnya
1/70 = (0).(0)(142857) => (0).(142857)(0) = (0).(142857)() = 0.142857 = 142857/1000000
10/7 = (1).()(428571) => (1).(428571)() = 1.428571 = 1428571/1000000
1/13 = (0).()(076923) => (0).(076923)() = 0.076293 = 76923/1000000
3/40 = (0).(075)() => (0).()(075) = 0.075075... = 75/999 = 25/333
-2/15 = -(0).(1)(3) => -(0).(3)(1) = -0.311111... = -28/90 = -14/45
75/38 = (1).(9)(736842105263157894)
=> (1).(736842105263157894)(9) = (1).(736842105263157895)() ## since 0.999... = 1
= 1.736842105263157895 = 1736842105263157895/1000000000000000000
= 347368421052631579/200000000000000000
25/168 = (0).(148)(809523) => (0).(809523)(148) = 0.809523148148... = 870397/1080000
120/99 = (1).()(21) => (1).(21)() = 1.21 = 121/100
2/1 = (2).()() => (2).()() = 2 = 2/1
0/1 = (0).()() => (0).()() = 0 = 0/1
0/2 = (0).()() => (0).()() = 0 = 0/1
299/792 = (0).(377)(52) => (0).(52)(377) = 0.52377377... = 2093/3996
95/-14 = -(6).(7)(857142) => -(6).(857142)(7) = -6.857142777... = -12342857/1800000
-95/-14 = (6).(7)(857142) => (6).(857142)(7) = 6.857142777... = 12342857/1800000
code-golf
math
number
rational-numbers
Sherlock9
sumber
sumber
0
pada akhir uji kasus 2 (10/7
):1428571/100000
seharusnya1428571/1000000
.1/7
dapat direpresentasikan sebagai(0).()(142857)
atau(0).(1)(428571)
,1
bisa direpresentasikan sebagai(1).()()
,(0).()(9)
,(0).()(99)
,(0).(9)(9)
, dllJawaban:
Python 2, 292 byte
Versi tidak disatukan, bekerja di kedua python 2 & 3. Juga mencetak representasi desimal.
sumber
d=10**len(p+a)
if n==0: p=''
, gunakan``
di setiap tempat yang Anda gunakanstr
, seperti sebagai`n/d`
gantistr(n/d)
, dan ganti namalen
menjadiL
denganL=len;
di awal fungsi.n=int(b+p+a);d=10**L(p+a)
danimport fractions as f;g=f.gcd(n,d);return(n/g*s,d/g)
. Juga, saya mendapatkan 295 byte untuk hasil edit Anda saat ini. Apakah ada baris baru tambahan yang Anda lupa tinggalkan?Jelly ,
1021018987838179787774 byteIni butuh waktu lama untuk menulis, terlalu lama untuk men-debug, dan tentu saja membutuhkan banyak golf (
delapan tujuh enamlimaempat tautan, sapi suci), tetapi, sejauh pengetahuan saya, benar. Banyak, banyak terima kasih kepada Dennis untuk bantuannya di sini, terutama dengan dua tautan pertama. Banyak terima kasih kepada Rainer P. juga, karena saya akhirnya meminjam banyak algoritma dalam jawaban Python mereka.Suntingan golf: -1 byte berkat Xanderhall. Perbaikan bug dari tidak menggunakan logika TIDAK benar builtin. -13 byte dari bermain golf pada tautan pembilang. +1 byte dari memperbaiki bug untuk negatif
d
dengan terima kasih kepada Dennis. Merestrukturisasi tautan sehingga generasi pembilang semuanya dalam satu tautan. -2 byte dari menggabungkan tautan kedua dan ketiga. -4 byte dari memindahkan beberapa elemen umum dari tautan ketiga dan keempat ke tautan kedua dan tautan utama. -2 byte dari menghapus beberapa operator rantai berlebihan. -2 byte dari mengatur ulang tautan pembilang. -1 byte dari pemindahanḢ€
ke ujung tautan kedua. Memperbaiki bug di tautan utama. -1 byte dari pengubahanṪ ... ,Ḣ
keḢ ... ṭ
. -3 byte dari memindahkan tautan pembilang ke tautan utama.Selamat datang saran bermain golf! Cobalah online!
Penjelasan
Pertama, saya akan menjelaskan tautan utama , yang memanggil tautan lain.
Lalu, tautan pertama yang mendapat digit.
Sekarang, link kedua yang mendapat bagian periodik dan non-periodik
n/d
, dan banyak mengangkat berat lainnya.The Link ketiga , yang menghasilkan denominator baru.
sumber