소스 코드를 출력하는 프로그램을 작성해야합니다.
- 원래 프로그램보다 더 큼 (문자 단위)
- 실행될 때 자체보다 큰 다른 프로그램을 인쇄합니다 (예 : 새 프로그램도이 문제에 대한 올바른 답변입니다)
이것은 코드 골프이므로 최단 답변이 이깁니다.
:^)
소스 코드를 출력하는 프로그램을 작성해야합니다.
이것은 코드 골프이므로 최단 답변이 이깁니다.
:^)
답변:
9
맞습니다. 한 캐릭터. 유효한 프로그램 인 맥주 99 병에 가사를 출력합니다 . 관련없는 모든 데이터는 계산되지 않지만 거기에 많은 데이터가 9
있습니다.
출력 된 프로그램의 출력은 59 병의 맥주 99 병에 대한 가사입니다.
이 기능은 프로그램 n
시간 을 실행할 때 가사가 출력되는 횟수를 제공합니다 (내 계산이 올바른 경우).
f(n) = 59n-1
2*59^n-2
는 "the"의 "h"로 인해 "Hello, world!"의 인스턴스 도 포함한다는 것입니다 .
{.'.~'}.~
이 코드는 다음을 출력합니다.
{.'.~'}{.'.~'}.~
어떤 출력 :
{.'.~'}{.'.~'}{.'.~'}.~
어떤 출력 :
{.'.~'}{.'.~'}{.'.~'}{.'.~'}.~
등등.
나는 이것이 지금까지 "실제"Turing-complete 프로그래밍 언어에서 가장 짧은 대답이라고 생각합니다.
기본적으로 위의 원래 코드는 "퀸 레이어"입니다. 일반 quine 다음에 그 자체가 출력됩니다.
GolfScript {foo}
에서 스택에 방해받지 않으면 코드 블록 리터럴 (예 :)이 엉망 입니다. 따라서 {.'.~'}
다른 코드 블록과 마찬가지로 자체적으로 출력됩니다.
.~
코드의 끝에이를 복제 스택의 마지막 코드 블록을 취하고, 복사를 실행한다. 실행될 때 .'.~'
코드 블록 내부의 코드는 스택의 최상위 항목 (예 : 자체 사본)을 복제하고 문자열을 추가합니다 .~
.
프로그램이 끝날 때 GolfScript 인터프리터는 스택의 모든 것을 문자열 화하여 출력합니다.이 경우 {.'.~'}
입력 보다 블록이 하나 더 있고 문자열이 더해 .~
집니다.
스택의 모든 코드 블록을 복제하기 전에 배열로 수집 ]
하기 위해 첫 번째 앞에를 추가하면 .
지수가 커집니다.
{].'.~'}.~
출력 :
{].'.~'}{].'.~'}.~
어떤 출력 :
{].'.~'}{].'.~'}{].'.~'}{].'.~'}.~
어떤 출력 :
{].'.~'}{].'.~'}{].'.~'}{].'.~'}{].'.~'}{].'.~'}{].'.~'}{].'.~'}.~
등등.
{].'.~'}.~︵ ┻━┻
파일로 저장하십시오 Blank.java
. 다른 파일로 저장하는 경우 인스턴스를 Blank
적절한 파일 이름으로 바꾸십시오.
그런 다음 먼저 컴파일하고 실행하여 명령 행에서 실행하십시오. 컴파일에 실패하면 중지하십시오.
Java 7 에 따라 다르게 출력 될 수 있으므로 이것을 Java 7 로 나열합니다 .
처음 몇 개의 출력 (stderr로 출력) :
Error: Could not find or load main class Blank
Blank.java:1: error: class, interface, or enum expected
Error: Could not find or load main class Blank
^
Blank.java:1: error: reached end of file while parsing
Error: Could not find or load main class Blank
^
2 errors
Blank.java:1: error: class, interface, or enum expected
Blank.java:1: error: class, interface, or enum expected
^
Blank.java:1: error: expected
Blank.java:1: error: class, interface, or enum expected
^
Blank.java:1: error: expected
Blank.java:1: error: class, interface, or enum expected
^
Blank.java:1: error: as of release 5, 'enum' is a keyword, and may not be used as an identifier
Blank.java:1: error: class, interface, or enum expected
^
(use -source 1.4 or lower to use 'enum' as an identifier)
Blank.java:1: error: = expected
Blank.java:1: error: class, interface, or enum expected
^
Blank.java:2: error: expected
Error: Could not find or load main class Blank
^
Blank.java:2: error: ';' expected
Error: Could not find or load main class Blank
^
Blank.java:2: error: = expected
Error: Could not find or load main class Blank
^
Blank.java:2: error: = expected
Error: Could not find or load main class Blank
^
Blank.java:2: error: expected
Error: Could not find or load main class Blank
^
Blank.java:3: error: = expected
^
^
Blank.java:3: error: ';' expected
^
^
Blank.java:4: error: illegal start of type
Blank.java:1: error: reached end of file while parsing
^
Blank.java:4: error: = expected
Blank.java:1: error: reached end of file while parsing
^
Blank.java:4: error: illegal start of type
Blank.java:1: error: reached end of file while parsing
^
Blank.java:4: error: expected
Blank.java:1: error: reached end of file while parsing
^
Blank.java:4: error: = expected
Blank.java:1: error: reached end of file while parsing
^
Blank.java:4: error: illegal start of type
Blank.java:1: error: reached end of file while parsing
^
Blank.java:4: error: expected
Blank.java:1: error: reached end of file while parsing
^
Blank.java:4: error: = expected
Blank.java:1: error: reached end of file while parsing
^
Blank.java:4: error: ';' expected
Blank.java:1: error: reached end of file while parsing
^
Blank.java:4: error: = expected
Blank.java:1: error: reached end of file while parsing
^
Blank.java:4: error: expected
Blank.java:1: error: reached end of file while parsing
^
Blank.java:4: error: = expected
Blank.java:1: error: reached end of file while parsing
^
Blank.java:4: error: ';' expected
Blank.java:1: error: reached end of file while parsing
^
Blank.java:5: error: expected
Error: Could not find or load main class Blank
^
Blank.java:5: error: ';' expected
Error: Could not find or load main class Blank
^
Blank.java:5: error: = expected
Error: Could not find or load main class Blank
^
Blank.java:5: error: = expected
Error: Could not find or load main class Blank
^
Blank.java:5: error: expected
Error: Could not find or load main class Blank
^
Blank.java:6: error: = expected
^
^
Blank.java:6: error: ';' expected
^
^
Blank.java:7: error: reached end of file while parsing
2 errors
^
30 errors
stdout
실제로 아무것도 출력되지 않습니다.
QQ
이것은 출력입니다.
QQQQ
2^2^n
초기 프로그램이 0 세대 인 곳 이라고 생각합니다 m -> m^2
. 길이가 반복 됩니다.
n
에서 출력은 n^n
입니다. 그러나 그것은 거짓입니다. 코드 길이가 n
인 경우 출력 길이는n^2
puts <<3*3,3
puts <<3*3,3
3
puts
-line이 인쇄 되는 횟수가 기하 급수적으로 증가합니다.
$ ruby quine.rb | ruby | ruby
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
3
$ ruby quine.rb | ruby | ruby | ruby | ruby | ruby | ruby | ruby | wc -l
3283
간단한 람다 용어
(λu.(u u)(u u))(λu.(u u)(u u))
이 용어를 하나의 베타 감소 수율로 감소
((λu.(u u)(u u))(λu.(u u)(u u)))((λu.(u u)(u u))(λu.(u u)(u u)))
그리고 등등. 그것은 (λu.u u)(λu.u u)
람다 미적분학에서 퀴네 인 고전의 간단한 변형입니다. 여기의 이중 자기 적용은 우리가 두 배의 결과를 얻음을 의미합니다.
아주 간단합니다 :
6579792
dfP
첫 번째 줄은 세대마다 한 번씩 반복됩니다.
$ dc growing_quine.dc
6579792
6579792
dfP
$ dc growing_quine.dc | dc | dc
6579792
6579792
6579792
6579792
dfP
마지막 줄은 다음과 같은 지침으로 구성됩니다 d
. 스택에 넣은 마지막 값 (6579792)을 복제하고 (매번 실행할 때마다 사본을 하나 더 얻음) f
전체 스택 (동일한 숫자의 묶음 )을 인쇄합니다. P
숫자 (6579792)를 바이트 스트림으로 인쇄하여로 표시합니다 dfP
.
print(open(__file__).read())
f=lambda:print('f()')
f()
__ file__을 단일 문자 파일 이름으로 바꾸고 파일을 그대로 저장하면 더 짧아 질 수 있지만이 대답은 질문의 정신에 더 가깝습니다. 한 번 반복하면 다음이 출력됩니다.
print(open(__file__).read())
f=lambda:print('f()')
f()
f()
골프 버전은 거의 읽을 수 없으므로 먼저 설명하고 실제 식별자를 사용합니다.
이것은 "가장 이상한 방법으로 스택 오버플로"자체 수정 방법의 변형입니다.
이 메소드는 hello 메시지와 현재 소스를 출력합니다 (데모 용). 그런 다음 코드를 수정하여 더 긴 문자열을 출력하고 설치합니다. 마지막으로 새 코드를 재귀 적으로 호출합니다.
즉각적인 도망으로부터 자신을 보호하기 위해 사용자는 각 사이클에서 확인할 수 있습니다.
객체에서 컴파일 :
eatMe_alice
|msg mySource|
mySource := thisContext method source.
'**** Hello Alice' printCR.
' ---- my current code is:' printCR.
mySource printCR.
' ---------------' printCR.
(UserConfirmation confirm:'Again? ') ifTrue:[
Object compile:
(mySource
copyReplaceString:'Hello ','Alice'
withString:'Hello ','Alice !').
self eatMe_alice
]
"eatMe_alice"를 임의의 오브젝트에 보내 쇼를 시작하십시오. nil은 할 것이다 :
nil eatMe_alice
좋은 변형은 새 코드를 재귀 적으로 호출하지 않고 대신 호출 스택을 해제하고 새 메소드에 다시 입력하여 반복적으로 호출하는 것입니다. 이는 재귀 예외로 이어지지 않는 이점이 있습니다. 이렇게하려면 재귀 호출 ( "self eatMe_alice")을 다음과 같이 바꾸십시오.
thisContext resend
골프 :
분명히, 인쇄 및 자기 전화는 요구되지 않았으므로, 가장 짧은 (골프의 경우) 단순히 내 자신의 소스에 의견을 추가하고 회신하는 것입니다. 부작용으로 다음 통화에도 설치됩니다 ...
x|s|Object compile:(s:=thisContext method source,'""').^s
파일을 저장
sed p *
자체의 빈 디렉토리에 있고 실행 sh [file]
파일을 설정하거나 설정 하여이 디렉토리에서 실행하십시오.
8 자로 된 오래된 대안 이지만 자체 디렉토리가 필요하지 않습니다. 파일을 저장
sed p $0
sh [file]
실행 파일을 사용 하거나 실행하십시오.
12 자로 된 오래된 대안 :
sed -i- p $0
이것은 실제로 프로그램 파일 자체로 출력되지만 출력 위치는 지정되지 않았습니다. 기하 급수적으로 복제합니다.
ed
하고 있을지도 모르지만 , 맨 페이지를보고 싶지 않았다 ...
function f(){console.log(f+"f(f())")}f()
처음 실행 ;f()
하면 마지막에 다른 것과 함께 출력됩니다 . 이후에 출력을 실행하면 각 "입력"소스가 두 번 인쇄됩니다.
alert
보다 짧은 것이 console.log
있지만 출력으로 콘솔에서 여러 라인을 호출하는 합리적인 것 같다 동안 "는"출력하는 복수의 경고 대화 상자를 고려하지 않습니다.
"f(f())"
대신 1 바이트를 절약 할 수 있습니다"f();f()"
'
공개 견적은 분명히 공개 견적 오류를 제공합니다.
|open quote
| '
| ^
|[-1] /home/runner/.code.tio
J 인터프리터의 특성상 오류는 STDERR이 아닌 STDOUT에 인쇄됩니다 .
위 코드를 코드로 실행하면 다음과 같이 인쇄됩니다.
|open quote
| | '
| ^
|[-2] /home/runner/.code.tio
그때
|open quote
| | | '
| ^
|[-2] /home/runner/.code.tio
등등. 코드가 실행될 때마다 두 번째 줄은 4 바이트 |
로 채워져이 과제의 요구 사항을 충족시킵니다.
echo,~'echo,:~(,quote)'''
출력
echo,:~(,quote)'echo,:~(,quote)'
그런 다음 별도의 줄에 두 번 자체 출력됩니다.
echo,:~(,quote)'echo,:~(,quote)'
echo,:~(,quote)'echo,:~(,quote)'
그때
echo,:~(,quote)'echo,:~(,quote)'
echo,:~(,quote)'echo,:~(,quote)'
echo,:~(,quote)'echo,:~(,quote)'
echo,:~(,quote)'echo,:~(,quote)'
등등.
첫 번째 출력은 표준 J quine 의 간단한 변형입니다 . 추가 ,:~
된 결과는 수직으로 연결되어 결과 2D 배열이 동일한 문자열의 두 행으로 인쇄됩니다.
"'34'coo1o;
이것은 1
각 반복 후에 여분의 것이 인쇄 되는 것을 제외하고 표준 퀴네 프레임 워크 입니다. 온라인으로 사용해보십시오!
처음 몇 개의 출력 :
"'34'coo1o;
"'34'coo1o;1
"'34'coo1o;11
"'34'coo1o;111
비경쟁 언어는 도전 과제를 게시합니다.
"qp"qp
첫 번째 반복 qp
은 끝에 추가 를 추가하고 , 연속 된 각 반복은이 원래 프로그램의 추가 사본을 처음에 추가합니다.
"'<S@>
이것은 이상했다. 내가해야 할 일은 Jo King이 발견 한~
원래의 quine 에서 a 를 제거하는 것 입니다.
모든 추가 실행 <
은 끝 부분 에 다른 것을 추가합니다 .
"'<S@><<<<<<<<<
모두 아무것도하지 않습니다.
<?echo fgets(fopen(__FILE__,'r')).';';
실행할 때마다 세미콜론이 추가됩니다.
';'
있습니다. 그러면 더 긴 출력을 얻을 수 있습니다.
<?=fgets(fopen(__FILE__,'r')).';';
?
;<?echo fgets(fopen(__FILE__,'r'));
ECMAScript 6 (38 자)
(f=_=>'(f='+f+')();(f='+f+')();')();
어떤 출력 :
(f=_=>'(f='+f+')();(f='+f+')();')();(f=_=>'(f='+f+')();(f='+f+')();')();
편집하다
당신은 할 수 있습니다 (28 문자) :
(f=_=>'(f='+f+')();'+f())();
그러나 무한히 재귀하고 아무것도 반환하지 않지만 ...이 같은 작업을 수행하면 해결할 수 있습니다 (42 자).
(f=_=>_?'(f='+f+')('+_+');'+f(_-1):'')(3);
어느 것이 출력 될까요?
(f=_=>_?'(f='+f+')('+_+');'+f(_-1):'')(3);(f=_=>_?'(f='+f+')('+_+');'+f(_-1):'')(2);(f=_=>_?'(f='+f+')('+_+');'+f(_-1):'')(1);
+_+ =_=
이모티콘 +1
(print `(or ,-))
물론 대화식 전용이지만 현재 최상위 형식을 참조 할 수있는 것이 사양을 충족하는 사소한 프로그램을 최소화하는 가장 좋은 방법 일 것입니다.
정말 흥미로운 것은 가장 빠른 속도입니다. 아마도 같은
(print `(progn ,@(loop repeat (length -) collect -)))
`
와 ,
?
or
도 :(print -)
x="print(\"x=\$(repr(x))\\n\$x;\"^2)";print("x=$(repr(x))\n$x;"^2)
출력 (134 자) :
x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);
결과 실행 결과 (268 자) :
x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);
다음 결과 (536 자) :
x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);
다음 결과 (1072 자) :
x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);
나는 이것이 규칙에 따르기를 바랍니다.
더 큰 출력을 생성하고 출력 자체는 더 큰 출력을 다시 생성하는 유효한 소스 코드입니다.
Evoloop 세포 자동자는 골리에 포함 는 "quine 같은"방식으로 자신을 복제 패턴을 지원합니다. 구체적으로, 이러한 패턴은 각각 "프로그램"을 포함합니다. 패턴은 먼저 프로그램을 실행 한 다음 (딸의 "본체"를 작성 함) 프로그램을 딸에게 복사하여 자체적으로 재생됩니다.
위의 내용은 Evoloop뿐만 아니라 더 유명한 "Langton 's Loops"셀룰러 오토 마톤에도 적용되지만, Evoloop에는 흥미로운 차이점이 있습니다.
(훨씬 더 흥미로운, 내 의견으로는, Evoloop 자신을 재현! 나는이 작업을 수행 할 수있는 유일한 알려진 셀룰러 오토마타는 Evoloop과 그 후손을 생각하는 매우 실제와 같은 방식으로 진화 패턴을 포함하는 간단한 세포 자동자는 사실이다 그러나 Evoloop의 단점은 하나의 특정 "최상의"게놈이 있다는 것입니다. 진화는 항상이 하나의 게놈으로 수렴합니다.)
이제이 제출에는 두 가지 단점이 있습니다. 하나는 셀룰러 오토 마톤의 "출력"이 무엇인지 명확하지 않다는 것입니다. 그러나 나는자가 재생 오토 마톤이 퀴인이되기에 "충분히 가까이"있다고 생각합니다. 확실히 덜 흥미 롭습니다! 다른 단점은 이러한 패턴이 단지 하나의 복사본을 만드는 것이 아니라는 것입니다. 마다원래 패턴의 사본은 무한히 많은 사본을 생성하려고 시도하며,이 사본들은 파괴적인 방식으로 서로 상호 작용하게됩니다. 따라서 저는이 도전의 요구 사항을 정신적으로 만 충족 시켰지만 서면으로는 그렇지 않은 것 같습니다.
더 이상 고민하지 않으면 패턴은 다음과 같습니다.
022222220
270170172
212222202
202000212
272000272
212000202
202222212
271041032
022222250
다음은 Golly에 복사하여 붙여 넣을 수있는 형식의 패턴입니다.
x = 9, y = 9, rule = Evoloop
.7B$BG.AG.AGB$BA5B.B$B.B3.BAB$BGB3.BGB$BAB3.B.B$B.5BAB$BGA.DA.CB$.6BE
!
알았어, 어떻게 생겼어? 다음과 같이 보입니다 :
위의 애니메이션에서 초기 패턴이 더 큰 딸을 만들어 큰 손녀를 만든 다음 큰 증손녀를 만들고 마지막으로 더 큰 큰 증손녀를 만들어서 더 큰 제 3의 증인을 만드는 것을 볼 수 있습니다. 손녀. 이 패턴을 오랫동안 실행했다면 계속 이런 식으로 계속 진행될 것입니다 (또는 아마도 진화 된 유기체에 의해 추월 될 것입니다.이 유기체는 훨씬 더 빠르게 재생할 수 있습니다. 확실하지 않습니다).
이 코드를 .bat 파일에 넣으면 계속 실행되고 (무한 루프에서) 파일도 커집니다.
echo echo %0 ^>^> %0 >> %0
%0
. 스크립트를 호출하는 데 사용되는 명령으로 .BAT
확장명 이 없을 수 있습니다 . %~nx0
배치 파일의 전체 파일 이름을 얻는 데 사용할 수 있습니다 .
.bat
실행할 필요가 없습니다 . 파일 이름이 execute.bat
이면 execute
또는을 입력 할 수 있습니다 execute.bat
. 둘 다 작동합니다.
.bat
실행할 수있는 확장 기능을하지만, 당신이 그것을 실행할 때 확장을 남길 수 있습니다 (당신이 확장자를 가진 명령을 입력 할 때, 윈도우는 시도 .com
, .exe
다음 .bat
순서대로). 파일 이름이 hello.bat
인 경우 원본 >> %0
파일 hello
이 아니고 hello.bat
실행할 수없는 파일을 작성합니다 .