Fibonacci program uzunlukları


14

Uzunluğu n'den sonraki bir sonraki Fibonacci sayısı olan başka bir program çıktısı veren n uzunluğunda bir program yazın. Yeni program aynı şeyi yapmalıdır - uzunluğu bir sonraki Fibonacci numarası olan başka bir program çıktılayın
.

En kısa kod kazanır.

Harici kaynak yok, sadece ASCII, ücretsiz derleyici / tercüman gerekli.
Çıktınız bir satırsonu ile bitiyorsa, bu sayı da sayılır.


Bunun sonsuza kadar devam etmesi gerekiyor mu? ( intveya BigInteger)
Justin

1
@Quincunx, hangisinin önce gerçekleştiğinde int sınırında veya derleyici / yorumlayıcı sınırında çalışmayı durdurursa sorun olmaz. Ben 10000 + olsa olsun bekliyoruz.
aditsu bırakıldı çünkü SE EVIL

1
Orijinal veya daha sonra üretilen programlarda boşluk veya yorum kullanımı veya keyfi olarak uzun değişken / işlev / sınıf adları konusunda kısıtlamalar var mı?
Jonathan Pullano

1
Program kendi kaynak kodunu okuyabilir mi, yoksa gerçek bir quasi-quine mi arıyorsunuz?
histokrat

Yanıtlar:


5

CJam, 26 23

Sadece senin dilini denedim.

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

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

*1.618İki sayıyı tekrar tekrar eklemek yerine kendi uzunluğunu hesaplar . İlk sürümde, çıktıyı daha önce {beğenecek 1)))))))))ve bu karakterleri sayar. Sonucu söyle n. Toplam uzunluk n+22ve yeni uzunluğu önce {olmalıdır (n+22)*1.618-22, yuvarlak. Sayısını saymak için bir azaltın ). Sonra yaklaşık olarak eşit olacaktır (n+8)*1.618.

Eski versiyon:

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

14 sayısı 24*0.618 + 0.5 - 1.


Çok etkileyici!
Dennis

Sanırım yeni bir kazanan var :)
aditsu bıraktı çünkü SE EVIL

7

