Terapkan Fibonacci-quine

13

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!

Matthew Roh
sumber
Terkait .
Leaky Nun
4
Bagian quine tidak menambah banyak tantangan ini. Ini hanya "nilai berikutnya dalam deret Fibonacci" ditambah konstruktor quine universal, seperti yang ditunjukkan oleh jawaban.
Saya setuju. Saya ingin melihat solusi kreatif untuk ini juga. Tetapi jika Anda menginginkan solusi kreatif yang sangat buruk, mengapa tidak membuatnya menjadi tantangan kode alih-alih kode-golf. Kriteria yang menang bisa menjadi jumlah suara terbanyak setelah beberapa interval waktu atau sesuatu.
Fixed Point
@FixedPoint Bagaimana dengan 'Kriteria kedua'? Seseorang membuat solusi kreatif, saya berikan mereka hadiah.
Matthew Roh
@FixedPoint Itu kontes popularitas
boboquack

Jawaban:

8

Mathematica, 61 byte

ToString[#0 /. v:2 :> RuleCondition[Round[GoldenRatio v]]] & 

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 2diubah 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, nextFibtidak 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" menggunakan Withblok yang memaksa evaluasi, tetapi jawaban kedua oleh WReach berisi alternatif yang lebih pendek menggunakan built-in tidak berdokumen RuleConditionyang 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 Mathematica GoldenRationadalah nilai simbolis dan karenanya Roundselalu dapat menghitung hasil yang akurat.

Singkatnya:

... #0 ... &

Fungsi yang tidak disebutkan namanya, di mana #0merujuk ke objek fungsi itu sendiri.

... /. v:2 :> ...

Temukan 2di pohon ekspresi fungsi (ini 2tentu saja hanya cocok dengan dirinya sendiri), panggil vdan ganti dengan ...

... RuleCondition[Round[GoldenRatio v]]

... nomor Fibonacci berikutnya.

ToString[...]

Dan konversi pohon ekspresi yang dihasilkan ke representasi stringnya.

Martin Ender
sumber
Sangat menyenangkan mengetahui bahwa Anda kadang-kadang harus bekerja keras dalam hal ini :)
Greg Martin
Apakah tidak ada simbol untuk rasio emas?
caird coinheringaahing
@cairdcoinheringaahing no.
Martin Ender
7

CJam , 26 byte

2{0X{_@+_W$>!}go;\;"_~"}_~

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.

Martin Ender
sumber
6
Ini..ini awal?
Matius Roh
6

CJam , 20 byte

2{\5mq)*)Y/io"_~"}_~

Cobalah online!

jimmy23013
sumber
Wow, 20 byte: Saya tidak bisa berkata-kata ...
Mr. Xcoder
5

Python 3 , 81 79 byte

s='s=%r;print(s%%(s,round(%s*(1+5**.5)/2)))';print(s%(s,round(2*(1+5**.5)/2)))

Cobalah online!
Menggunakan rasio emas untuk menghitung angka berikutnya

tongkat
sumber
4

Jelly , 14 byte

“×Øp+.ḞṭØv”Ṙv2

Cobalah online! atau verifikasi semua iterasi yang diperlukan .

Bagaimana itu bekerja

“×Øp+.ḞṭØv”Ṙv2  Main link. No arguments.

“×Øp+.ḞṭØv”     Set the left argument and return value to the string "×Øp+.ḞṭØv".
           Ṙ    Print a string representation of the return value and yield the
                unaltered return value.
            v2  Evaluate the return value as a Jelly program with left argument 2.
 ×Øp                Multiply the left argument by the golden ratio.
    +.              Add 0.5 to the resulting product.
      Ḟ             Floor; round the resulting sum down to the nearest integer.
        Øv          Yield the string "Øv".
       ṭ            Tack; append the result to the left to the result to the right.
Dennis
sumber
1

Cepat, 251 byte

