Hari ini tujuan Anda adalah untuk menemukan bilangan bulat a dan b diberikan bilangan bulat non-negatif n sehingga:
Anda harus menulis program atau fungsi yang mengambil parameter n dan menghasilkan a dan b dalam format pilihan Anda.
Celah standar berlaku. Selain itu, dimaksudkan agar Anda menerapkan sendiri masalah di atas menggunakan aritmatika dasar. Jadi, Anda tidak boleh menggunakan fungsionalitas aljabar, rasional, atau fungsi aljabar bawaan yang dibangun di dalam matematika (misalnya urutan Lucas ).
Kode terpendek dalam byte menang.
Contoh input / output:
0 → 1, 0
1 → 3, 1
2 → 14, 6
3 → 72, 32
4 → 376, 168
5 → 1968, 880
6 → 10.304, 4608
7 → 53.952, 24.128
8 → 282.496, 126.336
9 → 1.479.168, 661.504
sumber
[3 5;1 3]**input('')*[1;0]
adalah 26 byte, bukan 41.@(n)[3 5;1 3]^n*[1;0]
(fungsi pegangan) akan menghemat lima karakter, ide bagus mut!Python 2, 50
Mengalikan dengan
3+sqrt(5)
berulang kali dengan aksinya pada pasangan yang(a,b)
mewakilia+b*sqrt(5)
. Setara dengan memulai dengan vektor kolom[1,0]
dann
kali mengalikan kiri oleh matriks[[3,5],[1,3]]
.sumber
Julia,
2220 byteIni menciptakan fungsi lambda yang mengambil bilangan bulat tunggal sebagai input dan mengembalikan vektor 2 elemen bilangan bulat yang sesuai dengan solusi [a, b]. Untuk menyebutnya, berikan nama, mis
f=n->...
.Mulailah dengan mengalikan
Kita kemudian dapat menerjemahkan sisi kanan persamaan ini ke dalam matriks 2-kolom, di mana yang pertama sesuai dengan koefisien a dan yang kedua dengan koefisien b :
Kalikan matriks ini dengan sendirinya n kali, lalu kalikan dengan vektor kolom (1, 0), dan POOF! Keluar muncul vektor solusi.
Contoh:
sumber
J, 20 byte
Gandakan vektor
[1 0]
dengan waktu matriks[[3 5] [1 3]]
n
.2 byte disimpan berkat @algorithmshark.
Penggunaan dan uji:
sumber
+/ .*(3 5,:1 3&)&1 0
.(+/@:*&(3 5,.1 3)&1 0)
bekerja dan(+/@:*&1 0&(3 5,.1 3))
tidak? Bukankah seharusnya ikatan kedua benar dan yang pertama bertukar?&
membuat powering / looping sehingga Anda memodifikasi input sisi kiri selama powering (berlawanan dengan modifikasi sisi kanan normal).Pyth, 20 byte
u
yang mengurangi secara umum, digunakan di sini sebagai loop berulang-ulang berlaku. Fungsi memperbarui adalahG
->,+*3sGyeG+sGyeG
, di manaG
2 tuple. Fungsi itu diterjemahkan menjadi3*sum(G) + 2*G[1], sum(G) + 2*G[1]
.s
adalahsum
,y
adalah*2
.sumber
APL (22)
Penjelasan:
{
...}⍣⎕⍨2↑1
: baca angka, dan jalankan fungsi berikut berkali-kali, gunakan[1,0]
sebagai input awal.2 2⍴3 5 1
: matriks[[3,5],[1,3]]
⍵+.×⍨
: kalikan angka pertama dalam ⍵ dengan 3, yang kedua dengan 5, dan jumlah mereka, ini adalah angka pertama yang baru; kemudian gandakan angka pertama menjadi ⍵ dengan 1, yang kedua dengan 3, dan jumlahkan, itu adalah angka kedua yang baru.sumber
Jelly , 13 byte
Cobalah online!
Bagaimana itu bekerja
sumber
Mathematica, 31
sumber
CJam, 21 byte
Cobalah online.
Bagaimana itu bekerja
sumber
Javascript,
6361 byteSaya menggunakan evaluasi rekursif binomial: (x + y) ^ n = (x + y) (x + y) ^ {n-1}
Baru (terima kasih kepada @ edc65)
Tua
sumber
F=n=>{for(i=y=0,x=1;i++<n;)[x,y]=[3*x+5*y,x+3*y];return[x,y]}
n=>[...Array(n)].map(_=>[x,y]=[3*x+5*y,x+3*y],y=0,x=1)[n-1]
panjang yang samaC, 114 byte
Ini mengimplementasikan perkalian matriks dengan cara yang membosankan. Untuk solusi 238 byte yang lebih menyenangkan (kutipan: "awesomely horrific"), tidak perlu mencari lagi!
Terurai:
Ini mungkin bisa dipersingkat sedikit. Coba program pengujian online !
sumber
k2 - 22 char
Berfungsi mengambil satu argumen.
_mul
adalah penggandaan matriks jadi kami menjilatnya dengan matriks(3 5;1 3)
dan kemudian memukulnya dengan keterangan daya fungsional:f/[n;x]
berlakuf
untukx
,n
kali. Sekali lagi kita menjilatnya, kali ini dengan vektor awal1 0
.Ini tidak akan berfungsi di Kona, karena beberapa alasan
f/[n;x]
tidak diterapkan dengan benar. Hanyan f/x
sintaks yang berfungsi, jadi perbaikan terpendek adalah{x _mul[(3 5;1 3)]/1 0}
23 karakter.sumber
ised, 25 byte (20 karakter)
Saya berharap menjadi lebih baik, tetapi ada terlalu banyak kawat gigi yang dibutuhkan untuk membuatnya kompeten, prioritas operator tidak optimal untuk bermain golf.
Ia mengharapkan input berada dalam slot memori $ 1, jadi ini berfungsi:
Untuk n = 0, nol dilewati (output 1, bukan 1 0). Jika itu masalah, ganti final
1
dengan~[2]
.sumber
Serius, 32 byte, tidak bersaing
Hex Dump:
Cobalah Onlline
Jelas bukan penantang untuk terpendek, tetapi setidaknya metode ini asli. (Memperhatikan bahwa masalah seperti itu mengindikasikan urutan Lucas, seperti yang disebutkan dalam deskripsi, program ini menghasilkan istilah urutan dari urutan menggunakan relasi perulangan
a_n = 6 * a_ {n-1} - 4 * a_ {n-2}.)
sumber
Haskell, 41 byte
Contoh penggunaan:
(iterate(\(a,b)->(3*a+5*b,a+3*b))(1,0)!!) 8
->(282496,126336)
.sumber
C / C ++ 89 byte
Diformat:
Konsep yang sama:
Bangku tes:
Hasil:
sumber
K, 37 byte
atau
Keduanya sama.
sumber
Python 3, 49 byte
meskipun pada mesin saya, ini hanya memberikan jawaban yang benar untuk input dalam jangkauan
0 <= n <= 18
.Ini mengimplementasikan rumus formulir tertutup
dan mengambil keuntungan dari kenyataan bahwa
v ** n
bagian itu kecil, dan dapat dihitung dengan pembulatan daripada perhitungan langsung.sumber
Skema, 97 byte
sumber
C 71 byte (60 dengan variabel yang diinisialisasi)
Lingkup untuk bermain golf tetapi hanya untuk membuktikan bahwa C tidak harus "sangat mengerikan".
Jika nilai dalam a diinisialisasi ke {1,0}, kami melakukan lebih baik.
Ini secara iteratif menggunakan pemetaan a-> 3a + 5b, b-> a + 3b tetapi menghindari variabel sementara dengan menghitung a dari nilai baru b sebagai gantinya.
sumber
a[*a=1]=0
alih-alih*a=1,a[1]=0
(non-bersaing) Jelly, 10 byte
Cobalah online!
Menggunakan matriks. Menghitung ([[3,1], [5,3]] ** input ()) [0].
sumber