Panjang program Fibonacci

14

Tulis program dengan panjang n yang menampilkan program lain yang panjangnya adalah angka Fibonacci berikutnya setelah n. Program baru harus melakukan hal yang sama - output program lain yang panjangnya adalah angka Fibonacci berikutnya, dll.
N itu sendiri (panjang program asli) tidak harus menjadi angka Fibonacci, meskipun alangkah baiknya jika itu.

Kode terpendek menang.

Tidak diperlukan sumber daya eksternal, ASCII saja, kompiler / juru bahasa gratis diperlukan.
Jika output Anda berakhir di baris baru, itu juga dihitung.

aditsu berhenti karena SE adalah JAHAT
sumber
Apakah ini perlu dilanjutkan selamanya? ( intatau BigInteger)
Justin
1
@ Quincunx tidak apa-apa jika berhenti bekerja pada batas int atau batas kompiler / juru bahasa, mana yang lebih dulu. Saya berharap untuk mendapatkan 10.000+.
Aditsu berhenti karena SE adalah JAHAT
1
Apakah ada pembatasan penggunaan spasi putih atau komentar atau nama variabel / fungsi / kelas yang sewenang-wenang lama baik dalam program asli atau yang kemudian diproduksi?
Jonathan Pullano
1
Bisakah program membaca kode sumbernya sendiri, atau Anda mencari quasi-quine yang sebenarnya?
histokrat
@JonathanPullano tanpa batasan, mereka hanya perlu menjadi program yang valid
aditsu berhenti karena SE adalah JAHAT

Jawaban:

5

CJam, 26 23

Saya baru saja mencoba dengan bahasa Anda.

