매스 매 티카, 248222 바이트
편집 : 프라임 관련 기능의 사용을 수정했지만 quining이 약간 개선되었습니다.
편집 : Wilson의 정리를 소개해 준 Dennis에게 감사합니다.
1;n=If[ValueQ@n,n+1,1];StringJoin@Array[#<>ToString[1##,InputForm]<>#2&@@\("1;n=If[ValueQ@n,n+1,1];StringJoin@Array[#<>ToString[1##,InputForm]<>#\2&@@("*"&,For[i=n,Mod[++i!/i+1,i]>0,0];i]")&,For[i=n,Mod[++i!/i+1,i]>0,0];i]
이것은 커널이 첫 번째 인스턴스 가 실행 되기 전에 undefined에 n의존하기 때문에 quine의 후속 실행 사이에 종료된다고 가정 합니다.n[MyQuine]
이것은 아마도 많이 단축 될 수 있지만 특히 Mathematica에서 quine에 대한 경험이 많지 않습니다.
여기에 설명이 있습니다 :
1;
이것은 아무것도하지 않지만 이전 quine의 끝에 연결되면 마지막 표현식의 결과에 1(no-op)를 곱하고 세미콜론은 출력을 억제합니다. 이렇게하면 마지막 사본 만 [MyQuine]인쇄됩니다.
n=If[ValueQ@n,n+1,1];
이 처음 상태 n로 1의 첫 번째 사본에 [MyQuine]다음하여 증가 1각 추가 사본 - 즉,이 단지 카운트에서 얼마나 많은 사본 n.
이제 끝으로 넘어가십시오.
For[i=n,Mod[++i!/i+1,i]>0,0];i
이것은 Wilson의 정리를 사용하여 다음 소수를 찾습니다 .
StringJoin@Array[#<>ToString[1##,InputForm]<>#2&@@\("QUINE_PREFIX"*"QUINE_SUFFIX")&,NEXTPRIME[n]]
이것은 실제 퀴네입니다. NextPrime@n코드 자체의 복사본을 만듭니다 . 또한 조금 이상합니다. 예, 두 개의 문자열을 곱하고 의미있는 결과가 없습니다. QUINE_PREFIX두 문자열 앞의 QUINE_SUFFIX모든 코드를 포함하고 두 문자열 다음의 모든 코드를 포함합니다. 일반적으로 Apply(또는 @@)를 사용 하여 목록을 일련의 인수로 바꿉니다. 그러나 곱셈 Head과 Apply같은 것으로 바꿀 수 있습니다 . 그래서 이것은 제품이지만 여전히 내 기능에 대한 두 가지 주장으로 바꿀 수 있습니다. 그 기능은 다음을 수행합니다.
#<>ToString[1##,InputForm]<>#2
#첫 번째 인수 (접두사 문자열)는 어디에 #2있고 두 번째 인수 (접미사 문자열) ##는 두 인수의 시퀀스입니다. 1곱셈을 유지 하기 위해 앞에 덧붙여 야 합니다. 그렇지 않으면 ##인수 목록에 표시됩니다 ToString. 어쨌든, ToString[1##,InputForm]&@@("abc"*"def")반환 "abc"*"def"... 내가 필요한 것!
나는 quine 주위에 필요한 모든 것을 가지고 eval여기에 기반 quine이 더 적합 할 것이라고 생각합니다. 나중에 또는 내일 살펴 보겠습니다.