Sedikit bertele-tele bagi saya, tetapi saya tidak tahu bagaimana cara membuatnya lebih pendek:

import Foundation;var n="\"";var u="\\";var s="import Foundation;var n=%@%@%@%@;var u=%@%@%@%@;var s=%@%@%@;print(String(format:s,n,u,n,n,n,u,u,n,n,s,n,(round(%f*(1+sqrt(5))/2))))";print(String(format:s,n,u,n,n,n,u,u,n,n,s,n,(round(2*(1+sqrt(5))/2))))

Tidak Disatukan:

import Foundation
var n="\""
var u="\\"
var s="import Foundation;var n=%@%@%@%@;var u=%@%@%@%@;var s=%@%@%@;print(String(format:s,n,u,n,n,n,u,u,n,n,s,n,(round(%f*(1+sqrt(5))/2))))"
print(String(format:s,n,u,n,n,n,u,u,n,n,s,n,(round(2*(1+sqrt(5))/2))))

Masalah saya adalah mencoba mendapatkan tanda kutip di sekitar versi baru s.

Caleb Kleveter
sumber
1

Cheddar , 136 byte

let b=1;for(let a=1;a<2;a=b-a){b+=a};let s='let b=1;for(let a=1;a<%i;a=b-a){b+=a};let s=%s;print s%b%@"39+s+@"39';print s%b%@"39+s+@"39

Cobalah online!

Biarawati Bocor
sumber
1

Javascript (ES6), 151 60 byte

Versi baru, kredit ke @ Leaky Nun

x=i=>console.log('x='+x+';x('+(i*(5**.5+1)/2+.5|0)+')');x(2)

Versi lama :

x=i=>{var s=Math.sqrt(5),a=1;f=n=>{return Math.ceil((((1+s)/2)**n-((1-s)/2)**n)/s)};while(f(++a)<=i);console.log('x='+String(x)+';x('+f(a)+')');};x(2)

Berdasarkan ini .

rbntd
sumber
1
Selamat datang di PPCG! Kami harap Anda bersenang-senang di sini.
Leaky Nun
@ LeakyNun Semoga diperbaiki sekarang!
rbntd
Versi golf:x=i=>console.log('x='+x+';x('+(i*(5**.5+1)/2+.5|0)+')');x(2)
Leaky Nun
@ LeakyNun wow, itu pendek! Tapi bukankah itu terlalu perkiraan? ini menghasilkan 50159 untuk i = 31000 meskipun jawaban yang benar harus 46368
rbntd
Saya tidak mengerti. 31000bukan angka Fibonacci.
Leaky Nun
1

dc , 35 byte

2[r9k5v1+2/*.5+0k1/n91PP93P[dx]P]dx

Versi dengan iterasi (56 byte):

2[rsP1dsN[lN+lNrsNdlP[s.q]s.=.lFx]dsFxlNn91PP93P[dx]P]dx
eush77
sumber
1

Swift, 235 byte

Ini adalah versi perbaikan dari Caleb 's jawaban .

import Foundation;var n="\"",u="\\",s="import Foundation;var n=%@%@%@%@,u=%@%@%@%@,s=%@%@%@;print(String(format:s,n,u,n,n,n,u,u,n,n,s,n,(round(%f*(1+sqrt(5))/2))))";print(String(format:s,n,u,n,n,n,u,u,n,n,s,n,(round(2*(1+sqrt(5))/2))))
Nathan Piercy
sumber
0

Java (OpenJDK 8) , 239 byte

interface a{static void main(String[]p){int a=1,b=1;for(;a<2;a=b-a)b+=a;String s="interface a{static void main(String[]p){int a=1,b=1;for(;a<%d;a=b-a)b+=a;String s=%c%s%c;System.out.printf(s,b,34,s,34);}}";System.out.printf(s,b,34,s,34);}}

Cobalah online!

Biarawati Bocor
sumber