Fibonacci-quine uygulayın


13

Bir Quine çalıştırmak kaynağını veren bir programdır.

Bu meydan okumada, bir tür varyantı olan bir Fibonacci-quine yapmalısınız.


Fibonacci-quine nedir?

Bir Fibonacci-quine, kaynağın aşağıdaki kural ile değiştirilmesini sağlayan bir programdır:

İlk kaynak olmalıdır ...2.... Başka bir deyişle, kaynak içermelidir 2. (Neden 2? Eğer 1 olsaydı, kimse ilk 1 mi yoksa ikinci mi, programın kendisi bile olsa bilemezdi)

Çalıştırıldığında, kaynağı çıkarmalısınız, ancak sadece belirli bir sayı (bu aşamada 2), fibonacci dizisinin bir sonraki sayısına değiştirildi. Örneğin ...3...,. Çıkış ve çıkış vb. İçin de aynı şey geçerlidir. 2 ^ 32-1'e kadar tam sayıları destekleyebilirsiniz. Bu sınırın üzerindeki tamsayılar için, bir sonraki çıktı sizin seçiminizde.

OP notu

Bunun için yaratıcı bir çözüm görmek istiyorum. Bunun için tek bir çözüm düşünemedim, çünkü meydan okumanın iki önemli yönünün ikisi de, fibonacci ve quine, kolay değil. O zaman bekleyeceğim!



4
Quine kısmı bu meydan okumaya fazla bir şey katmıyor. Bu sadece "Fibonacci dizisindeki bir sonraki değer" artı cevapların gösterdiği gibi evrensel bir kine yapıcılarıdır.

Katılıyorum. Bunun için de yaratıcı bir çözüm görmek istiyorum. Ancak yaratıcı bir çözümü bu kadar kötü istiyorsanız, neden kod golf yerine bir kod meydan okuması yapmıyorsunuz? Kazanan kriterler, belirli bir zaman aralığından sonra en yüksek oy sayısı olabilir.
Sabit Nokta

@FixedPoint 'İkinci kriterler' ne olacak? Birisi yaratıcı bir çözüm yapar, onlara lütuf veririm.
Matthew Roh

@FixedPoint Bu bir popülerlik yarışması
boboquack

Yanıtlar:


8

Mathematica, 61 bayt

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

Sonunda bir boşluk olduğunu unutmayın. Bu bir işlev kınnasıdır, yani yukarıdaki kod, çağrıldığında kodun kendisini bir dize olarak döndüren ( 2sonraki Fibonacci numarasına değiştirilmiş olarak) isimsiz bir işleve göre değerlendirilir .

Bu işe başlamak için şaşırtıcı derecede zor oldu. Temel fikir, işlevin kendisini (ile #0) almak ve bu işlevdeki bir sayıyı bir sonraki ile değiştirmek /. v:2 :> nextFib[v]. Ancak, nextFibbu aşamada değerlendirilmezdi, bu yüzden kaynak koddaki yeni sayı ile sonuçlanmayacaktık. Hemen değerlendirmenin nasıl zorlanacağını bulmak için bir süre aradıktan sonra , Mathematica.SE'de bu harika gönderiyi buldum . "Standart" teknik, Withdeğerlendirmeyi zorlayan bir blok kullanır , ancak WReach'in ikinci cevabı, RuleConditiondeğerlendirmeyi de zorlayan belgelenmemiş yerleşik kullanarak daha kısa bir alternatif içerir .

Bir sonraki Fibonacci sayısını hesaplama şeklimiz, ardışık sayıların oranının kabaca altın oranı 1.618 olduğu gerçeğinden faydalanmaktır ... ve bu yuvarlamaya kadar doğrudur. Bu yüzden son iki sayıyı takip etmemiz gerekmiyor ve sadece yapabiliyoruz Round[GoldenRatio v]. Mathematica'nın GoldenRationsembolik bir değeri olduğundan ve bu yüzden Roundher zaman doğru bir sonuç hesaplayabildiğinden , bu asla kesinlik kaybetmez .

Özetle:

... #0 ... &

Adsız bir işlev; burada #0işlev nesnesinin kendisini ifade eder.

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

2İşlevin ifade ağacında (bu 2elbette sadece kendisiyle eşleşir) bulun , arayın vve değiştirin ...

... RuleCondition[Round[GoldenRatio v]]

... bir sonraki Fibonacci numarası.

ToString[...]

Ve sonuçta elde edilen ifade ağacını dize temsiline dönüştürün.


Bunlara bazen çok çalışmak zorunda olduğunuzu bilmek güzel :)
Greg Martin

Altın oranın sembolü yok mu?
coinheringaahing Caird

@cairdcoinheringaahing no.
Martin Ender

7

CJam , 26 bayt

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

Çevrimiçi deneyin!

Muhtemelen pek uygun değil. Değer sonuncusundan daha büyük olana kadar Fibonacci dizisini yineliyoruz ve sonucu programın başında yeni değer olarak kullanıyoruz.


6
Thi .. Bu erken mi?
Matthew Roh





4

Jöle , 14 bayt

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

Çevrimiçi deneyin! veya gerekli tüm yinelemeleri doğrulayın .

Nasıl çalışır

“×Ø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.

1

Swift, 251 bayt

Benim için biraz ayrıntılı, ama nasıl kısaltacağımı anlayamıyorum:

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

Ungolfed:

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

Benim sorunum yeni sürümü hakkında tırnak almak için çalışıyor s.



1

Javascript (ES6), 151 60 bayt

Yeni sürüm, @ Leaky Nun kredisi

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

Eski versiyon :

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)

Dayanarak bu .


1
PPCG'ye Hoşgeldiniz! Burada harika zaman geçireceğinizi umuyoruz.
Sızdıran Rahibe

@LeakyNun Umarım şimdi düzeltildi!
rbntd

Golfçülen versiyon:x=i=>console.log('x='+x+';x('+(i*(5**.5+1)/2+.5|0)+')');x(2)
Sızan Rahibe

@LeakyNun vay, bu kısa! Ama bu çok yaklaşık değil mi? doğru cevap 46368
rbntd

Anlamıyorum. 31000bir Fibonacci numarası değil.
Sızdıran Rahibe

1

dc , 35 bayt

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

Yinelemeli bir sürüm (56 bayt):

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

1

Swift, 235 bayt

Bu geliştirilmiş bir versiyonudur Caleb bireyin cevabı .

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

0

Java (OpenJDK 8) , 239 bayt

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);}}

Çevrimiçi deneyin!

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.