길이가 n 다음에 다음 피보나치 수인 다른 프로그램을 출력하는 길이가 n 인 프로그램을 작성하십시오. 새 프로그램은 동일한 작업을 수행해야합니다. 길이가 다음 피보나치 수 등인 다른 프로그램을 출력하십시오.
n 자체 (원래 프로그램의 길이)는 피보나치 수일 필요는 없습니다.
가장 짧은 코드가 승리합니다.
외부 리소스, ASCII 만, 무료 컴파일러 / 인터프리터가 필요하지 않습니다.
출력이 줄 바꿈으로 끝나면 출력도 계산됩니다.
길이가 n 다음에 다음 피보나치 수인 다른 프로그램을 출력하는 길이가 n 인 프로그램을 작성하십시오. 새 프로그램은 동일한 작업을 수행해야합니다. 길이가 다음 피보나치 수 등인 다른 프로그램을 출력하십시오.
n 자체 (원래 프로그램의 길이)는 피보나치 수일 필요는 없습니다.
가장 짧은 코드가 승리합니다.
외부 리소스, ASCII 만, 무료 컴파일러 / 인터프리터가 필요하지 않습니다.
출력이 줄 바꿈으로 끝나면 출력도 계산됩니다.
답변:
방금 당신의 언어로 시험해 보았습니다.
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
입니다.
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
으므로 두 번째 출력은 여분의 세미콜론 (파이썬이 지원하지 않는)을 출력했습니다. 결정된
{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$~' ";
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의 답변과 비슷합니다.
print
end=''
인수 를 지정하지 않으면 항상 줄 바꿈을 추가합니다 .
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'
(function q(w,e){return ('('+q+')('+e+','+(s=w+e)+')'+Array(s).join('/')).substr(0,s)})(55,89)
잘 알려진 JavaScript Quine 기반 , 이것은 거의 동일한 함수를 반환하고 그 뒤에 슬래시의 양만 따라옵니다. 그러면 N 다음에 오는 피보나치 수인 144가됩니다.
N은 피보나치 수는 아니지만 "가지고있는 것"만이었습니다.
p = (my answer)
한 다음 p = eval(p)
몇 번 사용 하고 196418 까지 얻었습니다 . 처리 시간이 1 초가 지난 후에 테스트를 종료했습니다 .P 그러나 더 계속할 수 있다고 생각합니다.
p=eval(p)
확인하십시오 p.length
. 987에 도달하면 피보나치 수가 아닌 길이가 1598이됩니다.
({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
수 있습니다 (그러나 게으름 :).
LeafCount
문자 수를 사용하는 것 (문자 조작으로 지루한 코드 조작을 암시하는 것)을 사용하는 것보다 훨씬 재미있는 것처럼 보였습니다. :-) 문자 수를 사용하도록 변경하지는 않지만 원하는 경우 나쁜 느낌없이 삭제할 수 있습니다.
p,c=55,89;exec(s:="print((a:=f'p,c={c},{p+c};exec(s:=%r)'%s)+'#'*(c-len(a)))")
p,c,s=55,89,"a='p,c,s=%d,%d,%r;exec s'%(c,p+c,s);print a+'#'*(c-len(a))";exec s
int
나BigInteger
)