Kita semua tahu bahwa setiap kali angka rasional ditulis dalam desimal, hasilnya adalah penghentian atau (akhirnya) periodik. Misalnya, ketika 41/42 ditulis dalam desimal, hasilnya adalah
0.9 761904 761904 761904 761904 761904 761904 761904 ...
dengan urutan awal digit 0.9
diikuti oleh urutan 761904
berulang-ulang. (A notasi nyaman untuk ini adalah 0.9(761904)
di mana kurung mengelilingi blok mengulangi digit.)
Tujuan Anda dalam tantangan ini adalah untuk mengambil angka rasional positif, menghapus angka pertama yang merupakan bagian dari urutan berulang, dan mengembalikan nomor rasional yang dihasilkan. Misalnya, jika kita melakukan ini pada 41/42, kita dapatkan
0.9 61904 761904 761904 761904 761904 761904 761904 ...
atau 0.9(619047)
singkatnya, yaitu 101/105.
Jika bilangan rasional memiliki penghentian ekspansi desimal, seperti 1/4 = 0.25
tidak, tidak ada yang terjadi. Anda dapat menganggap 1/4 sebagai 0.250000000...
atau sebagai 0.249999999...
tetapi dalam kedua kasus tersebut, menghapus digit pertama dari bagian berulang membuat angka tidak berubah.
Detail
- Masukan adalah bilangan rasional positif, baik sebagai pasangan bilangan bulat positif yang mewakili pembilang dan penyebut, atau (jika bahasa pilihan Anda memungkinkannya dan Anda ingin) sebagai semacam objek bilangan rasional.
- Outputnya juga bilangan rasional, juga dalam bentuk apa pun. Jika hasilnya bilangan bulat, Anda dapat mengembalikan bilangan bulat bukan angka rasional.
- Jika menggunakan sepasang angka sebagai input, Anda dapat menganggapnya relatif prima; jika menghasilkan sepasang angka sebagai output, Anda harus membuatnya menjadi prima.
- Berhati-hatilah agar Anda menemukan digit pertama yang memulai blok berulang. Sebagai contoh, seseorang dapat menulis 41/42 sebagai
0.97(619047)
tetapi itu tidak membuat 2041/2100 (dengan ekspansi desimal0.97(190476)
) jawaban yang valid. - Anda dapat mengasumsikan bahwa dalam input yang Anda dapatkan, digit periodik pertama adalah setelah titik desimal, menjadikan
120/11
=10.909090909...
input tidak valid: (digit periodik pertamanya dapat dianggap sebagai0
dalam10
). Anda dapat melakukan apapun yang Anda suka pada input tersebut. - Ini adalah kode-golf : solusi terpendek menang.
Uji kasus
41/42 => 101/105
101/105 => 193/210
193/210 => 104/105
104/105 => 19/21
1/3 => 1/3
1/4 => 1/4
2017/1 => 2017/1
1/7 => 3/7
1/26 => 11/130
1234/9999 => 2341/9999
sumber
2017
bukan2017/1
?(2017,1)
.)2/4
terjadi pada input?120/11
jawaban yang benar111/11
atau210/11
?111/11
kecuali bahwa jawaban yang paling tinggi saat ini kembali210/11
, jadi saya akan membiarkan Anda memilih untuk menghindari membatalkan jawaban yang ada.Jawaban:
Bahasa Wolfram (Mathematica) , 59 byte
Cobalah online!
Penjelasan
Temukan digit desimal input.
Jika ada angka berulang,
RotateLeft
mereka. (List@@#
mencegah kode dari upaya untuk memutar digit desimal terakhir jika nomor rasional diakhiri).Konversikan ke rasional.
sumber
Jelly ,
36323130 byte-1 byte terima kasih kepada Erik the Outgolfer !
Cobalah online!
Seharusnya benar. Ketidaktepatan titik apung tambahkan 3 byte untuk
+.Ḟ
.Bergantung pada input yang tidak dapat direduksi.
Penjelasan
Ini bergantung pada:
n/d
dalam bentuk yang paling sederhana. Kemudian tautan yangọ2,5Ṁ
diterapkand
akan memberikan angka digit non-periodik setelah titik radix.sumber
Python 2 ,
237235214 byte-21 byte terima kasih kepada Tn. Xcoder
Cobalah online!
Input dilakukan sebagai tuple
(numerator, denominator)
; output adalahfractions.Fraction
objek.Ini menggunakan metode gaya pembagian panjang untuk mendapatkan digit awal dan berulang jawaban, kemudian memindahkan digit berulang pertama ke akhir dan menggunakan manipulasi string dan
fraction.Fraction
mengubahnya kembali menjadi rasio.Versi tidak disatukan:
sumber
Python 3 ,
177173169 byteCobalah online!
sumber
Bahasa Wolfram (Mathematica) ,
7067 byteBerkat tip ini (sekarang dihapus) untuk -3 byte!
Cobalah online!
Port jawaban Jelly saya . Lebih lama dari jawaban Mathematica yang ada sebesar 8 byte ...
Fungsi mengambil 2 input
[denominator, numerator]
, sehinggaGCD[denominator, numerator] == 1
.sumber
Perl 6 , 102 byte
Cobalah
Mengambil nomor Rasional dan mengembalikan nomor Rasional atau Int .
Diperluas:
Note akan menangani penyebut hingga
uint64.Range.max
menangani penyebut yang lebih besar gunakanFatRat(9 x$1.chars)
Cobalah .sumber