피보나치 프로그램 길이


14

길이가 n 다음에 다음 피보나치 수인 다른 프로그램을 출력하는 길이가 n 인 프로그램을 작성하십시오. 새 프로그램은 동일한 작업을 수행해야합니다. 길이가 다음 피보나치 수 등인 다른 프로그램을 출력하십시오.
n 자체 (원래 프로그램의 길이)는 피보나치 수일 필요는 없습니다.

가장 짧은 코드가 승리합니다.

외부 리소스, ASCII 만, 무료 컴파일러 / 인터프리터가 필요하지 않습니다.
출력이 줄 바꿈으로 끝나면 출력도 계산됩니다.


이것이 계속 지속되어야합니까? ( intBigInteger)
저스틴

1
@Quincunx int의 한계 또는 컴파일러 / 인터프리터의 한계에서 작동을 멈 추면 괜찮습니다. 그래도 10000+에 도달 할 것으로 기대합니다.
SE가 EVIL이기 때문에 Aditsu 종료

1
원래 또는 이후에 생성 된 프로그램에서 공백이나 주석 또는 임의로 긴 변수 / 함수 / 클래스 이름 사용에 제한이 있습니까?
Jonathan Pullano 2016 년

1
프로그램이 자체 소스 코드를 읽을 수 있습니까, 아니면 진정한 준 퀸을 찾고 있습니까?
histocrat 2016 년

답변:


5

CJam, 26 23

방금 당신의 언어로 시험해 보았습니다.

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

9는 (22*0.618 + 0.5 - 1)/1.618 + 1입니다.

*1.618두 숫자를 반복적으로 추가하는 대신 자체 길이 를 계산 합니다. 첫 번째 버전에서는 {like 이전에 출력을 채우고 1)))))))))해당 문자 자체를 계산합니다. 결과를 말하십시오 n. 총 길이는 n+22이며 이전의 새 길이 {(n+22)*1.618-22반올림 되어야합니다 . 수를 세려면 1 씩 줄이십시오.) . 그러면 대략와 같습니다 (n+8)*1.618.

이전 버전 :

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

숫자 14는 24*0.618 + 0.5 - 1입니다.


매우 인상적!
데니스

나는 우리가 새로운 승자가 있다고 생각합니다 :)
SE는 EVIL이기 때문에 aditsu 종료

7

