Diberikan input integer positif N , output dua angka non-negatif, a dan b , di mana a <b , dengan nilai rata-rata serendah mungkin yang akan menghasilkan angka N yang menjadi bagian dari urutan relasi berulang:
f(0) = a
f(1) = b
f(n) = f(n-2)+f(n-1)
Dalam hal ada lebih dari satu solusi di mana rata-rata a dan b minimal, maka Anda harus mengeluarkan satu dengan yang terendah b .
Anda dapat menganggap N berada dalam kisaran bilangan bulat representatif dalam bahasa / sistem Anda.
Uji kasus
N = 1
a = 0, b = 1
N = 15
a = 0, b = 3
N = 21
a = 0, b = 1
N = 27
a = 0, b = 9 <- Tricky test case. [3, 7] is not optimal and [4, 3] is not valid
N = 100
a = 4, b = 10
N = 101
a = 1, b = 12
N = 102
a = 0, b = 3
N = 1000
a = 2, b = 10
a>=0
dana<b
adakah solusi berganda?1,4
dan2,3
mau memberi5
, dan mereka memiliki rata-rata yang sama. Saya kira mungkin untuk menemukan kasus yang mirip dengan yang itu, di mana ini adalah nilai rata-rata terendah. Jika Anda dapat menunjukkan / membuktikan bahwa tidak ada banyak solusi maka Anda tidak perlu memeriksa kondisi itu.Jawaban:
Sekam ,
191816141315 byteTerima kasih Zgarb untuk menghemat 1 byte.
Cobalah online!
Penjelasan:
Penafian: Saya benar-benar tidak mengerti
ȯƒẊ++
bagian dari kode.Sunting: Tampaknya menerjemahkan ke Haskell
fix.(mapad2(+).).(++)
, di manamapad2
ada fungsi untuk semua pasangan yang berdekatan dalam daftar. (Meskipun, mengenal Sekam, dalam konteks program ini bisa berarti sesuatu yang lain)sumber
JavaScript (Node.js) ,
92 90 89 91 8382 byte-3 byte-1 byte berkat ThePirateBay-8-9 byte terima kasih kepada Neil.Cobalah online!
Catatan: solusi ini bergantung pada kenyataan bahwa tidak pernah ada beberapa solusi minimal.
Bukti bahwa tidak pernah ada banyak solusi:
Membiarkan
FIB(a,b,k)
menjadi urutan Fibonacci seperti dimulai dengana,b
:Lemma 1
Perbedaan antara urutan Fibonacci adalah Fibonacci itu sendiri, yaitu
FIB(a1,b1,k) - FIB(a0,b0,k) = FIB(a1-a0,b1-b0,k)
. Buktinya diserahkan kepada pembaca.Lemma 2
Sebab
n >= 5
,a,b
ada solusi yang memuaskana+b < n
:jika
n
genap,FIB(0,n/2,3) = n
jika
n
aneh,FIB(1,(n-1)/2,3) = n
Bukti
Kasus-kasus dimana
n < 5
dapat diperiksa secara mendalam.Misalkan kita memiliki dua solusi minimal untuk
n >= 5
,a0,b0
dana1,b1
dengana0 + b0 = a1 + b1
dana0 != a1
.Lalu ada yang
k0,k1
seperti ituFIB(a0,b0,k0) = FIB(a1,b1,k1) = n
.Kasus 1:
k0 = k1
WLOG menganggap
b0 < b1
(dan karenanyaa0 > a1
)Membiarkan
DIFF(k)
menjadi perbedaan antara urutan seperti Fibonnaci dimulai dengana1,b1
dana0,b0
:DIFF(k) = FIB(a1,b1,k) - FIB(a0,b0,k) = FIB(a1-a0,b1-b0,k)
(Lemma 1)DIFF(0) = a1 - a0 < 0
DIFF(1) = b1 - b0 > 0
DIFF(2) = (a1+b1) - (a0+b0) = 0
DIFF(3) = DIFF(1) + DIFF(2) = DIFF(1) > 0
DIFF(4) = DIFF(2) + DIFF(3) = DIFF(3) > 0
Setelah urutan seperti Fibonnaci memiliki 2 istilah positif, semua istilah berikutnya positif.
Jadi, satu-satunya waktu
DIFF(k) = 0
adalah kapank = 2
, jadi satu-satunya pilihank0 = k1
adalah2
.Karena itu
n = FIB(a0,b0,2) = a0 + b0 = a1 + b1
Minimal dari solusi ini bertentangan dengan Lemma 2.
Kasus 2
k0 != k1
::WLOG berasumsi
k0 < k1
.Kita punya
FIB(a1,b1,k1) = n
Membiarkan
a2 = FIB(a1,b1,k1-k0)
Membiarkan
b2 = FIB(a1,b1,k1-k0+1)
Kemudian
FIB(a2,b2,k0) = FIB(a1,b1,k1) = FIB(a0,b0,k0)
(berolahraga untuk pembaca)Karena
FIB(a1,b1,k)
tidak negatif untukk >= 0
, itu juga tidak menurun.Ini memberi kita
a2 >= b1 > a0
danb2 >= a1+b1 = a0+b0
.Kalau begitu biarkan
DIFF(k) = FIB(a2,b2,k) - FIB(a0,b0,k) = FIB(a2-a0,b2-b0,k)
(Lemma 1)DIFF(0) = a2 - a0 > 0
DIFF(1) = b2 - b0 >= (a0 + b0) - b0 = a0 >= 0
DIFF(2) = DIFF(0) + DIFF(1) >= DIFF(0) > 0
DIFF(3) = DIFF(1) + DIFF(2) >= DIFF(2) > 0
Sekali lagi,
DIFF
memiliki 2 istilah positif dan oleh karena itu semua istilah berikutnya adalah positif.Jadi, satu-satunya waktu ketika itu mungkin
DIFF(k) = 0
adalahk = 1
, jadi satu-satunya pilihank0
adalah1
.FIB(a0,b0,1) = n
b0 = n
Ini bertentangan dengan Lemma 2.
sumber
b
bukannya meminimalkana+b
, dan dengan demikian solusi Anda memberif(27) = [3,7]
tetapi solusi optimalf(27)=[0,9]
. Setelah mengembalikan perubahan yang melanggar, kami turun ke 83 byte.b-~a
bukana+b+1
.a2 >= a1 + b1
kapan tidak benark1-k0=1
. Sebagai gantinya Anda dapat menggunakana2 >= b1 > a0
danb2 >= a1+b1 = a0+b0
, dan sisanya mengikuti.Haskell ,
76 7274 byteEDIT:
/
alih-alihdiv
, meskipun ini membutuhkan penggunaan tipe angka pecahan.Enum
rentang dengan menambahkan-1
.f
mengambil nilaiDouble
atauRational
tipe dan mengembalikan tupel yang sama.Double
harus mencukupi untuk semua nilai yang tidak cukup besar untuk menyebabkan kesalahan pembulatan, sementaraRational
secara teoritis tidak terbatas.Cobalah online! (dengan penyesuaian header H.PWiz untuk input / output
Rational
dalam format integer)Bagaimana itu bekerja
?
adalah operator yang bersarang secara lokal dalam lingkupf
.a?b
langkah-langkah rekursif melalui urutan Fibonacci mulai daria,b
sampaib>=n
, kembaliTrue
jika itun
tepat.s
iterates melalui semua angka dari1
atas, mewakili jumlaha
danb
.a
iterates melalui angka dari0
kes/2-1
. (Jikas
ganjil, ujung rentang ditangkap.)a?(s-a)
menguji apakah urutan dimulai dengana,s-a
klikn
. Jika demikian, pemahaman daftar termasuk tuple(a,s-a)
. (Artinyab=s-a
, meskipun terlalu pendek untuk diberi nama.)!!0
memilih elemen pertama (klik) dalam pemahaman.sumber
APL (Dyalog) ,
7571645953484443 byte2 byte disimpan berkat @ Adám
12 byte disimpan berkat @ngn
Cobalah online!
Penggunaan
⎕IO←0
.Bagaimana? Ini benar-benar gila.
k←⎕
- tetapkan input kek
⍳2⍴1+k←⎕
- Produk Cartesian dari kisaran0
untukk
dengan sendirinya|-\¨
- kurangi setiap elemen pasangan kanan dari kiri, dan dapatkan nilai absoluta←,⍉
- transpos, ratakan dan tetapkan kea
o←a/⍨</¨a
- pertahankan hanya pasangan di mana elemen kiri lebih kecil dari kanan, dan tetapkano
o
sekarang berisi daftar semua pasangan dengana < b
, diperintahkan oleh rata-rata aritematis mereka+\∘⌽⍣{k≤⊃⍺}¨o
- untuk setiap pasangan dalamo
, terapkan fibonacci (membalikkan pasangan dan cumsum) sampaik
atau jangka waktu yang lebih tinggi tercapaik∊¨
- lalu tentukan apakahk
ini istilah terakhir (artinya terkandung dalam urutan)o/⍨
- dan simpan pasangan dio
tempat pemeriksaan sebelumnya berlaku⊃
- kembalikan hasil pertama.sumber
Python 2 ,
127109107 byte-2 byte berkat ovs (berubah
and
menjadi*
)Cobalah online!
Ada poin bonus untuk
n,a,s-a
?Penjelasan:
g
, yang memverifikasi apakaha, b
diperluas sebagai urutan Fibonacci akan mencapaix
. Ini juga memeriksa itua <= b
, salah satu kriteria pertanyaan. (Ini akan memungkinkan kasus di manaa == b
, tetapi dalam kasus seperti0, a
itu sudah ditemukan dan dikembalikan).a<=b<x
melakukan dua tugas praktis sekaligus: memverifikasia <= b
, dan itub < x
.b < x
hasilTrue
, fungsi menyebut dirinya lagi dengan dua angka berikutnya dalam urutan Fibonacci:b, a+b
. Ini berarti fungsinya akan terus mengerjakan ketentuan baru sampai ...b < x
hasilFalse
, maka kita telah mencapai titik di mana kita perlu memeriksa apakahb==x
. Jika demikian, ini akan kembaliTrue
, menandakan bahwa pasangan awala, b
pada akhirnya akan mencapaix
. Kalau tidak, jikab > x
, pasangan tidak valid.f
, yang menemukan solusi untuk nilai yang diberikann
. Secara rekursif mencoba pasangan awal baru,a, b
,, hinggag(n, a, b)
hasilTrue
. Solusi ini kemudian dikembalikan.s
(awalnya 1) dana
(awalnya 0). Pada setiap iterasi,a
bertambah, dana, s-a
digunakan sebagai pasangan pertama. Namun, ketikaa
kliks
, itu disetel kembali ke 0, dans
bertambah. Ini berarti pasangan dihitung dalam pola berikut: Jelas, ini mengandung beberapa pasangan yang tidak valid, namun ini dihilangkan secara instan ketika diteruskan keg
(lihat poin pertama).a
dans
ditemukan sedemikian rupag(n, a, s-a) == True
, maka nilai ini dikembalikan. Karena solusi yang mungkin dihitung dalam urutan 'ukuran' (diurutkan berdasarkan rata-rata, kemudian nilai minimum), solusi pertama yang ditemukan akan selalu menjadi yang terkecil, sesuai dengan permintaan tantangan.sumber
R ,
183 byte160 byteCobalah online!
Terima kasih kepada Giuseppe untuk bermain golf 23 byte
Penjelasan kode
sumber
Mathematica, 117 byte
Cobalah online!
sumber
Jelly , 19 byte
Cobalah online!
-1 byte berkat buktinya oleh cardboard_box . Dalam kasus ini terbukti salah, Anda dapat menambahkan
UṂṚ
ke akhir baris kedua untuk total 22 byte.sumber
Ḣ
x
,, muncul terbaru. Jikax
yang ditemukan di indeks ketiga untuk beberapa kemudian bekerja untuk0,x
dan karena itu akan juga bekerja di salah satu1,(x-1)/2
(x
ganjil) atau2,x/2-1
(x
bahkan) dimanax
akan muncul kemudian dalam hasil, sehingga tidak akan terjadi. Untuk tabrakan nanti rata-rata hanya bisa sama jika suku ketiga juga sama, tetapi kemudian seseorang harus memiliki perbedaan yang lebih rendah antara suku awal (kalau tidak mereka akan sama) dan karenanya akanx
ditemukan pada indeks kemudian . Dengan demikian kita dapat melakukanṫ-Sṭµ¡i³¶ḶŒcÇÐṀ
penghematan empat byte.ṫ-Sṭµ¡i³¶‘ḶŒcÇÐṀ
GolfScript -
8877 byteSaya tidak memeriksa beberapa solusi, terima kasih ke cardboard_box!
Penjelasan
sumber
Batch,
160158 bytesumber
3 7
masukan27
. Solusi yang benar adalah0 9
.