모든 라인의 Quine


30

당신의 목표는 각 줄마다 새로운 줄로 무한정 인쇄하는 프로그램을 만드는 것입니다. 따라서 프로그램이 단일 라이너 인 경우 출력의 모든 라인에서 반복됩니다.

프로그램:

A

산출:

A
A
A
...

규칙

  • 스 니펫이나 함수가 아닌 완전한 프로그램이어야합니다.
  • 프로그램은 스택 오버플로 또는 재귀 제한 오류없이 영원히 반복되어야합니다.
  • 출력은 stdout 또는 가장 가까운 대안입니다.
  • 프로그램 입력이 허용되지 않습니다.
  • 프로그램 파일 열기 또는 외부 리소스 액세스와 같은 표준 허점은 허용되지 않습니다. 빈 프로그램은 표준 허점으로 허용되지 않습니다.
  • 프로그램 코드가 후행 줄 바꿈으로 끝나는 경우 퀴 사이에 필요한 줄 바꿈으로 계산되지 않으며 다른 줄을 인쇄해야합니다.
  • 최단 코드 승!

타이틀은 한 줄짜리 프로그램 만 해당되는 것 같습니다.
Paŭlo Ebermann

@ PaŭloEbermann 그런 다음 문제 설명을 읽으십시오. 운이 좋기 때문에 재치있는 제목입니다. 다음은 유효한 멀티 라인 프로그램의 예는 다음과 같습니다 codegolf.stackexchange.com/a/57985/34718 . 제목 만 읽으면 도전과 관련된 모든 것을 알 수 없습니다.
mbomb007

@ PaŭloEbermann 그것은 단지 while(1)println(your_code);
Matthew Roh

답변:


19

분열, 7 바이트

'!+!NR"

내가 지금까지 찾은 가장 짧은 핵분열 퀴 의 약간 간단한 수정 : 나는 단순히 비파괴를 !사용 O하고 N개행을 위해 추가했습니다 .

제어 흐름은 R오른쪽 원자로 시작합니다. "다음 "에 인쇄 될 때까지 모든 것을 의미하는 문자열 모드를 전환합니다 ( 이 경우) '!+!NR. 그러면 "및 줄 바꿈이 인쇄됩니다. '!원자의 질량을 33으로 설정하고 +34 (문자 코드 ")로 증가 !시키고 따옴표를 인쇄합니다. N줄 바꿈을 인쇄 R하고이 경우 이제 no-op이므로 루프가 다시 시작됩니다.

다음 7 바이트 솔루션도 작동합니다.

"NR'!+!

9

> <> , 16 바이트

'ard3*o50l2)?.~~

전통적인> <> quine은 너무 많은 o을 사용하므로 인쇄에 루프를 사용합니다. 각각의 점프 전에 우리는 5와 0 (점프 할 위치의 좌표)을 누른 후, .여전히 인쇄 할 것이 있으면 점프 하거나으로 상위 2 개의 값을 팝합니다 ~~.

(스택 오버플로 규칙을 잊어 버린 이후 16 버전으로 돌아갔습니다.)


대안은 "ar00go50l2)?.[입니까?
mbomb007

3
@ mbomb007 것 같아요,하지만 난 좋아 d3*하기 때문에 g자신의 소스 코드를 읽고
SP3000

8

CJam, 13 바이트

{_o"_g
"o1}_g

온라인 인터프리터는 프로그램이 종료되기 전에 아무 것도 인쇄하지 않으므로 Java 인터프리터에서이를 테스트해야합니다.

설명

마지막으로 끝나는 일반 CJam quine _~.

{_o"_g
"o1}

이것은 단순히 블록을 밀어 넣습니다. _g스택의 상단이 정직한 상태에서 블록을 복제하고 반복적으로 실행합니다 (조건 무시).

이제 블록 내부에서 블록의 다른 사본은 여전히 ​​스택에 있습니다. 로 복제하여 인쇄 _o_g다음을 사용하여 줄 바꿈 (Quines 사이에 필요한 추가 줄 바꿈)을 인쇄 "_g\n"o합니다. 마지막으로, 우리 1는 루프를 반복하기 위해 스택에 A를 푸시합니다. 불행히도 블록은 CJam에서 진실하지 않습니다 (또는 거짓).


7

파이썬 2, 39

파이썬에서 while 루프를 일반 quine에 추가하는 것은 쉽지 않기 때문에 매우 흥미로운 작업은 아닙니다.

c='while 2:print"c=%r;exec c"%c';exec c

이것이 스택을 날려 버리지 않습니까?
Jesan Fafon

1
@JesanFafon 아니, 당신이 그것을 시도하면 당신은하지 않는 것을 볼 수 있습니다. 재귀가 없습니다.
feersum

6

Perl 5.10+, 40 37 바이트

$_=q{say"\$_=q{$_};eval"while 1};eval

또는 (37 바이트)

$_=q{{say"\$_=q{$_};eval";redo}};eval

-M5.010또는 -E명령 행 플래그를 사용하여 호출하십시오 . 예 :

$ perl -E '$_=q{say"\$_=q{$_};eval"while 1};eval'
$_=q{say"\$_=q{$_};eval"while 1};eval
$_=q{say"\$_=q{$_};eval"while 1};eval
$_=q{say"\$_=q{$_};eval"while 1};eval
...

원래 솔루션에서 3 바이트를 면도 해주신 Ilmari Karonen 에게 감사드립니다 .

eval while$_=q{say"eval while\$_=q{$_}"}

위의 37 바이트 솔루션뿐만 아니라 이것도 Ilmari의 다른 게시물 중 하나에서 처음 보았던 다음 quine의 간단한 변형입니다 .

$_=q{say"\$_=q{$_};eval"};eval

원래 솔루션에 추가 한 모든 것이 while루프 이기 때문에 그는 대부분의 크레딧을받을 자격이 있습니다. :-)


좋은, 그리고 신용 주셔서 감사합니다. :-) 원래 quine은 내 자신의 디자인이지만 다른 사람이 이전에 독립적으로 발견했을 수도 있습니다. BTW $_=q{say"\$_=q{$_};eval"while 1};eval이거나 $_=q{{say"\$_=q{$_};eval";redo}};eval몇 바이트 더 짧을 것입니다. ( $_=q{say"\$_=q{$_};eval";eval};eval아직 심지어 짧게, 그러나 나는 것입니다 의심 할 결국 스택 밖으로 실행합니다.)
Ilmari 카로 넨

당신이 나타나길 바랐어요! 더 짧은 해결책에 감사드립니다. 그러나 나는 그것에 연결된 대답에서 그것을 보았을 때 이것에 너무 놀랐습니다. 나는 그것을 직접 시도해야했습니다. :) 솔직히 말해서, 나는 여전히 내 머리를 퀴로 감싸지 않았지만 추가 답변을 통해 더 많은 것을 볼 수 있습니다. 이 페이지 에서 가장 짧은 부정 행위 Perl quine (?!)으로 크레딧을 받았기 때문에이 출처를 확실하게 알 수는 없지만이 quine에 대한 기여는 없습니다 ( print대신 사용 say).
ThisSuitIsBlackNot