7{9\@5mq)2/*')*\"_~"}_~

9 adalah (22*0.618 + 0.5 - 1)/1.618 + 1.

Itu menghitung panjangnya sendiri *1.618daripada berulang kali menambahkan dua angka. Di versi pertama, itu akan mengisi output sebelum {suka 1))))))))), yang menghitung karakter itu sendiri. Katakan hasilnya n. Panjang total adalah n+22, dan panjang baru sebelumnya {harus (n+22)*1.618-22bulat. Perkecil satu per satu untuk menghitung jumlah) . Maka kira-kira akan sama dengan (n+8)*1.618.

Versi yang lebih lama:

-3{1\@5mq)2/*E+')*\"_~"}_~

Angka 14 adalah 24*0.618 + 0.5 - 1.

jimmy23013
sumber
Sangat mengesankan!
Dennis
Saya pikir kami memiliki pemenang baru :)
aditsu berhenti karena SE adalah JAHAT
7

Python 2, 160 byte

s='s=%s;c=s;l=len(s%%c)+4;a,b=1,1\nwhile b<l:a,b=b,a+b\nc+="1"*(b-l-1);print s%%`c`;a=1'
c=s
l=len(s%c)+4
a,b=1,1
while b<l:a,b=b,a+b
c+="1"*(b-l-1)
print s%`c`

Ini adalah quasi-quine sejati; tidak membaca sumbernya sendiri, tetapi menghasilkannya. Output pertama (memiliki baris baru):

s='s=%s;c=s;l=len(s%%c)+4;a,b=1,1\nwhile b<l:a,b=b,a+b\nc+="1"*(b-l-1);print s%%`c`;a=111111111111111111111111111111111111111111111111111111111111111111111';c=s;l=len(s%c)+4;a,b=1,1
while b<l:a,b=b,a+b
c+="1"*(b-l-1);print s%`c`;a=1

Kedua:

s='s=%s;c=s;l=len(s%%c)+4;a,b=1,1\nwhile b<l:a,b=b,a+b\nc+="1"*(b-l-1);print s%%`c`;a=1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111';c=s;l=len(s%c)+4;a,b=1,1
while b<l:a,b=b,a+b
c+="1"*(b-l-1);print s%`c`;a=111111111111111111111111111111111111111111111111111111111111111111111

Edit: Ups. Lupa untuk mengubah string ketika saya mengubah dari ;s ke 1s, jadi output kedua mengeluarkan titik koma tambahan (yang Python tidak mendukung). Tetap

Justin
sumber
Saya khawatir itu berhenti bekerja setelah sekitar 3 iterasi ...
aditsu berhenti karena SE adalah JAHAT
@aditsu Apa? Python memiliki batasan ukuran bilangan bulat ?! (Atau apakah hitungannya bukan fibonacci / melompati / sesuatu yang lain?) Oh, tunggu. Duh. Saya lupa mengubah string XD
Justin
7

CJam, 41 31 byte

{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~

Cobalah online.

Keluaran

$ cjam <(echo '{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~'); echo
{1$+S@]_1=4+1$`,-S*"2$~"}34 21 2$~
$ cjam <(echo '{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~') | wc -c
34
$ cjam <(cjam <(echo '{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~')); echo
{1$+S@]_1=4+1$`,-S*"2$~"}55 34                      2$~
$ cjam <(cjam <(echo '{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~')) | wc -c
55
$ cjam (cjam <(cjam <(echo '{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~'))); echo
bash: syntax error near unexpected token `cjam'
$ cjam <(cjam <(cjam <(echo '{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~'))); echo
{1$+S@]_1=4+1$`,-S*"2$~"}89 55                                                        2$~
$ cjam <(cjam <(cjam <(echo '{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~'))) | wc -c
89

Bagaimana itu bekerja

{       "                                                   {…} 21 13                     ";
  1$+   " Duplicate the higher number and add.              {…} 21 34                     ";
  S@    " Push a space and rotate the lower number on top.  {…} 34 ' ' 21                 ";
  ]     " Wrap the stack into an array.                     [ {…} 34 ' ' 21 ]             ";
  _1=   " Push the second element of the array.             [ {…} 34 ' ' 21 ] 34          ";
  4+    " Add 4 to it.                                      [ {…} 34 ' ' 21 ] 38          ";
  1$`,  " Push the length of the stringified array.         [ {…} 34 ' ' 21 ] 38 37       ";
  -S*   " Subtract and push that many spaces.               [ {…} 34 ' ' 21 ] ' '         ";
  "2$~" " Push the string '2$~'.                            [ {…} 34 ' ' 21 ] ' ' '2$~'   ";
}       "                                                   {…}                           ";

21D     " Push 21 and 13.                                   {…} 21 13                     ";
2$~     " Copy the code block an evaluate.                  [ {…} 34 ' ' 21 ] ' ' '2$~'   ";
Dennis
sumber
2
Bagus, dikonfirmasi hingga 1 juta :) Saya pikir itu 37 bukannya 39 meskipun dalam penjelasannya.
Aditsu berhenti karena SE adalah JAHAT
@aditsu: Tidak menyadari Anda mengedit komentar Anda sampai sekarang. Seharusnya memang 37, terima kasih.
Dennis
6

Python - 89

g="%(s,b,a+b);print o.ljust(b-1)";s,a,b="s,a,b=%r,%i,%i;o=s%"+g,89,144;exec("o=s"+g)#####

Hitungan karakter sempurna saya hilang . ; _; Terima kasih kepada TheRare untuk menunjukkan hal baris baru dan Quincunx untuk menyarankan saya menggunakan Python 2, mengurangi 2 karakter.

EDIT : Sekarang hanya menggunakan lebih banyak #s bukan1 s; 12 karakter lebih pendek.

EDIT 2 : 94 chars! Menghilangkan beberapa pengulangan. >: 3

EDIT 3 : Alternatif repr lebih pendek untuk Python 2.

EDIT 4 : Output adalah karakter yang lebih pendek sekarang.

EDIT 5 : Penggunaan %runtuk mempersingkat itu diambil dari jawaban atas pertanyaan lain oleh @primo.

EDIT 6 : Lebih pendek. : D

Ini versi Python 3:

g="%(s,b,a+b);print(o.ljust(b-1))";s,a,b="s,a,b=%r,%i,%i;o=s%"+g,89,144;exec("o=s"+g)####

Jawaban ini mirip dengan yang ditulis oleh @Quincunx.

cjfaure
sumber
printselalu menambahkan baris baru, kecuali jika Anda menentukan end=''argumen.
seequ
Mengapa tidak menggunakan Python 2 ?:s,a,b="s,a,b=%s,%i,%i;o=s%%(`s`,b,a+b)+'#';print o+(b-len(o)-1)*'1'",89,144;o=s%(`s`,b,a+b)+'#';print o+(b-len(o)-1)*'1'
Justin
@ Quincunx saya akan! Terima kasih: D
cjfaure
Program 90-char Anda tidak bekerja dengan python 3, dan memiliki output 145-char (bukan angka Fibonacci)
aditsu berhenti karena SE adalah JAHAT
@aditsu Diperbaiki. : 3
cjfaure
2

JavaScript, 94

(function q(w,e){return ('('+q+')('+e+','+(s=w+e)+')'+Array(s).join('/')).substr(0,s)})(55,89)

Berdasarkan yang terkenal JavaScript Quine yang , ini mengembalikan fungsi yang hampir sama, hanya diikuti oleh jumlah garis miring, sehingga jumlahnya mencapai 144 yang merupakan angka Fibonacci berikutnya setelah N. Dan seterusnya ...

N bukan angka Fibonacci, tapi itu hanya "baik untuk dimiliki".

Yakub
sumber
Tampaknya tidak berfungsi dengan benar ketika melewati 1000
aditsu berhenti karena SE adalah JAHAT
1000 apa? Iterasi?
Yakub
Tidak, panjang program
aditsu berhenti karena SE adalah JAHAT
Hmm ... Saya mengujinya di Chrome's Console, menggunakan p = (my answer)dan kemudian p = eval(p)beberapa kali, dan mendapat sampai 196418 ... setelah itu waktu pemrosesan adalah> 1sec jadi saya berhenti pengujian: P Tapi saya kira itu bisa terus lebih.
Yakub
Anda tidak mengerti .. Saya tidak mengatakan itu berhenti bekerja atau terlalu lambat. Saya mengatakan itu tidak berfungsi dengan benar. Jangan hanya lakukan p=eval(p), periksa juga p.length. Setelah mencapai 987, saya mendapatkan panjang 1598, bukan angka Fibonacci.
Aditsu berhenti karena SE adalah JAHAT
0

Mathematica

({0};
 With[{n = Ceiling[ InverseFunction[Fibonacci]@LeafCount@#0 ], l = Length[#0[[1, 1]]]},
    #0 /. {0..} -> ConstantArray[0, Fibonacci[n+1] - LeafCount[#0] + l]
 ]) &

Ini adalah implementasi yang sangat mudah (yaitu tidak ada kebingungan di sini). Ini adalah fungsi anonim yang mengembalikan dirinya dengan sedikit padding untuk mencapai panjang yang benar. Mathematica adalah homoikonik: kode dan data keduanya direpresentasikan sebagai ekspresi Mathematica, yang membuatnya mudah untuk memodifikasi / menghasilkan kode secara langsung. Ini juga berarti bahwa jumlah karakter bukan ukuran alami dari panjang kode. Ukuran epxression ( "jumlah daun" ) adalah. Versi ini didasarkan pada jumlah daun sebagai ukuran panjang kode.

Jika kita menetapkan fungsi anonim ini ke variabel f(jadi saya bisa menunjukkan apa yang terjadi dengan cara yang dapat dibaca), dan terus memanggilnya 1, 2, 3, ... kali, setiap kali mengukur panjang nilai pengembalian, inilah yang kita mendapatkan:

In[]:= f // LeafCount
Out[]= 42

In[]:= f[] // LeafCount
Out[]= 89

In[]:= f[][] // LeafCount
Out[]= 144

In[]:= f[][][] // LeafCount
Out[]= 233

Mengenai persyaratan juru bahasa gratis: Mathematica gratis untuk Raspberry Pi. Kalau tidak, kode ini harus langsung ke port ke Matematika (open source) . Satu-satunya hal yang hilang dari Matematika adalah InverseFunction, yang dapat diganti seperti di sini (tapi saya malas :).

Szabolcs
sumber
Wow, saya tidak tahu Mathematica gratis untuk pi, saya harus memeriksanya. Namun, program ini seharusnya mencetak karakter ke output standar, dan itulah yang harus dihitung.
Aditsu berhenti karena SE adalah JAHAT
@aditsu Sebenarnya saya melakukan ini lebih untuk bersenang-senang daripada bersaing dalam tantangan, dan menggunakan LeafCounttampak jauh lebih menarik daripada menggunakan jumlah karakter (yang akan menyiratkan manipulasi kode yang membosankan sebagai manipulasi string). :-) Saya tidak akan mengubahnya untuk menggunakan jumlah karakter, tapi saya bisa menghapusnya tanpa perasaan buruk jika Anda mau.
Szabolcs
Oh begitu. Biarkan saja, tidak perlu dihapus.
Aditsu berhenti karena SE adalah JAHAT