Jika kita mendefinisikan Fibonacci seperti urutan sebagai f k (n) = (f k (n-1) + f k (n-2))% k , untuk suatu bilangan bulat k (di mana % adalah operator Modulo), urutan akan selalu siklik, karena hanya ada k 2 nilai yang berbeda untuk ( fk (n-1), fk (n-2)) . Namun, siklus ini biasanya tidak termasuk semua pasangan yang mungkin dari nilai-nilai, jadi tergantung pada dua nilai mulai f k (0) dan f k (1) , kita mungkin mendapatkan siklus yang berbeda. Misalnya, untuk k = 2, kami memiliki empat kemungkinan berikut, tergantung pada dua nilai pertama:
0, 0, 0, 0, 0, 0, 0, 0, 0, ...
0, 1, 1, 0, 1, 1, 0, 1, 1, ...
1, 0, 1, 1, 0, 1, 1, 0, 1, ...
1, 1, 0, 1, 1, 0, 1, 1, 0, ...
Karena sifat siklik dari urutan, sebenarnya hanya ada dua urutan yang berbeda secara fundamental di sini, dengan orbit (0) dan (0, 1, 1) . Mari kita lihat k = 3 :
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, ...
0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, ...
1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, ...
1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, ...
1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, ...
2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, ...
2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, ...
2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, ...
Sekali lagi, hanya ada dua orbit yang berbeda: (0) dan (0, 1, 1, 2, 0, 2, 2, 1) .
Untuk k yang lebih tinggi kita mungkin mendapatkan lebih banyak orbit, tetapi mereka masih akan jatuh ke dalam sejumlah kecil kelas yang sebanding. Misalnya k = 4 menghasilkan empat orbit (0) , (0,1,1,2,3,1) , (0, 2, 2) , (0, 3, 3, 2, 1, 3) dan k = 5 tiga orbit (0) , (0, 1, 1, 2, 3, 0, 3, 3, 1, 4, 0, 4, 4, 3, 2, 0, 2, 2, 2, 4, 1) dan (1, 3, 4, 2) .
Tugas Anda dalam tantangan ini adalah untuk menghitung berapa banyak orbit yang dihasilkan oleh urutan untuk k . Ini adalah OEIS A015134 . Berikut adalah 100 nilai pertama (mulai dari k = 1 ):
1, 2, 2, 4, 3, 4, 4, 8, 5, 6, 14, 10, 7, 8, 12, 16, 9, 16, 22, 16,
29, 28, 12, 30, 13, 14, 14, 22, 63, 24, 34, 32, 39, 34, 30, 58, 19,
86, 32, 52, 43, 58, 22, 78, 39, 46, 70, 102, 25, 26, 42, 40, 27, 52,
160, 74, 63, 126, 62, 70, 63, 134, 104, 64, 57, 78, 34, 132, 101, 60,
74, 222, 37, 38, 62, 328, 89, 64, 82, 124, 41, 86, 42, 172, 75, 44,
184, 178, 181, 132, 82, 180, 99, 140, 104, 246, 49, 50, 114, 76
Pastikan untuk memeriksa k = 11 , yang merupakan input pertama yang menghasilkan lebih dari k orbit.
Aturan
Anda diberi bilangan bulat positif k dan harus menampilkan A015134 (k) .
Anda dapat menulis program atau fungsi dan menggunakan salah satu metode standar untuk menerima input dan memberikan output.
Anda dapat menggunakan bahasa pemrograman apa pun , tetapi perhatikan bahwa celah ini dilarang secara default.
Ini adalah kode-golf , sehingga jawaban terpendek yang valid - diukur dalam byte - menang.
sumber
Jawaban:
Sekam ,
1716 byteCobalah online!
Penjelasan
sumber
Bash,
172,119,113, 91 byteCobalah online
sumber
Bahasa Wolfram (Mathematica) ,
7670 byteCobalah online!
Bagaimana itu bekerja
Kami membuat grafik yang diberikan oleh aturan
{{0,0}->{0,0}, {1,0}->{1,1}, ...}
yang, mengingat dua elemen dari urutan Fibonacci umum, temukan modulo berikutnyan
. TheEdgeCycleMatrix
memberi matriks kejadian dari siklus ke tepi dalam grafik ini; kami ingin menghitung barisnya.(Ada sejumlah built-in yang melakukan tugas serupa, tetapi
ConnectedComponents
lebih lama, danFindCycle
membutuhkan banyak input tambahan untuk membuatnya bekerja. Selain itu,EdgeCycleMatrix
adalah array persegi panjang, tidak berbentuk lucu seperti dua lainnya, yang membantu nanti. )Untuk menghitung baris matriks, kita mengambil faktorial dari entri untuk mengubahnya menjadi matriks semua yang ada, lalu mengambil jejaknya. (Setiap siklus mengandung setidaknya satu sisi dan oleh karena itu ada setidaknya kolom sebanyak baris - jadi ini menghitung baris dan bukan kolom.)
sumber
MATL ,
3836 byteCobalah online! Ini habis dalam kompiler online untuk input melebihi
7
.Penjelasan
Kode mendefinisikan orbit dalam bilangan kompleks, di mana bagian imajiner adalah istilah baru dan bagian nyata adalah istilah sebelumnya dalam urutan Fibonacci. Setiap nilai kompleks mengkodekan status urutan. Yaitu, mengingat
a+jb
nilai selanjutnya dihitung sebagaib+j(a+b)
.Nilai awal yang mungkin adalah
a+jb
dengana
,b
di[0, 1, ..., k-1]
. Untuk setiap nilai awal, kode ini berulangk^2
kali. Sebenarnya, untuk membuat kode lebih pendek, setiap iterasi diterapkan semua nilai yang terakumulasi sejauh ini, dan hasilnya didupuplikasi (yang akan diperlukan pada akhirnya). Setelah iterasi terakhir, vektor dari nilai kompleks yang didupuplikasi diurutkan (berdasarkan nilai absolut, kemudian dengan sudut). Ini memberikan "tanda tangan" untuk setiap orbit.Di akhir program, tanda tangan dikumpulkan ke dalam array sel. Jumlah tanda tangan unik adalah output yang diinginkan.
sumber
Haskell ,
196191 byteCobalah online!
Ini mungkin bisa diperbaiki. Terutama jika seseorang dapat menemukan cara untuk menghindari
isInfixOf
dan menghapus impor.Ide dasarnya adalah membuat daftar "keadaan" (tupel yang berisi dua nilai sebelumnya) untuk melihat kapan mulai berputar. Kemudian kami memeriksa apakah setiap orbit berbeda dengan pendahulunya (benar-benar bekerja sebaliknya tetapi sulit untuk dikatakan). Untuk memeriksa apakah orbitnya sama, kami memeriksa apakah panjangnya sama dan apakah yang satu cocok dengan yang lain. Sebagai contoh
[0,2,2]
,[2,2,0]
: panjang baik adalah 3 dan[0,2,2,0,2,2]
mengandung[2,2,0]
sebagai subsequence terus menerus. Saya tidak yakin apakah itu sangat mudah tetapi tampaknya berhasil.EDIT: terima kasih kepada Laikoni untuk melepas 5 byte! Saya harus membaca lebih banyak tips itu.
sumber
length
. Byte lain dapat disimpan!
dengan|r<-p++[a]=r!b
.JavaScript (ES6),
337335 byteMaaf untuk algoritma brute-force Ω (k ^ 3).
Kinerja ...
Ketika saya menghitung A015134 (sesuatu di luar k = 50) melebihi 60an pada TIO.Penjelasan (Tidak Disatukan)
sumber
Perl 5, 80 + 1 (-p) byte
Cobalah online
sumber
Jelly , 17 byte
Cobalah online!
sumber
JavaScript (ES6), 102 byte
Mengembalikan fungsi yang mengembalikan hasilnya. Untuk 3 byte lebih, kita dapat mengembalikan hasilnya secara langsung:
Keduanya memiliki kompleksitas waktu O (n 2 ).
sumber
Python 2 , 214 byte
Cobalah online!
Ini tidak terlalu efisien tetapi golf yang bisa saya lakukan.
sumber