btw, 마지막 것은 실제로 잠시 동안 실행 한 후 segfault를 수행합니다. 다시 감사합니다, @Ilmari!
ThisSuitIsBlackNot

실제로, 나는 그것을 다소 되 찾습니다 . 나는 그 quine을 발명 한 최초의 사람이 아니며, 전에 그것을 분명히 보았으므로 (나는 같은 스레드에서 약간의 크레딧을 주장하는 것을 게시 했습니다 ), 그것은 가능성이 높습니다 나는 그 실에서 또는 다른 곳에서 무의식적으로 그것을 기억했습니다.
Ilmari Karonen

좋아, 나는 원점을 지정하지 않았다. 어쨌든, 3 바이트에 감사하고 원래의 영감에 감사합니다.
ThisSuitIsBlackNot

5

자체 수정 Brainf *** (SMBF) , 14 바이트

후행 줄 바꿈 \n은 리터럴, Unix 줄 바꿈 (ASCII 코드 10)이어야합니다.

[<[<]>[.>]<.]\n

설명:

코드는 포인터를 소스 코드의 가장 왼쪽으로 이동 한 다음 줄 바꿈 (규칙의 두 번째 b / c)을 포함하여 모두 인쇄합니다. 루프는 계속됩니다.


당신은, 그것은해야 \r합니까?
Ismael Miguel

@IsmaelMiguel No. \n는 새로운 줄이며 ASCII 코드 10이므로 소스 코드의 16 진 덤프는 0A해당 바이트 값 을 갖습니다 . code.cside.com/3rdpage/us/newLine.html
mbomb007

1
@IsmaelMiguel 사실이 아닙니다. 코드를 입력하면 실제로 줄 바꿈을 위해 Enter 키를 누르십시오. \n일반적으로 코드에서 2 자, 2 바이트로 계산됩니다. 소스 코드 끝에 빈 줄을 표시하는 데 형식이 제대로 작동하지 않기 때문에 가독성을 높이기 위해이 방법으로 입력했습니다. 그래서 나는 그것이 2가 아닌 1 바이트임을 지정해야했습니다.
mbomb007

