Yang perlu Anda lakukan adalah membuat fungsi / program yang mengambil desimal sebagai input, dan mengeluarkan hasil berulang-ulang mengambil bagian fraksional dari angka tersebut, hingga angka tersebut menjadi bilangan bulat.
Lebih khusus, prosesnya adalah sebagai berikut:
Biarkan x menjadi input
Jika x adalah bilangan bulat, output saja.
Sebaliknya: . Kembali ke 2.
adalah komponen fraksional dari , dan sama dengan . adalah lantai x, yang merupakan bilangan bulat terbesar kurang dari .
Kasus uji:
0 = 0
0.1 = 1/10 -> 10
0.2 = 1/5 -> 5
0.3 = 3/10 -> 10/3 -> 1/3 -> 3
0.4 = 2/5 -> 5/2 -> 1/2 -> 2
0.5 = 1/2 -> 2
0.6 = 3/5 -> 5/3 -> 2/3 -> 3/2 -> 1/2 -> 2
0.7 = 7/10 -> 10/7 -> 3/7 -> 7/3 -> 1/3 -> 3
0.8 = 4/5 -> 5/4 -> 1/4 -> 4
0.9 = 9/10 -> 10/9 -> 1/9 -> 9
1 = 1
3.14 = 157/50 -> 7/50 -> 50/7 -> 1/7 -> 7
6.28 = 157/25 -> 7/25 -> 25/7 -> 4/7 -> 7/4 -> 3/4 -> 4/3 -> 1/3 -> 3
Ringkasan untuk 0 hingga 1 dengan penambahan 0,1: 0, 10, 5, 3, 2, 2, 2, 3, 4, 9, 1
Ini adalah kode-golf , byte paling sedikit menang.
Klarifikasi:
- "Poin bonus" tanpa kesalahan pembulatan
- Harus berfungsi untuk nomor rasional yang tidak negatif (mengabaikan kesalahan pembulatan)
- Anda bisa, tetapi tidak harus menampilkan langkah-langkah yang diambil
- Anda dapat mengambil input sebagai desimal, pecahan, atau pasangan angka, yang bisa dalam string.
Maaf untuk semua masalah, ini adalah pertanyaan pertama saya di situs web ini.
code-golf
math
arithmetic
recursion
rational-numbers
Solomon Ucko
sumber
sumber
Jawaban:
J, 18 byte
Dalam J, idiom
u ^: v ^:_
berarti "Tetap menerapkan kata kerjau
sementara kondisiv
mengembalikan true.Dalam kasus kami, kondisi akhir ditentukan oleh pengait
~:<.
, yang berarti "dasar angka<.
tidak sama~:
dengan angka itu sendiri" - jadi kami akan berhenti ketika kata kerja utamau
mengembalikan int.u
dalam hal ini adalah pengait lain-<.
- nomor minus lantainya - yang nilai kembaliannya dimasukkan ke@
dalam kata kerja timbal balik%
.Cobalah online!
sumber
_2{(%@-<.) ::]^:a:
.%@|~&1^:(~:<.)^:_
Python 3 , 101 byte
Cobalah online!
Format: string harus mengandung titik desimal.
sumber
.replace(".","")
->.replace(*"._")
simpan 1 byteMathematica, 36 byte
Demo
sumber
Rationalize
?Rationalize
, Mathematica berpikir tidak ada cukup presisi untuk menghasilkan semua fraksi lanjutan. MisalnyaContinuedFraction[0.1]
saja{0}
.Perl 6 , 42 byte
Cobalah online!
The
nude
Metode mengembalikan nu merator dan de nominator dari sejumlah rasional sebagai daftar dua elemen. Lebih pendek untuk mendapatkan penyebut dengan cara ini daripada memanggildenominator
metode secara langsung.sumber
Haskell , 47 byte
Ini mengalahkan jawaban Wheat Wizard karena
GHC.Real
memungkinkan kita untuk mencocokkan pola pada penggunaan rasional:%
, serta memiliki nama yang lebih pendekCobalah online!
f
mengambilRational
angka sebagai input, walaupun ghc memungkinkannya ditulis dalam format desimal, dalam ketelitian tertentu.sumber
Haskell ,
4034 byteEdit:
(Tidak dapat menahan memposting ini setelah melihat jawaban Haskell dengan impor verbose - sekarang saya melihat beberapa jawaban bahasa lain juga pada dasarnya menggunakan metode ini.)
!
mengambil dua argumen integer (pembilang dan penyebut dari fraksi; mereka tidak perlu dalam istilah terkecil tetapi penyebutnya harus positif) dan mengembalikan integer. Sebut sebagai314!100
.Cobalah online!
n/d
(dengan asumsid
positif) adalahmod n d/d
, jadi kecualimod n d==0
,!
berulang dengan representasid/mod n d
.sumber
Python 3 + sympy , 67 byte
Cobalah online!
Sympy adalah paket matematika simbolik untuk Python. Karena ini simbolis dan bukan biner, tidak ada ketidakakuratan floating point.
sumber
PHP , 69 byte
Cobalah online!
PHP , 146 byte
Cobalah online!
sumber
Jelly , 8 byte
Cobalah online!
Ketidaktepatan titik mengambang.
sumber
M
untuk memperbaiki floating-point ketidakakuratan: P . Ini Jelly tetapi dengan matematika presisi yang sewenang-wenang. Tidak memperbaiki loop 0,7 sekalipun.JavaScript ES6, 25 byte
Panggilan
f(a,b)
untuka/b
sumber
gcd(a,b)=1
dapat menghapus/b
Haskell ,
6261 byteCobalah online!
Menggunakan
Data.Ratio
perpustakaan Haskell untuk rasional presisi yang sewenang-wenang. Andai saja nama-nama bawaannya tidak begitu panjang.sumber
Data.Ratio
. Saya belum pernah mendengarnyaGHC.Real
. Jangan ragu untuk memposting itu sebagai jawaban Anda sendiri.APL (Dyalog Classic) , 18 byte
Cobalah online!
APL NARS, 18 karakter
-1 byte berkat tes Uriel
sumber
⍵-⌊⍵
→1|⍵
untuk satu byteSmalltalk, 33 byte
sumber
Stax , 8 byte
Jalankan dan debug itu
"Poin bonus" tanpa kesalahan presisi. Tidak ada aritmatika floating point yang digunakan. Ini (akhirnya) memanfaatkan tipe rasional bawaan stax.
sumber
JavaScript, 70 byte
Jika kita dapat mengubah tipe input menjadi string, maka itu dapat menghemat 5 byte.
sumber