Buat fungsi yang mengambil bilangan alami (mulai dari 0 inklusif), dan mengembalikan sepasang bilangan bulat positif, yang masing-masing adalah pembilang dan penyebut. Gunakan traversal diagonal. Nomor yang dihitung sebelumnya harus dilewati. (Anda dapat menghafal sekumpulan nilai yang dilewati)
Diagram:
Merah adalah nilai yang dilewati
Nilai:
- f (0) = 1, 1
- f (1) = 2, 1
- f (2) = 1, 2
- f (3) = 1, 3
- f (4) = 3, 1 (perhatikan lompatan)
- f (5) = 4, 1
- f (6) = 3, 2
- f (7) = 2, 3
- f (8) = 1, 4
- f (9) = 1, 5
- f (10) = 5, 1 (perhatikan lompatan)
Anda dapat menggunakan struktur data Rasional dan operasi mereka jika ada. Kode terpendek menang.
code-golf
rational-numbers
Ming-Tang
sumber
sumber
Jawaban:
J,
4136 karakterMengambil bilangan bulat dan mengembalikan vektor yang terdiri dari dua bilangan bulat. Solusi pertama saya yang tidak sepenuhnya diam-diam atau sepenuhnya eksplisit.
Berikut adalah solusinya dengan spasi yang dimasukkan:
Sebuah penjelasan:
x (, % +.) y
–Sebuah vektor panjang 2 yang mewakili fraksi dengan pembilangx
dan penyebuty
direduksi menjadi penyebut terkecil1 + i. 1 + y
–Sebuah vektor bilangan bulat dari1
key + 1
(, % +.)"0/~ 1 + i. 1 + y
–Sebuah matriks dari semua pecahan tereduksi dengan penyebut dan pembilang yang tidak direduksi dalam kisaran dari1
hinggay + 1
.<`(<@|.)/. y
–Sebuah array diagonal miring dari matriksy
, masing-masing diagonal terbalik~. ; y
–Sebuah array diagonal diciutkan menjadi vektor elemen dengan duplikat dihapusx { y
–Barang pada posisix
diy
(u v) y
- sama sepertiy u v y
. Dalam kasus penggunaan khusus ini,u
adalah{
danv
sekarang3 : '~. ; <`(<@|.)/. (, % +.)"0/~ 1 + i. 1 + y'
sumber
Haskell, 78 karakter
Contoh dijalankan:
cycle
dan berfungsi untuk mengubah urutan bariscycle
dengan daftar tak terbatas buatan tangand
gcd
identitas yang diterapkan seperti yang disarankan oleh Matíassumber
gcd (r-b) b == gcd r b
dan Anda dapat mengurangi empat karakter lagi.Python, 144 karakter
sumber
Ruby 1.9,
109106sumber
OCaml + Baterai,
182168 karakterIni adalah hal yang alami di Haskell tetapi hanya mungkin di OCaml:
Sunting: Diagonal tidak perlu
sumber
Perl 6 , 75 byte
Menguji
Ini pada dasarnya menghasilkan seluruh urutan nilai-nilai rasional, hanya berhenti setelah nilai indeks dihasilkan.
(Berdasarkan golf saya untuk tantangan lain.)
Diperluas:
({1…($+=2)…1}…*)
menghasilkan urutan pembilang yang tak terbatas (|(…)
digunakan di atas untuk meratakan)(1,{1…(($||=1)+=2)…1}…*)
menghasilkan urutan penyebut tanpa batassumber