Haskell, 37 36 18 byte
foldr1$(.(1/)).(+)
Fungsi ini mengharapkan Ratio
tipe Haskell sebagai input. Contoh penggunaan:
Prelude Data.Ratio> ( foldr1$(.(1/)).(+) ) [4%1,2,1,3,1,2]
170 % 39
Catatan: satu eksplisit Ratio
dalam daftar input ( 4%1
) sudah cukup, sistem tipe menemukan bahwa yang lain juga harus Ratio
s.
Sunting: @Lynn menyimpan satu byte. Terima kasih!
Sunting II: menghapus import
(lihat diskusi ini tentang meta ).
nimi
sumber
sumber
import
. Namun untuk menyebutnya, Anda harus memberi makanRatio
untuk itu yang memang membutuhkanimport
. Haruskah saya menambahkanimport
ke jumlah byte atau tidak?from fractions import Fraction
untuk melakukan operasi denganFraction
objek, pernyataan impor juga dihitung.Ratio
yang hanya dapat dibangun melalui%
, yang membutuhkan impor. Biasanya kita tidak menghitung byte untuk memanggil overhead, hanya untuk fungsi itu sendiri.Jawaban:
GolfScript , 13 byte
Cobalah online!
Yay untuk alasan tersembunyi GolfScript . :)
Penjelasan
Satu-satunya jenis nomor "resmi" GolfScript adalah bilangan bulat. Tetapi operator eksponensial tidak memberikan hasilnya ke integer dan dengan mudah hasil asli dari eksponensial integer di Ruby (bahasa juru bahasa GolfScript) adalah bilangan rasional. Jadi kita bisa dengan mudah mendapatkan pecahan dengan menaikkan sesuatu ke kekuatan -1. Dengan mudah, kami tetap ingin balasan ...
sumber
Mathematica,
2322 bytePada dasarnya port jawaban GolfScript saya . Berikut ini beberapa alternatif:
Untuk 24 byte, kita dapat menulis fungsi variadic rekursif:
Untuk 21 byte, kita bahkan dapat menentukan "operator variadic", tapi konvensi panggilannya akan begitu aneh, bahwa aku enggan untuk menghitung satu ini:
Anda harus memanggil ini dengan urutan nilai input, misalnya
±Sequence[3, 7, 15, 1, 292, 1]
atau±##&[3, 7, 15, 1, 292, 1]
.Dan juga untuk 21 byte, akan ada built-in (dilarang):
sumber
LabVIEW, 36 byte setara
Implementasi naif lurus ke depan dengan menggunakan algoritma OP. Apakah ada cara yang lebih baik untuk melakukan ini?
sumber
Dyalog APL , 10 byte
Bahkan tidak menggunakan built-in untuk rasional.
Membawa {a 0 , a 1 , a 2 , 3 , ...} sebagai argumen, menghasilkan {denominator, numerator}.
1(,÷∨)
1-prepended-to dibagi oleh GCD 1 dan+∘÷
plus-the-kebalikan dari/
pengurangan lebihTryAPL online!
sumber
Python 2, 62 byte
Sayangnya ini bukan golfy (lihat jawaban @ xnor untuk lebih pendek), tetapi menghitung fraksi tanpa perlu membalikkan input. Ini menggunakan pendekatan "tabel ajaib" untuk konvergen - mengingat dua fraksi terakhir
a/c
danb/d
, fraksi berikutnya adalah(n*b+a)/(n*c+d)
.Misalnya, untuk pi:
Kita bisa melihat bahwa
15*22 + 3 = 333
,15*7 + 1 = 106
,1*333 + 22 = 355
,1*106 + 7 = 113
, dllsumber
M, 5 byte
Input adalah daftar nilai
[a0, a1, ..., aN]
dan menghasilkan bilangan rasional.Cobalah online! atau Verifikasi semua kasus uji.
Penjelasan
sumber
Haskell, 30 byte
Secara rekursif menambahkan setiap lapisan keluar, memperbarui
n/d
keh+(1/(n/d))
, yang sama denganh+d/n
atau(h*n+d)/n
. Fraksi disimpan sebagai tuple(num,denom)
. Bagian awal dari(1,0)
flips0/1
yang mana adalah0
.sumber
Python, 50 byte
Membangun fraksi lanjutan dari akhir daftar mundur, berulang kali memperbarui fraksi
n/d
pada elemen terakhirx
sebagain/d -> 1+1/(n/d) == (x*n+d)/n
.sumber
Common Lisp, 54
Lipatan kanan agak verbose:
Tes
sumber
Julia (53 Bytes)
Ini adalah pertama kalinya saya menggunakan Julia, jika saya mengabaikan iterator yang bisa saya gunakan untuk kehilangan beberapa byte lagi, beri tahu saya. Berikut adalah petunjuk bagi siapa saja yang tidak tahu bahasa apa yang harus dipilih untuk tantangan khusus ini: https://en.wikipedia.org/wiki/Rational_data_type
sumber
∘
) alih-alih fungsix∘c=(a=0;while x!=[];a=1//(pop!(x)+a);end;a+c;)
x->foldr((x,y)->x+1//y,x)
(sama dengan solusi Haskell). penggunaan:(x->foldr((x,y)->x+1//y,x))([4//1,2,1,3,1,2])
Javascript (ES6), 55 byte
Uji kasus
sumber
CJam ,
1816 bytePenerjemah online .
sumber
05AB1E ,
1917 bytePenjelasan
Input diambil sebagai daftar angka
Cobalah online!
sumber
JavaScript (ES6), 44 byte
sumber
Javascript (ES6), 50 byte
Ini berkat jawaban Arnauld, sebelum melihatnya saya terjebak pada 66 byte:
Contoh:
Panggilan:
f([1, 0, 1, 1, 2, 1, 1])
Keluaran:
Array [ 19, 7 ]
sumber
Perl 6 , 24 byte
Penjelasan:
1 / * + *
adalah lambda dengan dua parameter (*
) yang mengambil kebalikan dari yang pertama, dan menambahkan yang kedua. (mengembalikan Tikus )R[&(…)]
menggunakan itu seolah-olah itu operator infiks dan membalikkannya.(termasuk membuatnya asosiatif dengan benar)
[…](@_)
mengambil itu dan menggunakannya untuk mengurangi input.… .nude
mengembalikan nu merator dan de nominator of the Rat .{ … }
menjadikannya lambda blok kosong dengan parameter implisit@_
.Pemakaian:
sumber
Zephyr , 145 byte
Zephyr adalah bahasa pemrograman pertama yang pernah saya buat. Itu dirancang untuk menjadi intuitif dan memiliki sintaksis bersih - bukan dengan mengorbankan singkatnya. Mengapa saya bermain golf dengannya, Anda bertanya? Karena, tidak seperti bahasa apa pun yang saya tulis sejak itu, ia memiliki tipe bawaan
Fraction
. Anda bahkan dapat menggunakan operator divisi/
sebagai operator unary untuk "terbalik" (fitur yang saya pinjam untuk Pip).Sekarang, ada batasan yang signifikan. Masalah terbesar untuk tantangan ini adalah bahwa array harus didefinisikan dengan ukuran tetap, yang berarti bahwa program dimulai dengan membaca ukuran array dari pengguna. (Saya harap ini baik-baik saja; alternatifnya adalah ukuran hardcoding.) Ada juga masalah kecil yang tidak ada diutamakan operator, artinya ekspresi multi-operator harus memiliki tanda kurung.
Berikut ini contoh yang dijalankan:
sumber
Ruby, 34 byte
Ini melakukan lipatan kanan (dengan membalik dan kemudian melipat kiri), menambahkan setiap elemen ke 1 di atas total running (elemen di sebelah kanan). Ruby memiliki tipe Rasional, yang sangat bagus. Dan rasional literal adalah nomor dengan akhiran
r
.sumber
Stax , 4 byte
Jalankan dan debug itu
Sekecil itu, itu bukan built-in. Rasional bawaan cukup membantu. Dibongkar ke ascii, programnya adalah
rksu+
.(a, b) => (a + 1/b)
.sumber
APL (NARS), 15 + 1 karakter, 30 + 2 byte
Terjemahan dalam Apl (Nars) dari solusi Adam J ... input yang diizinkan untuk fungsi tersebut adalah semua daftar bilangan bulat, di mana elemen pertama akan bertipe rasional. Uji:
jadi itu akan menjadi 15 karakter sebagai panjang fungsi dan 1 karakter untuk "x" untuk memasukkan tipe input yang saya inginkan dan keluar dari tipe yang saya inginkan ...
sumber