2
\n항상 linefeed 라고하는 단일 문자 입니다. 줄 바꿈은 , 그러나, 바이트의 플랫폼 의존의 순서입니다.
Dennis

2
@Dennis 어쩌면 그래도 상관 없습니다. 나는 /"Solidus" 라고 부르지 않으며 , 아무도 모르는 사람입니다. "Newline"은로 시작 n하며 이스케이프 문자이므로 이것이 바로 전화입니다. "캐리지 리턴"보다 "라인 피드"에 더 가깝습니다.
mbomb007

3

PowerShell, 143 바이트

$d='$d={0}{1}{0}{2}while(1){3}Write($d -f [char]39,$d,"`n",[char]123,[char]125){4}'
while(1){Write($d -f [char]39,$d,"`n",[char]123,[char]125)}

Rosetta Code PowerShell quine 기반으로 , 이것이 가장 짧지는 않다고 확신합니다. PowerShell에서 서식 문자열 교체, 이것에 대한 구역질 때문에 교체를 어디에 넣을 것인가에 대해 같은 구분 {}도를 단락 코드 블록을 while{}우리가 사용에 그래서, [char]코드를 무리를 bloats 캐스팅.


3

언더로드, 25 바이트

처음으로 이런 식으로 시도했지만 두 줄이므로 모든 규칙을 따르는 지 확실하지 않습니다. 개행은 약간의 고통이었다.

(::a~*S:a~*^
)::a~*S:a~*^

1
@ mbomb007 반복 당 출력은 프로그램의 두 줄입니다. 여기에서
MickyT

3

Befunge , 30 20 바이트

<,+55,*2+98_ #!,#:<"