Python 2, 160 bayt

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`

Bu gerçek bir yarı-sözdür; kendi kaynağını okumaz, ama üretir. İlk çıktı (sondaki satırsonu vardır):

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

İkinci:

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

Düzenleme: Hata! S'den ;s'ye değiştiğimde dizeyi değiştirmeyi unuttum 1, bu yüzden ikinci çıktı ekstra noktalı virgül (Python'un desteklemediği) çıktıyordu. Sabit


Ancak ... 3 hakkında tekrardan sonra çalışmayı durdurur korkuyorum
aditsu çıkın SE KÖTÜ çünkü

@aditsu Ne? Python'un bir tamsayı boyutu sınırı var mı ?! (ya da bu sayı bir fibonacci / atlama / başka bir şey değil mi?) Ah bekle. Duh. XD
Justin

7

CJam, 41 31 bayt

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

Çevrimiçi deneyin.

Çıktı

$ 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

Nasıl çalışır

{       "                                                   {…} 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$~'   ";

2
Güzel, 1 milyona kadar doğruladı :) Bence açıklamada 39 yerine 37 olduğunu düşünüyorum.
aditsu çıkmak SE çünkü EVIL

@aditsu: Yorumunuzu şu ana kadar düzenlediğinizi fark etmedim. Gerçekten 37 olmalı, teşekkürler.
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)#####

Mükemmel karakter sayım gitti . ; _; Newline şeyi işaret ettiği için TheRare ve Python 2'yi 2 karakter tıraş ederek kullanmanızı önerdiği için Quincunx'a teşekkürler.

EDIT : Şimdi sadece #s yerine daha fazla s kullanır 1; 12 karakter daha kısa.

EDIT 2 : 94 karakter! Bazı tekrarlar ortadan kaldırıldı. >: 3

DÜZENLEME 3 : Python 2 için daha kısa repr alternatifi.

DÜZENLEME 4 : Çıktı artık daha kısa bir karakter.

DÜZENLEME 5 : %rKısaltmak için kullanımı @primo tarafından başka bir soruya verilen yanıttan alınmıştır.

EDIT 6 : Daha kısa. : D

İşte bir Python 3 sürümü:

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)####

Bu cevap @Quincunx'ın cevabına benzer.


printend=''bağımsız değişken belirtmedikçe her zaman yeni satır ekler .
seequ

Neden Python 2'yi kullanmıyorsunuz?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 yapacağım! Teşekkürler: D
cjfaure

90 karakterlik programınız python 3 ile çalışmaz ve 145 karakterlik bir çıktıya (bir Fibonacci numarası değil) sahiptir
aditsu quit çünkü SE

@aditsu Düzeltildi. : 3
cjfaure

2

JavaScript, 94

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

İyi bilinen bir JavaScript Quine'e dayanarak , bu hemen hemen aynı işlevi döndürür, bunu sadece eğik çizgi miktarı izler, böylece N'den sonraki bir sonraki Fibonacci numarası olan 144'e kadar toplanır ve böylece ...

N bir Fibonacci sayısı değil, sadece "olması güzel" idi.


1000'i geçtiğinde düzgün çalışmıyor gibi görünüyor
aditsu çıkıldı çünkü SE EVIL

1000 ne? Tekrarlamalar?
Jacob

Hayır, program uzunluğu
aditsu çık çünkü SE EVIL

Hmm ... kullanarak, Chrome'un Konsolu onu test edildi p = (my answer)ve daha sonra p = eval(p)birkaç kez, ve kadar var 196418 ... bu işlem zaman sonra> ı test çıkın böylece 1sec: P Ama daha da devam edebilir sanırım.
Jacob

Anlamıyorsunuz .. Çalışmayı bıraktığını veya çok yavaş olduğunu söylemedim. Doğru çalışmadığını söyledim. Sadece yapmayın p=eval(p), kontrol edin p.length. 987'ye ulaştıktan sonra, bir Fibonacci numarası değil, 1598 uzunluğunu alıyorum.
aditsu bıraktı çünkü SE EVIL

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]
 ]) &

Bu çok basit bir uygulamadır (yani burada bir şaşkınlık yoktur). Doğru uzunluğu elde etmek için biraz dolgu ile geri dönen anonim bir işlevdir. Mathematica homoikoniktir: kod ve verilerin her ikisi de Mathematica ifadeleri olarak temsil edilir, bu da kodu anında değiştirmeyi / oluşturmayı gerçekten kolaylaştırır. Bu aynı zamanda karakter sayılarının kod uzunluğunun doğal bir ölçüsü olmadığı anlamına gelir. Epxresyon boyutu ( "yaprak sayısı" ) dır. Bu sürüm, kod uzunluğu ölçüsü olarak yaprak sayılarına dayanmaktadır.

Bu anonim işlevi bir değişkene atarsak f(okunabilir bir şekilde ne olduğunu gösterebilirim) ve her seferinde dönüş değerinin uzunluğunu ölçerek 1, 2, 3, ... kez çağırmaya devam edersek , bu elde ederiz:

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

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

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

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

Ücretsiz tercüman gereksinimi ile ilgili olarak: Mathematica, Raspberry Pi için ücretsizdir. Aksi takdirde bu kod Mathics (açık kaynak) bağlantı noktasına doğrudan gelmelidir . Mathics eksik tek şey InverseFunctionolarak değiştirilebilir, hangi burada :) (ama tembelim.


Vay be, Mathematica'nın Pi için ücretsiz olduğunu bilmiyordum, kontrol etmeliyim. Ancak, programın karakterleri standart çıktıya basması gerekiyor ve bu sayılacak.
aditsu, SE'nin EVIL

@aditsu Aslında bunu meydan okumada yarışmaktan çok eğlence için yaptım ve LeafCountkullanmak karakter sayılarını kullanmaktan çok daha ilginç görünüyordu (dize manipülasyonu olarak sıkıcı kod manipülasyonu anlamına gelir). :-) Karakter sayılarını kullanmak için değiştirmeyeceğim, ancak isterseniz kötü duygular olmadan silebilirim.
Szabolcs

Ah anlıyorum. Sadece bırakın, silmenize gerek yok.
aditsu bırakıldı çünkü SE EVIL

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.