Sebuah Quine adalah program yang output sumbernya ketika dijalankan.
Dalam tantangan ini, Anda harus membuat Fibonacci-quine, varian dari quine.
Apa itu Fibonacci-quine?
Fibonacci-quine adalah program, yang menghasilkan modifikasi sumber dengan aturan berikut:
Sumber awal seharusnya ...2...
. Dengan kata lain, sumbernya harus mengandung 2
. (Kenapa 2? Kalau 1, tidak ada yang tahu kalau itu 1 atau yang kedua, Bahkan program itu sendiri)
Saat dijalankan, Anda harus menampilkan sumber, tetapi hanya nomor tertentu (Pada tahap ini, 2
) berubah menjadi nomor berikutnya dari urutan fibonacci. Sebagai contoh ...3...
,. Hal yang sama berlaku untuk output, dan output dari output, dll. Anda dapat mendukung bilangan bulat hingga 2 ^ 32-1. Untuk bilangan bulat melebihi batas itu, output berikutnya ada pada pilihan Anda.
Catatan OP
Saya benar-benar ingin melihat solusi kreatif untuk ini. Saya tidak bisa memikirkan solusi tunggal untuk ini, karena Kedua aspek penting dari tantangan, fibonacci dan quine, tidak mudah. Saya akan menunggu!
Jawaban:
Mathematica, 61 byte
Perhatikan bahwa ada spasi tambahan. Ini adalah quine fungsi, yaitu kode di atas mengevaluasi ke fungsi yang tidak disebutkan namanya yang, jika dipanggil mengembalikan kode itu sendiri sebagai string (dengan
2
diubah ke nomor Fibonacci berikutnya).Ini ternyata sulit untuk mulai bekerja. Ide dasarnya adalah untuk mengambil fungsi itu sendiri (dengan
#0
) dan mengganti angka dalam fungsi itu dengan yang berikutnya menggunakan/. v:2 :> nextFib[v]
. Namun,nextFib
tidak akan dievaluasi pada tahap ini sehingga kami tidak akan benar-benar berakhir dengan nomor baru dalam kode sumber. Setelah mencari-cari sebentar untuk mencari tahu bagaimana memaksa evaluasi segera, saya menemukan posting hebat ini di Mathematica.SE . Teknik "standar" menggunakanWith
blok yang memaksa evaluasi, tetapi jawaban kedua oleh WReach berisi alternatif yang lebih pendek menggunakan built-in tidak berdokumenRuleCondition
yang juga memaksa evaluasi.Cara kita menghitung angka Fibonacci berikutnya adalah dengan memanfaatkan fakta bahwa rasio angka berurutan kira-kira adalah rasio emas 1,618 ... dan ini akurat hingga pembulatan. Jadi kita tidak perlu melacak dua angka terakhir dan cukup melakukannya
Round[GoldenRatio v]
. Ini tidak akan pernah kehilangan ketelitian karena MathematicaGoldenRation
adalah nilai simbolis dan karenanyaRound
selalu dapat menghitung hasil yang akurat.Singkatnya:
Fungsi yang tidak disebutkan namanya, di mana
#0
merujuk ke objek fungsi itu sendiri.Temukan
2
di pohon ekspresi fungsi (ini2
tentu saja hanya cocok dengan dirinya sendiri), panggilv
dan ganti dengan ...... nomor Fibonacci berikutnya.
Dan konversi pohon ekspresi yang dihasilkan ke representasi stringnya.
sumber
CJam , 26 byte
Cobalah online!
Mungkin tidak cukup optimal. Kami hanya mengulangi deret Fibonacci hingga nilainya lebih besar dari yang terakhir dan menggunakan hasilnya sebagai nilai baru di awal program.
sumber
Python 3 , 95 byte
Cobalah online!
Jelas garpu jawaban CJam Martin Ender .
sumber
CJam , 20 byte
Cobalah online!
sumber
Sebenarnya , 19 byte
Cobalah online!
Jelas garpu jawaban CJam Martin Ender .
sumber
Python 3 ,
8179 byteCobalah online!
Menggunakan rasio emas untuk menghitung angka berikutnya
sumber
Jelly , 14 byte
Cobalah online! atau verifikasi semua iterasi yang diperlukan .
Bagaimana itu bekerja
sumber
Cepat, 251 byte
Sedikit bertele-tele bagi saya, tetapi saya tidak tahu bagaimana cara membuatnya lebih pendek:
Tidak Disatukan:
Masalah saya adalah mencoba mendapatkan tanda kutip di sekitar versi baru
s
.sumber
Cheddar , 136 byte
Cobalah online!
sumber
Javascript (ES6),
15160 byteVersi baru, kredit ke @ Leaky Nun
Versi lama :
Berdasarkan ini .
sumber
x=i=>console.log('x='+x+';x('+(i*(5**.5+1)/2+.5|0)+')');x(2)
31000
bukan angka Fibonacci.dc , 35 byte
Versi dengan iterasi (56 byte):
sumber
Swift, 235 byte
Ini adalah versi perbaikan dari Caleb 's jawaban .
sumber
Java (OpenJDK 8) , 239 byte
Cobalah online!
sumber