줄 바꿈을 인쇄하고 줄을 끝내면 스택에 -1이 나타나는 인기있는 펀지 퀴인의 변형입니다.
불행히도 Befunge는 한 줄로 작업을 수행 할 때 자세한 정보를 얻습니다. 할 수있는 모든 런치 패드 ( #)를 모두 제거하려고했지만 , 일부 명령은 (같은 ,) 특정 명령을 건너 뛰어야했습니다 .

변경 사항 :

30-20- > 기본 quine을 문자열 입력을 사용하는 사용자 정의로 변경했습니다. 이런 식으로 분기가 훨씬 쉬워집니다.

늙은:

:0g,:93*`>0-10 #,+$#: #5 _1+>

나는 이것이 최적이라고 생각하지 않지만 지금은 받아 들일 수 있습니다.


get 명령을 사용하여 공간을 확보하고 1 바이트보다 짧은 바이트에 2를 추가 할 수 있습니다 98+2/. <, + 55, + 2g1_ #!, # : < "
MildlyMilquetoast

따옴표와 줄 바꿈을 먼저 누르고 프린터를 뒤집습니다.-1g0:+5<>:#,_1"
Jo King


2

R, 34 바이트

repeat{write(commandArgs()[5],'')}

다음과 같이 명령 행에서 호출하십시오.

Rscript -e "repeat{write(commandArgs()[5],'')}"

2

> <>, 31 29 바이트

전통적인 > <> quine 의 간단한 수정 .

"ar00gc0.0+efooooooooooooooo|

실행하려면 여기에 붙여넣고 '제출'을 클릭 한 다음 '시작'을 클릭하십시오 (애니메이션없이 실행이 작동하지 않음). 실행 속도를 자유롭게 늘리십시오.


"ar00gc0.0+feooooooooooooooo|2 바이트 더 짧습니다.
cole

@Cole 감사합니다. 나는 거울에 대해 생각했지만 다른 도전에 부딪친 후에 그것을 바꾸는 것을 잊었다.
mbomb007


@JoKing 이미 더 짧은> <> 솔루션이 있습니다.
mbomb007

2

파이썬 2, 48 바이트

c='c=\'%s\';while 1:print c%c';while 1:print c%c

2

GolfScript, 16 바이트

{.".do
":n\p}.do

결국 Martin Büttner의 CJam 엔트리 와 매우 흡사 합니다. 흥미로운 특징은 ".do"인쇄 될 때 블록 에 추가하는 가장 짧은 방법 은 블록을 줄 종결 자에 할당하는 것 n입니다. (물론, 우리는 n일반적으로 포함 하는 것을 대체하기 위해 문자열에 실제 줄 바꿈을 포함해야합니다 .) 동일한 문자열 (GolfScript에서 진실됨)도 do루프가 튀어 나올 수 있도록 스택에 남아 있습니다. 영원히 실행됩니다.


1

BASH, 76 바이트

특히 PowerShell을 사용하면 저항 할 수 없었습니다. :)

while true;do
a ()
{
    echo while true\;do
    declare -f a
    echo a\;done
}
a;done

공백은 정확한 사본에 중요합니다.


1

자바 스크립트 (ES6), 64

for(;;(_=>console.log(`for(;;(_=>${arguments.callee})());`))());

대안 적으로 (또한 64)

a="for(;;)console.log(`a=${JSON.stringify(a)};eval(a)`)";eval(a)

대안으로 스택 오버플로가 발생하지 않습니까?
Patrick Roberts

아니요. 재귀가 없으므로 스택에 아무것도 합쳐서는 안됩니다.
DankMemes

네, 방금 두 솔루션을 테스트했는데 대체 솔루션에 대해서는 맞지만 첫 번째 솔루션은 실패하고 이유를 알아 냈습니다. 화살표 함수 에 대한 MDN 설명서에 따르면 "화살표 함수는 인수 객체를 코드에 노출시키지 않습니다" 라는 말이 없으므로 arguments.callee오류가 발생합니다.
Patrick Roberts

흥미 롭군 Firefox Developer Edition 42.0a2 (2015-09-13)에서 두 가지 모두 작동합니다. 일단 표준이 완전히 채택되면 첫 번째 표준은 작동을 멈출 것입니다.
DankMemes

내가 함께 골프 첫 번째 솔루션으로 시도 된 이후 나는 최근 크롬에 그들을 시험 !(내 생각) 4 바이트 절약 할 수 루프 세미콜론에 대한 몸의 필요성을 피하기 위해 괄호를 둘러싸는 루프에 대한 후 함수 실행을 넣는 대신에
패트릭 Roberts

1

마이크로 스크립트 , 22 바이트

"f1{CqxCanx"f1{CqxCanx

Esolangs 기사의 기사를 기반으로합니다 "fCqxah"fCqxah. 언어가 필요에 따라 닫는 중괄호를 자동으로 추가한다는 사실을 악용합니다.


1

배치, 10 (파일 이름 길이는 + 4)

이것이 두 가지 이유에 해당되는지 확실하지 않습니다.

  • 기술적으로 Windows 명령 셸의 텍스트 부작용은 구성 방법에 따라 달라질 수 있습니다.
  • 이 프로그램은 이름으로 호출되며 규칙 (특히 "프로그램 파일을 열지 않음"규칙)에 의해 금지되는지 확실하지 않습니다. 텍스트를 읽고 인쇄하기 위해 자체적으로 열리지 않습니다. 단순히 다시 실행됩니다. 또한 파일 시스템 구조는 구식 배치 스크립트의 필수 부분입니다 (종종 프로그램 상태를 저장하는 데에도 사용됨). 따라서 이것이 5 번째 규칙을 위반하는지 여부는 확실하지 않습니다.

코드 (q.bat라는 프로그램의 경우) :

echo on&&q

2
가장 짧지 않고 독창적이고 독창적이므로 허용하겠습니다. 그리고 소스 코드를 읽지 않고 자체적으로 실행되었습니다.
mbomb007

1
파일 이름은 임의적이지 않으므로 최소한 파일 이름을 바이트 수에 추가해야합니다.
마틴 엔더

1
나는 echo on&&%0그것을 시도하는 것을 두려워하지만 사용할 수 있다고 생각 합니다.
DankMemes

1
업데이트 : echo on&&%0작동하지 않습니다. %0출력에 확장으로 표시되고 Windows (7, 32 비트, VM에서 실행)는 전체를 매우 빠르게 종료합니다.
DankMemes

1
나는 당신이 그 .bat부분을 생략 할 수 있다고 생각합니다
SuperJedi224

1

실론 , 210 208 바이트

물론 이것은 아무것도 얻지 못할 것입니다 ...

shared void u(){value q="\"\"\"";value t="""shared void u(){value q="\"\"\"";value t=""";value b="""while(1<2){print(t+q+t+q+";value b="+q+b+q+";"+b);}}""";while(1<2){print(t+q+t+q+";value b="+q+b+q+";"+b);}}

기발한:

shared void u(){value q="\"\"\"";value t="""shared void u(){value q="\"\"\"";value t=""";value b="""while(true){print(t+q+t+q+";value b="+q+b+q+";"+b);}}""";while(true){print(t+q+t+q+";value b="+q+b+q+";"+b);}}

루프 를 추가하여 이틀 전에 Quine를 수정 while(true){...}했으므로 일반 Quine의 185 바이트에서 210으로 나옵니다 (더 이상 줄 바꿈 문자가 필요하지 않습니다). 그러나 while(1<2){...}루프가 2 바이트 더 짧다는 것을 알았 습니다.

shared void u(){value q="\"\"\"";value t="""shared void u(){value q="\"\"\"";value t=""";value b="""while(1<2){print(t+q+t+q+";value b="+q+b+q+";"+b);}}""";while(1<2){print(t+q+t+q+";value b="+q+b+q+";"+b);}}

실론에는 for(;;)Java와 같은 루프 가 없으며이 루프에 중괄호도 필요합니다.


1

PowerShell, 132107 바이트

$a='$a={0}{1}{0};for(){2}$a-f[char]39,$a,[char]123,[char]125{3}';for(){$a-f[char]39,$a,[char]123,[char]125}

문자열 교체에 형식을 사용하지 않지만 Rosetta Quine (@AdmBorkBork와 동일)을 기반으로 ... for 루프로 전환하고 형식을 사용하는 것이 가장 좋을까요?

나는 AdmBorkBork이 돌아왔다면 그들이 이것을 많이 이길 것이라고 확신합니다 : P

편집 내 전임자 덕분에 for 루프 및 교체를 알아 냈습니다. :)

오래된 시도 :

$a='$a=;for(){$a.substring(0,3)+[char]39+$a+[char]39+$a.substring(3)}';for(){$a.substring(0,3)+[char]39+$a+[char]39+$a.substring(3)}


1

자바 10, 194 바이트

interface M{static void main(String[]a){for(var s="interface M{static void main(String[]a){for(var s=%c%s%1$c;;)System.out.println(s.format(s,34,s));}}";;)System.out.println(s.format(s,34,s));}}

설명:

온라인으로 사용해보십시오 (60 초 후 시간 초과).

interface M{                    // Class
  static void main(String[]a){  //  Mandatory main-method
    for(var s="interface M{static void main(String[]a){for(var s=%c%s%1$c;;)System.out.println(s.format(s,34,s));}}";
                                //   Unformatted source code
        ;)                      //   Loop indefinitely
       System.out.println(      //    Print with trailing new-line:
         s.format(s,34,s));}}   //     The formatted source code

part :

  • 문자열 s은 형식화되지 않은 소스 코드를 포함합니다.
  • %s를 사용하여이 문자열을 자체에 입력하는 데 사용됩니다 s.format(...).
  • %c, %1$c 그리고 34이중 따옴표를 포맷하는 데 사용됩니다.
  • s.format(s,34,s) 다 합쳐

도전 과제 :

  • for(;;) 무한 반복하는 데 사용됩니다.
  • System.out.println(...) 후행 줄 바꿈으로 인쇄하는 데 사용됩니다.





1

Brachylog , 16 바이트

∋"∋~kgjẉ₁⊥"gjẉ₁⊥

온라인으로 시도 할 수는 없지만 설치시 작동하는지 확인했습니다.

Brachylog , 18 바이트

∋"∋~kgjw₁⊥~n"gjw₁⊥

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

이 quine 의 대체 버전에서 적응했으며, 처음에는 모든 것을 보고 하기 위해 고안 한 역 추적 해킹이있었습니다 . (후행 줄 바꿈으로 인쇄하는 일반적인 방법)이 TIO에서 문자 인코딩과 관련된 이상한 문제를 겪고 문자열 리터럴에 삽입 된 실제 줄 바꿈이로 인쇄 ~n되기 때문에 2 바이트 ~k사용 \n합니다.

               w      Print
 "∋~kgjw₁⊥~n"         "∋~kgjw₁⊥~n"
∋                     which is an element of
                      the (unused and unconstrained) input
                ₁     formatted
          ~n          (so that the ~n is replaced with a newline)
             gj       with itself
   ~k                 (so that the ~k is replaced with the string in quotes),
                 ⊥    then try again.

보낸 w₁리스트로의 입력을 받아 [string to be formatted, formatting arguments]함께리스트에서 문자열을 래핑 g후 자체로 연접 j그 자체로 포맷 될 수있다. 그리고 프로그램에 입력이 주어지지 않기 때문에 프로그램의 시작 부분에 내재적으로 존재하는 입력 변수는 어떤 값을 가질 수 있으므로 "∋~kgjw₁⊥~n"요소로 포함되는 무한히 많은 목록 중 하나로 제한되어 단일을 생성 할 수 있습니다 소스를 인쇄 한 후 프로그램에 도달 할 때 역 추적 할 선택 지점 .



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