Tantangan
Anda harus menulis sebuah program yang mengambil bilangan bulat positif n
sebagai input, dan mengeluarkan angka n
Fibonacci th (disingkat Fib # seluruh) yang berisi n
Fib # sebagai subtring. Untuk tujuan tantangan ini, urutan Fibonacci dimulai dengan a 1
.
Berikut adalah beberapa contoh yang dapat Anda gunakan sebagai kasus uji, atau sebagai contoh untuk mengklarifikasi tantangan (untuk yang terakhir, silakan tinggalkan komentar di bawah ini untuk menjelaskan apa yang Anda temukan tidak jelas).
n=1
Fib#s: 1
^1 1st Fib# that contains a 1 (1st Fib#)
Output: 1
n=2
Fib#s: 1, 1
^1 ^2 2nd Fib# that contains a 1 (2nd Fib#)
Output: 1
n=3
Fib#s: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233
^1 ^2 ^3 3rd Fib# that contains a 2 (3rd Fib#)
Output: 233
n=4
Output: 233
n=5
Output: 6765
n=6
Output: 28657
n=7
Output: 1304969544928657
n=8
Output: 14472334024676221
n=9
Output: 23416728348467685
n=10
Fib#s: 1, ..., 34, 55, 89, ..., 63245986, 102334155, 165580141, ..., 2880067194370816120, 4660046610375530309
^1 ^2 ^3 ^10 10th Fib# that contains a 55 (10th Fib#)
Output: 4660046610375530309
Seperti biasa, ini adalah kode-golf , jadi lakukan penghitungan byte terendah yang dimungkinkan.
Jika ada sesuatu yang membingungkan / tidak jelas, silakan tinggalkan komentar.
(Tantangan ini didasarkan pada tantangan lain yang saya posting: Cetak nth prime yang berisi n )
n=5
testcase, karena saya baru saja membuat kesalahan konyol di mana saya menulis cek yang menghitung beberapa kali jika memiliki substring lebih dari satu kali.n=5
akan menangkap itu karena55
.n=25
(output memiliki 1186 digit), kemudian terbunuh untukn=26
(3085 digit dikompilasi di laptop saya sendiri). Tampaknya ada lompatan dalam kesulitan setiap kalifib(n)
mendapat satu digit lagi (seperti yang diharapkan). Lompatan berikutnya, 31, memiliki 12990 digit pada hasil akhir.Jawaban:
Haskell ,
8584 byteEDIT:
l
.x>=s
forx<=s
) dalam penjelasan.f
mengambilInt
dan mengembalikan aString
.Cobalah online!
Bagaimana itu bekerja
l
adalah daftar angka Fibonacci yang tidak terbatas, didefinisikan secara rekursif sebagai jumlah parsial dari0:1:l
. Dimulai dengan0
karena daftar diindeks 0.m
adalah daftar yang sama dikonversi ke string.f
:n
adalah nomor input, danx
merupakan (string dari)n
nomor Fibonacci.y
adalah angka Fibonacci yang diuji apakah mengandungx
sebagai substring. Passingy
dikumpulkan dalam daftar dan diindeks dengan final!!n
untuk memberikan output. Ekstrax
ditambahkan ke tes untuk menghemat dua byte dari penggunaan!!(n-1)
di akhir.y
beberapa kali, tes masingy
- masing dibungkusor
dan pemahaman daftar lainnya.s
iterates melalui akhirany
.x
merupakan awalan daris
, kami memeriksa apakahx<=s
danx++":">s
. (":"
Agak sewenang-wenang tetapi harus lebih besar dari angka apa pun.)sumber
l=0:scanl(+)1l
menghemat satu byte.Jelly ,
1514 byteTerima kasih 1 byte untuk Jonathan Allan.
Cobalah online!
sumber
Python 2 ,
9986 byteb=i=x=-1 a=1
dan menjatuhkanx and
f and n==2
kef*(n>2)
a,b=a+b,a
singkatan swap ekonomif-=str(x)in str(a)
, diperas(n<2)*f
Cobalah online!
Penjelasan:
Python 3 ,
12612011311211010199 byteCobalah online!
sumber
b=i=x=-1
a=1
dan menjatuhkannyax and
. (Intinya mulai 3 langkah sebelumnya dalam urutan Fibonacci dua sisi -1, 1, 0, 1, 1, 2, ....)-1
: Pn==2
benar-benar membutuhkan perawatan khusus. Tapi itu bisa disingkat*(n>2)
.Java,
118111 byteSaya terus berpikir seharusnya tidak boleh menggandakan bit Fibonacci, tetapi semua usaha saya entah bagaimana menghasilkan lebih banyak byte.
Terima kasih kepada Kevin untuk peningkatan ... tebak ini menunjukkan ini adalah usaha pertama saya bermain golf :)
sumber
i->{long n=i,p=0,q,c=1;while(--n>0){q=p;p=c;c+=q;}n=c;while(i>0){if((""+c).contains(""+n))--i;q=p;p=c;c+=q;}return p;}
(118 byte)while(--n>0){q=p;p=c;c+=q;}
bisafor(;--n>0;p=c,c+=q)q=p;
dann=c;while(i>0){if((""+c).contains(""+n))--i;q=p;p=c;c+=q;}
bisafor(n=c;i>0;q=p,p=c,c+=q)if((""+c).contains(""+n))--i;
. (Total:i->{long n=i,p=0,q,c=1;for(;--n>0;p=c,c+=q)q=p;for(n=c;i>0;q=p,p=c,c+=q)if((""+c).contains(""+n))--i;return p;}
( 111 bytes )Perl 6 , 45 byte
$_
adalah argumen untuk fungsi;@f
adalah deret Fibonacci, yang dihasilkan dengan malas.sumber
JavaScript (ES6),
9693929086 byteDiindeks 0, dengan nomor 0 dalam urutan sedang
1
. Omong kosong di14
.26 byte disimpan berkat ArnauldCobalah
Penjelasan
Versi terbaru untuk diikuti, ketika saya mendapatkan satu menit.
sumber
Arang , 65 byte
Cobalah online! Tautan ke kode verbose untuk penjelasan.
sumber
PHP , 96 byte
Cobalah online!
sumber
Mathematica, 85 byte
memasukkan
-4 byte dari @JungHwan Min
keluaran
sumber
f@i@n++
benar-benar valid, berkurang 1 byte. MenggunakanFor
bukannyaWhile
mengurangi 3 byte. 85 byte:(i=ToString;f=Fibonacci;For[n=t=0,t<#,If[i@f@n++~StringContainsQ~i@f@#,t++]];f[n-1])&
R,
7772 byteIni memanfaatkan
gmp
perpustakaan untuk angka Fibonacci. Implementasi pertanyaan foward cukup lurus.Beberapa tes
sumber
Clojure, 99 byte
Solusi dasar, menggunakan urutan angka Fibonacci yang tak terbatas
s
.sumber
C #, 35 byte
Cobalah
sumber
n
dan Anda baru saja memasukkan outputb
(saya pikir). Anda bisa menulis yang mengambiln
sebagai argumen dan mengembalikanb
... Juga, saya cukup yakin Anda tidak menghitung apa yang diminta tantangan. Sebenarnya, saya tidak tahu apa yang Anda komputasi. Bisakah Anda menyediakan penggunaan dengan beberapa kode yang dapat kami jalankan untuk memverifikasi solusi Anda? ("Coba" tidak dapat dijalankan seperti ...)NewStack , 14 byte
Rinciannya:
Dalam bahasa Inggris: (dengan contoh input 3)
N∞
: Buat daftar bilangan asli[1,2,3,4,5,6...]
ḟᵢ
: Simpan input dalam variabelf
[1,2,3,4,5,6...]
fi
: Konversikan daftar ke angka Fibonacci[1,1,2,3,5,8...]
'fif
: Simpan semua elemen yang mengandungf
angka Fibonacci[2,21,233...]
Ṗf⁻
: Cetakf-1
elemen ke-1 (-1 karena pengindeksan berbasis 0)233
sumber
Japt ,
1615 byteCobalah
sumber