フィボナッチキンを実装する


13

A クワインは、実行時にそのソースを出力するプログラムです。

この課題では、フィボナッチキンを作成する必要があります。


フィボナッチキンとは何ですか?

フィボナッチキンとは、次の規則に従ってソースの変更を出力するプログラムです。

最初のソースはである必要があります...2...。つまり、ソースにはが含まれている必要があります2。(なぜ2?1だった場合、それが最初の1であるか2番目であるか、プログラム自体でさえ誰も知らないでしょう)

実行すると、ソースを出力する必要がありますが、特定の番号(この段階では)のみ2がフィボナッチ数列の次の番号に変更されます。たとえば、...3...。出力、出力の出力なども同様です。最大2 ^ 32-1の整数をサポートできます。その制限を超える整数の場合、次の出力は選択できます。

OPのメモ

私はこのための創造的な解決策を本当に見たいです。チャレンジの2つの重要な側面であるフィボナッチとクインの両方は簡単ではないため、これに対する単一の解決策を考えることはできませんでした。待ってます!



4
馬の部分は、この課題にあまり追加しません。答えが示すように、これは単なる「フィボナッチ数列の次の値」に加えて、普遍的なキインコンストラクターです。

同意する。このための創造的な解決策も見たいです。しかし、クリエイティブなソリューションが非常に悪い場合は、コードゴルフではなくコードチャレンジにしないでください。勝利の基準は、一定の時間間隔などを経た後の最高票数です。
固定小数点

@FixedPoint「2番目の基準」はどうですか?誰かが創造的な解決策を作り、私は彼らに報奨金を与えます。
マシュー盧

回答:


8

Mathematica、61バイト

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

末尾にスペースがあることに注意してください。これは関数クインです。つまり、上記のコードは名前のない関数に評価され、呼び出されると、コード自体を文字列として返します(2次のフィボナッチ数に変更されます)。

これは仕事を始めるのに驚くほど難しいものでした。基本的な考え方は、関数自体を(で#0)取得し、その関数の数値をを使用して次の数値に置き換えること/. v:2 :> nextFib[v]です。ただし、nextFibこの段階では評価されないため、ソースコードに新しい数値が含まれることはありません。しばらく評価してすぐに評価を強制する方法を見つけた後、Mathematica.SEでこの素晴らしい投稿を見つけました。。「標準」の手法ではWith評価を強制するブロックを使用しますが、WReachによる2番目の回答には、評価を強制する文書化されていないビルトインを使用した短い代替案が含まれていRuleConditionます。

次のフィボナッチ数を計算する方法は、連続する数の比率がおおよそ黄金比1.618であるという事実を利用することです...これは丸めまで正確です。したがって、最後の2つの数値を追跡する必要はなく、単純に行うことができますRound[GoldenRatio v]。Mathematica GoldenRationはシンボリック値であり、したがってRound常に正確な結果を計算できるため、これによって精度が失われることはありません。

要約すれば:

... #0 ... &

名前のない関数。ここで#0、関数オブジェクト自体を指します。

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

2関数の式ツリーでa を見つけ(これ2はもちろんそれ自体に一致します)、それvを呼び出して置き換えます...

... RuleCondition[Round[GoldenRatio v]]

...次のフィボナッチ数。

ToString[...]

結果の式ツリーを文字列表現に変換します。


時々これらに熱心に取り組む必要があることを知ってうれしいです:)
グレッグマーティン

黄金比のシンボルはありませんか?
コメアリンガーアーイング

@cairdcoinheringaahingいいえ。
マーティンエンダー






4

ゼリー、14バイト

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

オンラインでお試しください!または、必要なすべての反復を確認します

使い方

“×Ø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バイト

私には少し冗長ですが、短くする方法がわかりません:

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

ゴルフをしていない:

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

私の問題は、新しいバージョンの引用を取得しようとしていることですs



1

Javascript(ES6)、151 60バイト

新バージョン、@ Leaky Nunのクレジット

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

古いバージョン:

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)

基づいて、この


1
PPCGへようこそ!ここで素晴らしい時間を過ごされることを願っています。
リーキー修道女

@LeakyNunうまくいけば今修正!
rbntd

ゴルフ版:x=i=>console.log('x='+x+';x('+(i*(5**.5+1)/2+.5|0)+')');x(2)
リーキー修道女

@LeakyNunうわー、それは短いです!しかし、それは近似しすぎていませんか?私は31000を=のための右の答えは46368でなければなりませんが、それは50159を出力
rbntd

分かりません。31000フィボナッチ数ではありません。
リーキー修道女

1

dc、35バイト

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

反復のあるバージョン(56バイト):

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

1

迅速、235バイト

これは、カレブ答えの改良版です。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.