Anda mungkin pernah mendengar angka Fibonacci. Ya tahu, urutan integer yang dimulai dengan 1, 1
, dan kemudian setiap nomor baru adalah jumlah dari dua yang terakhir?
1 1 2 3 5 8 13...
Dan seterusnya. Tantangan tentang angka Fibonacci cukup populer di sini . Tetapi siapa yang mengatakan bahwa angka-angka Fibonacci harus dimulai dengan 1, 1
? Mengapa mereka tidak bisa memulainya 0, 1
? Baiklah, mari kita mendefinisikan kembali mereka mulai dari 0:
0 1 1 2 3 5 8 13...
Tapi ... Kita juga tidak harus berhenti di situ! Jika kita dapat menambahkan dua angka terakhir untuk mendapatkan yang berikutnya, kita juga bisa mengurangi angka pertama dari angka kedua untuk menambahkan angka baru. Jadi itu bisa dimulai dengan 1, 0
:
1 0 1 1 2 3 5 8 13...
Kita bahkan dapat berakhir dengan negatif:
-1 1 0 1 1 2 3 5 8 13...
Dan seri ini juga berlangsung selamanya. Saya pikir itu menarik bagaimana akhirnya agak mencerminkan angka-angka Fibonacci biasa, hanya dengan setiap angka lainnya dibuat negatif:
13 -8 5 -3 2 -1 1 0 1 1 2 3 5 8 13...
Sebut seri ini "Nomor Fibonacci Diperpanjang", atau EFN . Karena sebenarnya tidak ada angka negatif yang jelas untuk memulai seri ini, kita akan mengatakan bahwa 0 muncul pada 0 , angka Fibonacci reguler meluas ke indeks positif, dan angka Fibonacci negatif (setengah negatif?) ke indeks negatif, seperti:
Indices: ...-7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 ...
Values: ...13 -8 5 -3 2 -1 1 0 1 1 2 3 5 8 13...
Ini mengarah ke tantangan hari ini:
Dengan bilangan bulat N , kembalikan setiap indeks tempat N muncul dalam seri EFN .
Beberapa pengamatan acak pada tugas ini:
1 muncul lebih kali dalam EFN dari nomor lain:
[-1, 1, 2]
. Tidak ada nomor akan muncul di lebih dari 3 tempat.Setiap angka Fibonacci> 1 akan muncul sekali (3, 8, 21, dll.) Atau dua kali (2, 5, 13, dll.)
Klarifikasi Peraturan:
- Jika
abs(N)
bukan angka Fibonacci, itu tidak akan pernah muncul di seri EFN , jadi Anda harus mengeluarkan apa-apa / koleksi kosong jika memungkinkan, atau jika itu tidak mungkin dalam bahasa Anda, Anda dapat menampilkan beberapa nilai non-numerik yang konstan. - Jika N muncul di banyak tempat di EFN , output Anda tidak perlu disortir. Meskipun setiap indeks harus muncul tepat satu kali.
- Meskipun sebagian besar tantangan urutan memungkinkan Anda untuk memilih apakah Anda ingin menggunakan pengindeksan berbasis 1 atau 0, tantangan ini harus menggunakan pengindeksan yang dijelaskan (di mana 0 muncul pada 0).
- Anda dapat mengambil I / O melalui format standar apa pun.
Uji Kasus
-13: []
-12: []
-11: []
-10: []
-9: []
-8: [-6]
-7: []
-6: []
-5: []
-4: []
-3: [-4]
-2: []
-1: [-2]
0: 0
1: [-1, 1, 2]
2: [-3, 3]
3: [4]
4: []
5: [-5, 5]
6: []
7: []
8: [6]
9: []
10: []
11: []
12: []
13: [-7, 7]
Dan beberapa test case yang lebih besar:
89: [-11, 11]
1836311903: [46]
10000: []
-39088169: [-38]
Seperti biasa, jawaban terpendek dalam byte menang!
Jawaban:
Haskell , 78 byte
4 byte disimpan berkat nimi
Cobalah online!
Pertama-tama kita mengatur
(#)
,(#)
mengambil dua parameter,a
danb
, dan mengembalikan daftar yang dimulai dengana
dan diikuti olehb#(a-b)
. Ini membuat daftar yang tidak terbatas, tetapi karena Haskell malas, kita tidak perlu khawatir tentang hal itu berulang selamanya. Ini pada dasarnya bekerja mundur menciptakan urutan Fibonacci sebelum pasangan tertentu. Misalnya(0#1)
akan menjadi daftar semua angka Fibonacci dengan indeks negatif.Dari sini kita buat
f
.f
mengambil argumena
yang merupakan nomor yang kami coba temukan dalam urutan. Di sini kita menggunakando
notasi untuk melakukan pemahaman daftar. Kami mulai dengan mengambila*a+1
elemen pertama dari daftar0#1
1 . Karena fungsia*a+1
tumbuh lebih cepat daripada kebalikan dari deret Fibonacci kita dapat yakin bahwa jika kita memeriksa dalam batas ini kita akan menemukan semua hasil. Ini mencegah kita mencari daftar yang tidak terbatas. Kemudian untuk setiap nilaix
dan indeksi
, jikax==a
kami menemukana
dalam setengah negatif dari urutan maka kami kembali-i
, dan jikaabs x==a
kami kembalii
juga karena nilai absolut dari setengah negatif adalah setengah positif sehingga kami menemukannya di sana.Karena ini membuat daftar
[0,0]
untuk0
kita hardcode output yang benar untuk yang itu.1: Trik ini diambil dari jawaban bersih Οurous ' . Speedup yang sama berlaku di sini seperti di sana, ganti
a*a+1
denganabs a+1
untuk menghemat banyak waktu.sumber
u
dengana#b=a:b#(a-b)
plus0#1
menghemat satu byte: Cobalah secara online!Bersih ,
132120109 byteCobalah online!
g :: Int -> Int
adalah fungsi Fibonacci.? :: Int -> [Int]
hanya indeks ke dalam unsur-unsur dari EFN dalamk^2+1
dari0
.Untuk versi yang berjalan dalam jumlah waktu yang waras, ubah
k*k+1
menjadiabs k+1
.sumber
Jelly , 11 byte
Cobalah online!
sumber
JavaScript (ES6),
9493 byteCobalah online!
sumber
APL (Dyalog Classic) ,
5250 byteMembutuhkan
⎕IO←0
Cobalah online!
sumber
Retina 0.8.2 ,
104102 byteCobalah online! Penjelasan:
Konversi ke unary, kecuali inputnya nol.
Hitung indeks Fibonacci dari nilai absolut, tetapi jika angka tersebut bukan angka Fibonacci maka hapus saja, kecuali jika itu nol. Ini menggunakan regex Fibonacci-testing @ MartinEnder.
Hapus angka negatif yang nilai absolutnya adalah angka Fibonacci aneh.
Tambahkan indeks negatif untuk angka Fibonacci positif ganjil.
Konversikan ke desimal.
Tambahkan indeks ekstra untuk
1
.sumber
Sebenarnya , 34 byte
Brute-force menyelamatkan hari
Penjelasan:
Cobalah online!
sumber
Python 3 , 92 byte
Cobalah online!
Mengembalikan satu set indeks.
sumber
Python 2 ,
8785 byteCobalah online!
sumber
05AB1E , 36 byte
Harus ada pendekatan yang lebih baik ..>.> Ada enam (atau tujuh jika kita memasukkan
0
) skenario berbeda untuk tantangan ini, dan itu membunuhku ..Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
Beberapa contoh langkah demi langkah:
sumber
Python 2 ,
959294 byteCobalah online!
sumber
C # (Visual C # Interactive Compiler) , 144 byte
Cobalah online!
sumber