Ada pertanyaan terkenal di sini yang meminta generator urutan fibonacci pendek (paling tidak karakter).
Saya ingin tahu apakah seseorang dapat menghasilkan elemen N pertama saja, dari urutan fibonacci, dalam ruang yang sangat singkat. Saya mencoba melakukannya dengan python, tetapi saya tertarik dengan jawaban singkat, dalam bahasa apa pun. Fungsi F (N) menghasilkan elemen N pertama dari urutan, baik mengembalikannya sebagai pengembalian fungsi atau mencetaknya.
Menariknya tampaknya jawaban kode-golf dimulai dengan 1 1 2
, alih-alih 0 1 1 2
. Apakah itu konvensi dalam kode-golf atau pemrograman-secara umum? (Wikipedia mengatakan urutan fibonacci dimulai dengan nol.).
Contoh Python (5 Elemen Pertama):
def f(i,j,n):
if n>0:
print i;
f(j,i+j,n-1)
f(1,1,5)
F_0 = 0, F_1 = 1
atau setaraF_1 = 1, F_2 = 1
. Perbedaannya adalah apakah Anda ingin memulai urutan pada indeks 0 (lebih umum dalam pemrograman) atau 1 (lebih umum dalam matematika).F_0 = 0, F_1 = 1
memiliki manfaat yang pasti dalam kesederhanaan dengan representasi matriks[[1 1][1 0]]^n = [[F_{n+1} F_n][F_n F_{n-1}]]
.Jawaban:
C
Tidak repot menghitung, tapi ini contoh yang menyenangkan:
Buktinya berhasil.
Saya cukup bangga dengan ini: Saya bosan, jadi saya mengatur ulang kode saya (dengan beberapa tambahan kecil) untuk membuatnya di mana setiap baris mewakili nilai dalam urutan Fibonacci.
Buktinya berhasil.
sumber
a++<=b
->a++-b
danreturn--n<3?1:f(n)+f(n-1)
. Plus Anda dapat menghindariscanf
jika Anda memerlukan n berada diargc
.--n
dalam ekspresi yang sama tidak relevan. Cemerlang!4
harus ada3
. Seperti saat ini ditulis dengan<4
, urutan yang dihasilkan adalah 1, 1, 1, 2, 3, 5, 8 ... Itu terlalu banyak 1.return n<3?n>0:f(--n)+f(--n);
Haskell (26)
Anehnya, ini hanya satu karakter lebih panjang dari solusi J.
Saya mencukur beberapa karakter dengan:
take
sebagai operator biner;scanl
bukannya verbosezipWith
.sumber
s
itu sangat elegan, saya tidak tahu bagaimana orang berpikir tentang solusi seperti itu! Apa yang saya tidak tahu adalah bahwa Anda dapat menggunakans
lagi saat mendefinisikans
. (Saya masih pemula =)Ini Python satu-baris. Ini menggunakan floating-point, jadi mungkin ada beberapa
n
yang tidak lagi akurat.F(n)
mengembalikan string yang berisin
angka Fibonacci pertama yang dipisahkan oleh spasi.sumber
GolfScript, 16 karakter
Contoh output:
sumber
Perl, 50 karakter
sumber
Scala 71:
cetakan
sumber
Perl,
2928 bytePenjelasan
Ini didasarkan pada
$b += $a = $b-$a
pengulangan klasik yang berfungsi sebagai berikut:$a
berisiF(n-2)
dan$b
berisiF(n)
$a = $b-$a
$a
berisiF(n-1)
$b += $a
$b
berisiF(n+1)
Masalahnya di sini adalah inisialisasi. Cara klasik hanyalah
$b += $a = $b-$a || 1
urutannya1 2 3 5 ...
Dengan memperluas urutan fibonacci ke kiri:
Anda melihat bahwa titik awal yang tepat adalah
$a = -1
dan$b = 0
. Inisialisasi $ a dapat dikombinasikan dengan mengatur loopAkhirnya ganti
$a
dengan$;
untuk menyingkirkan ruang sebelumfor
sumber
Saya bisa memberi Anda solusi Python dua baris. Ini akan mengembalikan mereka sebagai daftar.
Anda bisa mencetaknya dengan menambahkan peta lain untuk membuatnya menjadi string dan kemudian menambahkan gabungan, tapi itu sepertinya tidak perlu bagi saya.
Sayangnya saya tidak tahu bagaimana memasukkan lambda rekursif
map
, jadi saya terjebak di dua baris.sumber
g(100)
? ;)f(n)
dengann<=0
mengembalikan bilangan bulat, dann>0
mengembalikan daftar, jadi .. mungkin itu tidak ideal:f = lambda n: map(f, (-x for x in range(0, n))) if n > 0 else -n if n > -2 else f(n+1) + f(n+2)
0
dalam jawaban Anda. Mengubahf
untuk kembalin if n < 2
adalah satu solusi. :)Python (78 karakter)
Saya menggunakan rumus Binet untuk menghitung angka fibonacci -
Ini tidak sekecil beberapa jawaban lain di sini, tetapi anak itu cepat
sumber
print"11235"
:)2**i
.**
memiliki prioritas lebih tinggi daripada*
Skema
Ini dioptimalkan menggunakan rekursi ekor:
sumber
Haskell
Bukti bahwa itu berhasil .
sumber
J, 25 karakter
Saya menyadari bahwa solusi J mungkin bukan apa yang Anda cari, tetapi inilah satu. :-)
Pemakaian:
Bagaimana itu bekerja:
Mulai dari kanan (karena program J dibaca dari kanan ke kiri),
2-~ 6
The~
Operator membalikkan argumen untuk kata kerja jadi ini adalah sama dengan6-2
Mengabaikan bagian dalam tanda kurung untuk saat ini,
0 1(...)@[&0~ x
mengambil kata kerja dalam tanda kurung dan mengeksekusix
kali menggunakan daftar0 1
sebagai input -~
lagi membalikkan argumen di sini, memberix (...)@[&0 ] 0 1
, berarti saya dapat menyimpan input di akhir fungsi.Di dalam kurung ada garpu
],+/&(_2&{.)
yang terdiri dari tiga kata kerja -]
,,
dan+/&(_2&{.)
.Garpu mengambil tiga kata kerja
a b c
dan menggunakannya seperti ini: di(x a y) b (x c y)
manax
dany
merupakan argumen ke garpu. The,
adalah kata kerja pusat di garpu ini dan bergabung dengan hasilx ] y
danx +/&(_2&{.) y
bersama-sama.]
mengembalikan argumen kiri tidak diubah sehinggax ] y
dievaluasi menjadix
.+/&(_2&{.)
mengambil dua item terakhir dari daftar yang diberikan(_2&{.)
- dalam hal ini0 1
- dan kemudian menambahkannya bersama-sama+/
(&
hanya bertindak sebagai lem).Setelah kata kerja telah beroperasi begitu hasilnya dimasukkan kembali untuk menjalankan berikutnya, menghasilkan urutan.
sumber
TI-Basic, 43 karakter
Kode ini dapat langsung dimasukkan ke program utama, atau dibuat menjadi program terpisah yang direferensikan oleh yang pertama.
sumber
APL (33)
Pemakaian:
sumber
Python (55)
sumber
Powershell - 35 karakter
Powershell menerima input pipa , jadi saya berkeyakinan bahwa
n |
masukn | <mycode>
tidak boleh bertentangan dengan hitungan saya, tetapi sebaliknya hanya bagian dari memulai "fungsi" dalam bahasa.Solusi pertama mengasumsikan kita mulai dari 0:
Solusi kedua mengasumsikan kita dapat mulai dari 1:
Doa contoh:
5 | %{for($2=1;$_--){($1=($2+=$1)-$1)}}
Hasil:
Menariknya, upaya untuk menghindari overhead dari
for()
lingkaran mengakibatkan jumlah karakter yang sama:%{$2=1;iex('($1=($2+=$1)-$1);'*$_)}
.sumber
Python, 43 karakter
Berikut adalah tiga liner yang berbeda secara fundamental yang tidak menggunakan formula Binet.
Saya tidak pernah disalahgunakan dengan
reduce
begitu buruk.sumber
reduce
melanggardc, 32 karakter:
Ini sebenarnya akan selalu menunjukkan dua yang pertama, jadi fungsi hanya berfungsi seperti yang diharapkan untuk N> = 2 .
C, 75 karakter:
Tidak sekeren jawaban yang diterima, tetapi lebih pendek dan lebih cepat:
Tambahan:CL, 64 karakter:
Salah satu bookmark saya yang paling sering digunakan semester ini memiliki contoh menarik yang lebih pendek daripada
banyakyang lain di sini, dan itu hanya permohonan langsung dariloop
makro - pada dasarnya hanya satu pernyataan! Melucuti itu untuk semua spasi putih yang saya bisa:Cukup singkat, dan menyenangkan serta mudah dibaca! Untuk membaca input,
n
(termasuk spasi putih di sekitarnya) dapat diganti dengan(read)
, menambahkan 3 karakter.sumber
main
perlu empat argumen?SALAH, 28 byte
sumber
1_
daripada0 1 -
Python 2, 38 Bytes
Peningkatan pada solusi yang diposting sebelumnya:
Ini menggunakan
exec
dan menggandakan string untuk menghindari loop.Python 3, 46 Bytes
Tidak cukup efisien dalam Python 3:
sumber
C99, 58 karakter
Fungsi berikut mengisi array bilangan bulat dengan nilai pertama
n
dari deret Fibonacci yang dimulai dengan 0.Uji harness, dengan
n
argumen argumen perintah:sumber
CoffeeScript, 48
65 dalam js:
sumber
PHP, 87
Penggunaan
array_sum
dan fungsi rekursif untuk menghasilkan seri.Misalnya:
sumber
F #, 123
sumber
Scala, 65 karakter
Ini mencetak, misalnya, 9 angka Fibonacci pertama. Untuk versi yang lebih bisa digunakan mengambil panjang urutan dari input konsol, diperlukan 70 karakter:
Waspadai penggunaan Range yang membatasi ini hingga nilai Int.
sumber
Q 24
Pertama dan nomor fibonacci
sumber
Lua, 85 byte
Saya belajar Lua jadi saya ingin menambahkan bahasa ini ke kolam.
dan semuanya mengambil 85 karakter, dengan parameter sebagai argumen baris perintah. Poin bagus lainnya adalah mudah dibaca.
sumber
SALAH, 20 karakter
Masukan harus ada di tumpukan sebelum menjalankan ini.
sumber
Pyt , 3 byte
Cobalah online!
sumber
kode mesin x86 - 379 byte
Versi dengan header ELF yang mencetak 484 byte:
Versi tanpa judul (yang harus dinilai):
sumber