The Fibonacci urutan adalah urutan baik tahu di mana setiap entri adalah jumlah dari dua sebelumnya dan dua entri pertama adalah 1. Jika kita mengambil modulo setiap istilah dengan konstan urutan akan menjadi periodik. Sebagai contoh jika kita memutuskan untuk menghitung urutan mod 7 kita akan mendapatkan yang berikut:
1 1 2 3 5 1 6 0 6 6 5 4 2 6 1 0 1 1 ...
Ini memiliki periode 16. Urutan terkait, yang disebut urutan Pisano , didefinisikan sedemikian rupa sehingga a(n)
merupakan periode urutan fibonacci ketika dihitung modulo n.
Tugas
Anda harus menulis sebuah program atau fungsi yang ketika diberikan n
akan menghitung dan mengeluarkan periode mod urutan Fibonacci n
. Itu adalah istilah ke-n dalam urutan Pisano.
Anda hanya harus mendukung bilangan bulat pada rentang tersebut 0 < n < 2^30
Ini adalah kompetisi kode-golf sehingga Anda harus berusaha meminimalkan ukuran kode sumber Anda karena dinilai oleh byte.
Uji kasus
1 -> 1
2 -> 3
3 -> 8
4 -> 6
5 -> 20
6 -> 24
7 -> 16
8 -> 12
9 -> 24
10 -> 60
11 -> 10
12 -> 24
f(i),f(i+1)
dapat mengambil paling banyakn^2
nilai modn
. Dengan demikian,n
terbatas pada akhirnya2^30
dapat menghasilkan periode hingga2^60
. Membatasin <= 2^16
akan memberiP(n) <= 2^32
.f(i+2) = f(i+1)+f(i)
, sehingga 'keadaan' dari perulangan mesin selama periode tersebut dapat dijelaskan dengan sepasang integer modn
. Ada paling banyakn^2
negara bagian, jadi periode paling banyakn^2
. Oh! Wikipedia mengklaim bahwa periode tersebut paling banyak6n
. Nevermind my triviality.Jawaban:
GolfScript (
28 25 2423 karakter)Mengambil input di stdin, membiarkannya di stdout (atau stack, jika Anda ingin memprosesnya lebih lanjut ...)
Ini dengan benar menangani kasing sudut ( Demo ).
Sebagai hal yang menarik bagi programmer GolfScript, saya pikir ini adalah program pertama yang saya tulis dengan lipatan yang sebenarnya lebih pendek daripada pendekatan lain yang saya coba.
sumber
GolfScript, 24 karakter
Iterasi selanjutnya dari implementasi GolfScript. Versi kedua sekarang juga menangani 1 dengan benar. Itu menjadi cukup lama tetapi mungkin seseorang dapat menemukan cara untuk mempersingkat versi ini. Anda dapat mencoba versi di atas secara online .
sumber
1
dengan benar?1
- dan masih hanya 24 karakter.Python,
1881321019587 karakterPemakaian
Sebagai contoh:
sumber
cat
tingwc -c
dan saya mendapatkan nomor yang sama.if k>0 and s[0:k]==s[k:]:break
dapat diubah menjadiif s and s[:k]==s[k:]:break
. Anda juga dapat mengurangi secara signifikan dengan menghapus iterator, mengubahfor
loopwhile 1:
, dan melakukana,b=a,a+b
di akhir loop while.Python
908596949082Sunting: Saran yang diterapkan oleh beary dan primo
sumber
a.append(c) -> a+=[c]
((n>1)>>(c in a)) -> (n>1)>>(c in a)
append
sebenarnya memiliki fungsi yang berbeda dari+=
. Terima kasih atas tipsnya.(n>1)>>(c in a)
->
(c in a)<1%n
selama 3 byte. Dan saya setuju dengan beary tentang append. Apakah Anda menambahkan referensi kec
, atau memperluasa
dengan nilaic
, itu persis sama dengan cara yang sama (karena Anda segera menghancurkan referensi Andac
juga).a+=c
bukannyaa+=[c]
Mathematica 73
sumber
PHP -
6157 byteScript ini keliru akan melaporkan
2
untukn=1
, tetapi semua nilai-nilai lain yang benar.Sampel I / O, seri terpotong kiri di mana π (n) = 2n + 2:
sumber
1<$a.$b=+$a+$a=!$i+++$b%$n+=fgets(STDIN)
Ya Tuhan, itu adalah urutan eksploitasi operasi di sana.PowerShell: 98
Kode golf:
Tidak disatukan, dengan komentar:
Catatan:
Saya tidak yakin persis apa batas maksimum yang dapat diandalkan untuk $ n dengan skrip ini. Kemungkinannya kurang dari 2 ^ 30, karena $ x mungkin bisa meluap int32 sebelum $ n sampai di sana. Selain itu, saya sendiri belum menguji batas atas karena waktu berjalan untuk skrip sudah mencapai sekitar 30 detik pada sistem saya untuk $ n = 1e7 (yang hanya sedikit lebih dari 2 ^ 23). Untuk alasan yang sama, saya tidak cenderung untuk menguji dan memecahkan masalah sintaks tambahan apa pun yang mungkin diperlukan untuk memutakhirkan variabel ke uint32, int64, atau uint64 jika diperlukan untuk memperluas jangkauan skrip ini.
Output sampel:
Saya membungkus ini di lain untuk loop:
Kemudian atur
$n=$i
alih-alih=read-host
, dan ubah output"$i | $x"
untuk mendapatkan gagasan tentang keandalan umum skrip. Berikut beberapa hasilnya:...
Sidenote:
Saya tidak begitu yakin bagaimana beberapa Periode Pisano secara signifikan lebih pendek dari $ n. Apakah ini normal, atau ada yang salah dengan skrip saya?Nevermind - Saya baru ingat bahwa, setelah 5, angka-angka Fibonacci dengan cepat menjadi jauh lebih besar daripada tempat mereka dalam urutan. Jadi, ini masuk akal sekarang.sumber
Perl,
75,61, 62 + 1 = 63Pemakaian
Tidak disatukan
+1 byte untuk
-n
bendera. Mencukur 13 byte berkat Gabriel Benamy.sumber
$n=<>;
(-6) dan menggantinya dengan-n
flag (+1), lalu semua instance$n
dapat diganti dengan$_
. Anda dapat menggunakan-M5.010
secara gratis, yang memungkinkan Anda menggunakansay
perintah alih-alihprint
(-2).while
Pernyataan pengubah tidak perlu tanda kurung di sekitar kondisi (-2). Alih-alih@{[%h]}/2
, Anda dapat memiliki penghitung$a++,
sebelum($m,$k)=
dan kemudian hanya memilikisay$a-1
di akhir (-2). Alih-alih"$m,$k"
menggunakan$m.$k
(-2). Ini harus keluar$k=1%$_;$a++,($m,$k)=($k,($m+$k)%$_)while!$h{$m.$k}++;say$a-1
dengan-n
bendera, untuk 61 + 1 = 62 byte."$m,$k"
bukan$m.$k
, (2), tetapi Anda dapat menyimpan 1 byte dengan mengubahwhile!$h
keuntil$h
(-1). Maaf!$m.$k
gagal? Tampaknya berhasil di pihak saya.Clojure, 102 byte
Tidak terlalu mengasyikkan, mengulang formula sampai kita mencapai kembali
[1 1]
(saya harap ini selalu terjadi). Penanganan khusus(f 1)
saat menyatu[0 0]
.sumber