파이썬 2, 160 바이트

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`

이것은 진정한 준-퀸입니다. 자체 소스를 읽지 않지만 생성합니다. 첫 번째 출력 (후행 줄 바꿈) :

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

둘째:

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

편집 : 죄송합니다. ;s 에서 s로 변경했을 때 문자열을 변경하는 것을 잊었 1으므로 두 번째 출력은 여분의 세미콜론 (파이썬이 지원하지 않는)을 출력했습니다. 결정된


3 번 정도 반복 한 후에 작동이 멈출 까봐 두렵습니다 ...
SE가 EVIL이기 때문에 aditsu가 종료

@aditsu 무엇? 파이썬은 정수의 크기에 제한이 있습니까?! (또는 수는 피보나치가 아니거나 건너 뛰거나 다른 것이 아닌가?) 아 잠깐만. 어. 나는 문자열 XD를 변경하는 것을 잊었다
Justin

7

CJam, 41 31 바이트

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

온라인으로 사용해보십시오.

산출

$ 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

작동 원리

{       "                                                   {…} 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
니스, 백만까지 확인 :) 설명에서는 39 대신 37이라고 생각합니다.
SE가 EVIL이기 때문에 Aditsu 종료

@aditsu : 지금까지 댓글을 편집 한 것을 보지 못했습니다. 실제로 37이어야합니다. 감사합니다.
데니스

6

파이썬-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)#####

내 완벽한 캐릭터 수는 없어 . ; _; 줄 바꿈을 지적한 TheRare와 Quincunx에게 파이썬 2를 사용하여 2 개의 문자를 제거하도록 제안 해 주셔서 감사합니다.

편집 : 이제는 #대신 s를 더 사용합니다.1 . 12 자 더 짧습니다.

편집 2 : 94 문자! 일부 반복을 제거했습니다. > : 3

편집 3 : Python 2의 짧은 repr 대안.

편집 4 : 출력은 이제 더 짧은 문자입니다.

편집 5 : %r단축 사용은 @primo의 다른 질문에 대한 답변에서 가져 왔습니다.

편집 6 : 짧게. :디

다음은 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)####

이 답변은 @Quincunx의 답변과 비슷합니다.


printend=''인수 를 지정하지 않으면 항상 줄 바꿈을 추가합니다 .
seequ

왜 파이썬 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하겠습니다! 감사합니다 : D
cjfaure 2016 년

귀하의 90 문자 프로그램은 파이썬 3하지 작업을 수행하고, 145 문자 출력 (안 피보나치 수)있다
aditsu 종료 SE 악이기 때문에

@aditsu 수정. : 3
cjfaure

2

자바 스크립트, 94

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

잘 알려진 JavaScript Quine 기반 , 이것은 거의 동일한 함수를 반환하고 그 뒤에 슬래시의 양만 따라옵니다. 그러면 N 다음에 오는 피보나치 수인 144가됩니다.

N은 피보나치 수는 아니지만 "가지고있는 것"만이었습니다.


1000 통과 할 때 제대로 작동하지 않는 것
aditsu 종료 SE 악이기 때문에

1000 무엇? 반복?
Jacob

아니요, 프로그램 길이
SE는 EVIL이기 때문에 aditsu 종료 됨

흠 ... Chrome 콘솔에서 테스트 p = (my answer)한 다음 p = eval(p)몇 번 사용 하고 196418 까지 얻었습니다 . 처리 시간이 1 초가 지난 후에 테스트를 종료했습니다 .P 그러나 더 계속할 수 있다고 생각합니다.
Jacob

당신은 이해하지 못한다. 나는 그것이 작동을 멈추거나 너무 느리다고 말하지 않았다. 제대로 작동하지 않는다고 말했습니다. 하지 말고 p=eval(p)확인하십시오 p.length. 987에 도달하면 피보나치 수가 아닌 길이가 1598이됩니다.
SE가 EVIL이기 때문에 aditsu가 종료했습니다

0

매스 매 티카

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

이것은 매우 간단한 구현입니다 (즉, 여기서 난독 화가 없습니다). 정확한 길이를 얻기 위해 약간의 패딩으로 자신을 반환하는 익명 함수입니다. Mathematica는 호모 닉 (homoiconic)입니다. 코드와 데이터는 모두 Mathematica 표현식으로 표현되므로 코드를 실제로 수정 / 생성하기가 쉽습니다. 또한 문자 수는 코드 길이를 측정하는 것이 아닙니다. 격변 크기 ( "리프 수" )입니다. 이 버전은 코드 길이 측정으로 리프 수를 기반으로합니다.

이 익명 함수를 변수에 할당 f하여 (읽을 수있는 방식으로 발생하는 것을 보여줄 수 있음) 반환 값의 길이를 측정 할 때마다 1, 2, 3, ... 번 호출하십시오. 우리는 얻는다 :

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

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

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

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

무료 통역 요구 사항과 관련하여 : Mathematica는 Raspberry Pi에서 무료입니다. 그렇지 않으면이 코드는 Mathics (오픈 소스) 포트로 간단해야합니다 . Mathics에서 누락 된 유일한 것은이며 여기 에서 바꿀 InverseFunction수 있습니다 (그러나 게으름 :).


와우, 나는 Mathematica가 Pi를 위해 자유 롭다는 것을 몰랐다. 나는 그것을 조사해야한다. 그러나 프로그램은 문자를 표준 출력으로 인쇄해야하므로 계산해야합니다.
SE가 EVIL이기 때문에 aditsu는

@aditsu 실제로 나는 도전에서 경쟁하는 것보다 재미를 위해 이것을 더 많이했고, LeafCount문자 수를 사용하는 것 (문자 조작으로 지루한 코드 조작을 암시하는 것)을 사용하는 것보다 훨씬 재미있는 것처럼 보였습니다. :-) 문자 수를 사용하도록 변경하지는 않지만 원하는 경우 나쁜 느낌없이 삭제할 수 있습니다.
Szabolcs

아, 알겠습니다 삭제하지 않고 그대로 두십시오.
SE가 EVIL이기 때문에 aditsu가 종료했습니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.