피보나치 여왕을 구현


13

Quine을 실행할 때 소스를 출력하는 프로그램이다.

이 도전에서, 당신은 퀴네의 변형 인 피보나치 퀸을 만들어야합니다.


피보나치 여왕이란 무엇입니까?

피보나치 퀸은 다음 규칙에 따라 소스의 수정을 출력하는 프로그램입니다.

초기 소스는이어야합니다 ...2.... 즉, 소스는을 포함해야합니다 2. (왜 2입니까? 1 인 경우 아무도 첫 번째인지 두 번째인지, 심지어 프로그램 자체인지 알 수 없습니다)

실행하면, 당신은 출력 소스,하지만해야 만을 특정 번호 (이 단계에서 2) 피보나치 시퀀스의 다음 번호로 변경되었습니다. 예를 들면 다음과 같습니다 ...3.... 출력과 출력의 출력도 마찬가지입니다. 최대 2 ^ 32-1의 정수를 지원할 수 있습니다. 이 한계를 넘는 정수의 경우 다음 출력이 선택됩니다.

OP의 메모

나는 이것을위한 창조적 인 해결책을 정말로보고 싶다. 도전의 두 가지 중요한 측면 인 피보나치와 퀴네 모두 쉽지 않기 때문에 나는 이것에 대한 단일 솔루션을 생각할 수 없었다. 그때 기다릴게요!



4
quine 부분은이 도전에별로 추가되지 않습니다. 답이 보여주는 것처럼 이것은 "피보나치 시퀀스의 다음 값"과 보편적 인 퀴네 생성자입니다.

나는 동의한다. 이것에 대한 창의적인 솔루션을보고 싶습니다. 그러나 독창적 인 솔루션을 원한다면 코드 골프 대신 코드 도전으로 만들지 않는 것이 좋습니다. 우승 기준은 일정 시간 간격 또는 그 이후에 가장 많은 표를 얻을 수 있습니다.
Fixed Point

@FixedPoint '두 번째 기준'은 어떻습니까? 누군가가 창의적인 해결책을 제시하면 현상금을줍니다.
Matthew Roh

@FixedPoint 그것은 인기 콘테스트입니다
boboquack

답변:


8

수학, 61 바이트

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

후행 공백이 있습니다. 이것은 함수 quine입니다. 즉, 위의 코드는 이름이 지정되지 않은 함수로 평가되며, 호출되면 코드 자체를 문자열로 반환합니다 ( 2다음 피보나치 수로 변경됨).

이것은 일하기에 놀랍도록 까다로웠다. 기본 아이디어는 함수 자체 (로 #0)를 사용하여 해당 함수의 숫자를 다음을 사용하여 다음 함수로 바꾸는 것 /. v:2 :> nextFib[v]입니다. 그러나이 nextFib단계에서 평가되지 않으므로 소스 코드의 새 숫자로 끝나지 않습니다. 즉각적인 평가를 수행하는 방법을 찾기 위해 잠시 동안 검색 한 후 Mathematica.SE에 대한이 위대한 게시물을 발견 했습니다 . "표준"기술은 With평가를 강제 하는 블록을 사용 하지만 WReach의 두 번째 답변에는 문서화되지 않은 내장 기능을 사용하여 평가를 강제하는 짧은 대안이 포함되어 있습니다 RuleCondition.

다음 피보나치 수를 계산하는 방법은 연속 숫자의 비율이 대략 황금 비율 인 1.618 이라는 사실을 사용하는 것입니다. 이것은 반올림까지 정확합니다. 따라서 마지막 두 숫자를 추적 할 필요가 없으며 간단히 할 수 있습니다 Round[GoldenRatio v]. Mathematica GoldenRation는 상징적 인 값이므로 Round항상 정확한 결과를 계산할 수 있기 때문에 정확도를 잃지 않습니다 .

요약해서 말하자면:

... #0 ... &

명명되지 않은 함수. 여기서 #0함수 객체 자체를 나타냅니다.

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

2함수의 표현식 트리에서 (이것은 2물론 그 자체 만 일치 함)을 찾아서 호출 v하고 대체하십시오 ...

... RuleCondition[Round[GoldenRatio v]]

... 다음 피보나치 수입니다.

ToString[...]

그리고 결과 표현식 트리를 문자열 표현으로 변환하십시오.


다음과 같은 경우에 열심히 노력해야한다는 것을 알게되어 기쁩니다.
Greg Martin

황금비에 대한 상징이 없습니까?
caird coinheringaahing

@cairdcoinheringaahing 아니.
Martin Ender 2012 년






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

스위프트, 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

자바 스크립트 (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에 오신 것을 환영합니다! 우리는 당신이 여기서 좋은 시간을 갖기를 바랍니다.
Leaky Nun

@LeakyNun 잘만되면 지금 고쳐주세요!
rbntd

골프 버전 :x=i=>console.log('x='+x+';x('+(i*(5**.5+1)/2+.5|0)+')');x(2)
Leaky Nun

@LeakyNun 와우, 짧습니다! 하지만 너무 근사하지 않습니까? 난 = 31000을위한 정답 46,368이어야하지만 그것은 50,159 출력
rbntd

이해가 안 돼요 31000피보나치 숫자가 아닙니다.
Leaky Nun

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 바이트

이것은 Caleb답변 의 개선 된 버전입니다 .

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.