인터 퀸-루프에서 서로를 출력하는 두 개의 프로그램


29

프로그램 A는 실행될 때 프로그램 B의 코드를 출력하고 B는 A의 소스를 출력합니다.

요구 사항 :

  • 두 프로그램에서 하나의 언어 만
  • 프로그램이 다릅니다. 자체 출력하는 하나의 프로그램은 자격이 없습니다.
  • 두 프로그램 모두 비어 있지 않거나 길이가 1 바이트 이상입니다. 소스와 출력의 후행 줄 바꿈은 무시됩니다.
  • stdin이 닫힙니다. 아무것도 읽지 마십시오 ( 소스를 읽고 조작 할 수 없음 ). 출력이 stdout으로 이동합니다.
    편집 : stdin이에 연결되었습니다 /dev/null. 명확하게 정리하면 주문할 수 있습니다.
  • random기능을 사용하지 마십시오 .

추가 :

  • 가능한 경우 설명을 제공하십시오

점수는 총 길이 입니다. 후행 줄 바꿈은 프로그램에 영향을 미치지 않으면 계산되지 않습니다.



5
"임의의 기능을 사용하지 마십시오." 무슨 소리 야? 난수를 출력하는 함수?
Mr. Xcoder


stdin이 종료되었다는 의미는 아닙니다. stdin이 첫 번째로 열린 파일의 복제본이되면 일부 환경이 손상됩니다. 어쨌든, 고치지 않으면 남용 할 것입니다.
여호수아

답변:


18

CJam , 13 + 13 = 26 바이트

{sYZe\"_~"}_~

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

출력

{sZYe\"_~"}_~

설명

{       e# Standard quine framework, leaves a copy of the block on the stack
        e# for the block itself to process.
  s     e# Stringify the block.
  YZe\  e# Swap the characters at indices 2 and 3, which are Y and Z themselves.
  "_~"  e# Push the "_~" to complete the quine.
}_~

이후 e\그 두 번째 및 세 번째 피연산자 교환 적이며, 다른 프로그램 스와핑 똑같은 수행 Z하고 Y다시 원래 순서로.


17

CJam ,11 + 13 = 24 11 + 12 = 23 바이트

"N^_p"
N^_p

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

출력 :

"N^_p
"
N^_p

출력은 13 바이트이지만 다음과 같습니다.

후행 줄 바꿈은 프로그램에 영향을 미치지 않으면 계산되지 않습니다.

그래서 나는 그것을 활용하기 위해 공간을 줄 바꿈으로 바꿨습니다.

가장 짧은 CJam 적절한 quine을 기반으로합니다.

"_p"
_p

그리고 N^줄 바꿈이없는 문자열을 xor하는 것입니다. 줄 바꿈이 없으면 줄 바꿈을 추가하고있는 경우 각 문자가 고유 한 문자열에 대해 줄 바꿈을 추가합니다.

나는 quine 질문에서 그 quine을 보았지만 그것을 찾을 수 없었습니다.


지금까지의 다른 답변과 달리 두 가지 다른 크기의 프로그램을 보유한 경우 +1입니다. 편집 : 다시 투표하자마자 .. 마지막 투표에 도달>.>
Kevin Cruijssen

길이가 다르면 좋습니다.
iBug

"나는 quine 질문에서 그 quine을 보았지만 그것을 찾을 수 없었습니다." GolfScript 답변에서만 언급됩니다.
Martin Ender

12

RProgN 2 , 3 + 3 = 6 바이트

첫 번째 프로그램 :

0
1

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

두 번째 프로그램 :

1
0

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

Martin Ender 에게 -2 감사합니다 .


7
언어를 전환하면 2 바이트를 절약 할 수 있습니다. tio.run/##Kyooyk/P0zX6/9@Ay/D/fwA
Martin Ender

@MartinEnder Ooh 맞다. 나는 RProgN 2가 그런 행동을 보인다는 것을 잊었다.
Outgolfer Erik

11
이 동작이 존재한다는 것을 제외하고는 RProgN에 대해 아무것도 모른다.
Martin Ender

@MartinEnder RProgN의 저자, ​​여기에 설명이 필요한지 물어보십시오!
ATaco

@ATaco 글쎄, 난 당신에게 downvote를 명확하게 요청했지만 당신이 할 수 있다고 생각하지 않습니다 ...
Outgolfer Erik

6

C, 95 + 95 = 190 바이트

16 * 2 바이트를 절약 한 @immibis에게 감사합니다!

char*s="char*s=%c%s%c;main(i){i=%d^1;printf(s,34,s,34,i);}";main(i){i=1^1;printf(s,34,s,34,i);}

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

출력 :

char*s="char*s=%c%s%c;main(i){i=%d^1;printf(s,34,s,34,i);}";main(i){i=0^1;printf(s,34,s,34,i);}

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

어떤 출력 :

char*s="char*s=%c%s%c;main(i){i=%d^1;printf(s,34,s,34,i);}";main(i){i=1^1;printf(s,34,s,34,i);}

1
왜 항상 C라고 부르고 프로그램을 다르게 만들기 위해 변경해야합니까? C는 % c보다 짧습니다
user253751

@immibis 예, 당신은 옳습니다.
Steadybox

5

자바 스크립트, 67 + 67 = 134 바이트

첫 번째 프로그램 :

alert(eval(c="`alert(eval(c=${JSON.stringify(c)},n=${+!n}))`",n=0))

두 번째 프로그램 :

alert(eval(c="`alert(eval(c=${JSON.stringify(c)},n=${+!n}))`",n=1))

이것은 Tri-interquine에 대한 Herman Lauenstein의 답변을 기반으로합니다.

자바 스크립트 (소스 코드를 잘못 읽음), 75 + 75 = 150 61 + 61 = 122 58 + 58 = 116 50 + 50 = 100 바이트

Tushar 덕분에 20 바이트, Craig Ayre 덕분에 6 바이트, kamoroso94 덕분에 16 바이트 절약

첫 번째 프로그램 :

f=_=>alert(("f="+f).replace(0,a=>+!+a)+";f()");f()

두 번째 프로그램 :

f=_=>alert(("f="+f).replace(1,a=>+!+a)+";f()");f()

1을 0으로 바꾸고 그 반대도 마찬가지입니다. 둘 다 동일한 작업을 수행하며 소스 코드로 인해 다른 출력을 생성합니다.


1
몇 바이트를 절약하자. f.toString()=> (''+f), (0|1)=> 0|1, (a,b)=> a결과f=()=>("f="+(''+f).replace(/0|1/g,a=>a==0?1:0)+";f()");f()
Tushar

f=_=>@Tushar가 제안한대로 사용하지 않는 매개 변수를 사용하여 몇 바이트를 저장 하고 replace 콜백에서 parens를 제거 할 수 있습니다.a=>+!+a
Craig Ayre

교체 "f="+(f+"")("f="+f)-3 바이트.
kamoroso94

교체 /0|1/g/1|0/g함께 0하고 1각각에 대한 -5 바이트.
kamoroso94

당신은 그것을 실행 했습니까? 이것처럼 작동합니다 f=_=>alert(("f="+f).replace(0,a=>+!+a)+";f()");f().
kamoroso94

4

파이썬 2, 63 + 63 = 126 바이트

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

첫 번째 프로그램 :

A='A=%r;print A[:23]%%A+A[29:35]23:29]';print A[:23]%A+A[23:29]

출력 :

A='A=%r;print A[:23]%%A+A[29:35]23:29]';print A[:23]%A+A[29:35]

두 번째 프로그램 :

A='A=%r;print A[:23]%%A+A[29:35]23:29]';print A[:23]%A+A[29:35]

출력 :

A='A=%r;print A[:23]%%A+A[29:35]23:29]';print A[:23]%A+A[23:29]

4

자바 스크립트 ( JsShell ), 35 + 34 = 69 바이트

1:

(f=x=>print(`(f=${f})(${-x})`))(-1)

2 :

(f=x=>print(`(f=${f})(${-x})`))(1)

3

수학, 43 + 44 = 87 바이트

(Print[#1[#0[#1, -#2]]] & )[HoldForm, -1 1]

(Print[#1[#0[#1, -#2]]] & )[HoldForm, -(-1)]

내 컴퓨터에서 테스트했으며 두 번째 컴퓨터의 출력은 -1끝에 없습니다 -1 1.
numbermaniac

@numbermaniac이 코드를 텍스트 기반 인터페이스로 작성했습니다. 그들은 노트북에서 작동하지 않는 것 같습니다.
alephalpha

3

"stdin is closed"규칙을 남용하는 asmutils sh, 16 + 16 바이트.

#!/bin/sh
tr x y

stdin이 닫히고 sh가 사용 가능한 첫 번째 핸들로 스크립트를 열 것이므로 (현대 쉘처럼 높은 번호의 핸들로 옮기지 않고) tr은 스크립트를 열지 않고도 스크립트 사본에서 읽습니다.

이 인터 퀸은 페이로드 가능하지만 페이로드 삽입은 까다 롭습니다.

또한이 원본 버전은 당시에 사용했던 고대 커널의 미친 버그를 남용합니다. (저는 그 커널에 무슨 일이 일어 났는지 모른다. 나중에 장치에 대한 주 번호와 부 번호가 다르다는 것을 알았다.) 만약 당신이 ABI 변경을 고치면 인터 퀸이 작동하지 않을 것이다. asmutils sh에 exec가 있는지 여부는 잊어 버렸지 만 최신 버전입니다.

exec dd skip=0 | tr x y

이것은 asmutils dd의 고의적 인 버그를 남용합니다. 가능한 경우 건너 뛰기를 위해 llseek를 호출하는 성능 최적화 기능이 있지만 바이트를 저장하려면 SEEK_CUR이 아닌 SEEK_SET을 전달합니다. 이로 인해 stderr에 쓰레기가 발생하지만 stdout에 인터 퀸이 생깁니다. Asmutils dd에는 stderr 스팸을 억제하는 옵션이 없습니다.


/dev/null대신 stdin에 연결하면 작동 합니까? 어쨌든 잘 했어!
iBug

@iBug : 아뇨. stdin closed와 asmutils sh가 libc에 연결되어 있지 않으므로 libc의 자동 복구 코드를 상속하지 않는다는 사실에 전적으로 의존합니다.
여호수아

당신은 필요 #!/bin/sh합니까?
CalculatorFeline

@CalculatorFeline : 그것은 당신이 다른 것에 대한 정의의 정확성에 달려 있습니다.
여호수아

일반적으로 shebang은 계산되지 않으므로 6 바이트입니다.
CalculatorFeline


1

공통 리스프, 58 자

#1=(let((*print-circle* t))(print'(write '#1# :circle t)))

... 또는 24 글자 *print-circle*가 전역으로 설정되어 있다고 생각하지 않으면 24 자 T:

#1=(print '(write '#1#))

코드의 인쇄 된 표현은 순환 구조로 읽 히며, 여기서 #1#cons 셀은 다음과 같습니다 #1=. 우리는 프로그램이 실행되지 않도록 인용합니다. *print-circle*T 이기 때문에 REPL은 인쇄 중에 이러한 판독기 변수를 방출하도록주의를 기울입니다. 위의 코드가 인쇄하여 다음을 반환합니다.

#1=(write '(print '#1#)) 

위의 코드를 평가하면 다음과 같이 인쇄됩니다.

#1=(print '(write '#1#))

*print-circle*준수 구현에서 NIL 인의 기본값을 고수 하려면 변수를 임시로 리 바인드해야합니다.

#1=(let((*print-circle* t))(print'(write '#1# :circle t)))

LET의 몸체 안에서 우리 *print-circle*는 T로 물건을 인쇄합니다 .

#1=(write
    '(let ((*print-circle* t))
       (print '#1#))
    :circle t) 

보시다시피, 새로운 프로그램은 리 바인드되지 않지만에 의해 호출되는 하위 수준 함수 인를 *print-circle*사용 write하고 있기 때문에 print와 같은 추가 인수를 전달할 수 있습니다 :circle. 그런 다음 코드는 예상대로 작동합니다.

#1=(let ((*print-circle* t))
     (print '(write '#1# :circle t)))

그러나, 당신은 당신이 원형 구조의주의하면서 일을 인쇄, 모두에도 불구하고 있기 때문이 아니라 REPL 내부 스크립트로 위의 프로그램을 실행해야 write하고 print또한 인쇄되는 값을 반환 기본 REPL에서는 값도 인쇄되지만 *print-circle*T 는 동적 컨텍스트 외부에 있습니다 .


1

> <> , 16 + 16 = 32 바이트

":1-}80.r   !#o#

#o#!   r.08}-1:"

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

이것은 프로그램에서 점프를 사용하여 작동하며, 첫 번째 프로그램 점프는 스택의 반대를 건너 뜁니다 (스택을 뒤집은 경우 퀴네가됩니다). 두 번째 프로그램은 그 반대를 건너 뛰지 않지만 이미 프로그램의 흐름에 의해 반대가되어 원래를 만듭니다.

이 코드는 오류로 끝납니다.


1

RProgN 2 , 7 + 7 = 14 바이트

인쇄 주문을 남용하는 대신 RProgN을 더 잘 사용하려고 노력하고 싶었습니다.

1
«\1\-

과...

0
«\1\-

설명

1   # Push the constant, 1. (Or 0, depending on the program)

«\1\-
«       # Define a function from this to the matching », in this case there isn't any, so define it from this to the end of the program, then continue processing.
 \      # Flip the defined function under the constant.
  1\-   # Get 1 - Constant.

이렇게하면 스택이 거꾸로 인쇄되므로 새 상수가 먼저 인쇄 된 다음 함수의 문자열 버전이 인쇄됩니다.

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


1

로고 , 65 + 66 = 131 바이트

apply [(pr ? ` [[,? ,-?2]] )] [[apply [(pr ? ` [[,? ,-?2]] )]] 1]

apply [(pr ? ` [[,? ,-?2]] )] [[apply [(pr ? ` [[,? ,-?2]] )]] -1]

1

파이썬 3, 74 + 74 = 148 바이트

a='a=%r;b=%r;print(b%%(b,a))';b='b=%r;a=%r;print(a%%(a,b))';print(b%(b,a))

b='b=%r;a=%r;print(a%%(a,b))';a='a=%r;b=%r;print(b%%(b,a))';print(a%(a,b))

나도 이해 못해


1

> <> , 12 + 12 = 24 바이트

'3d*!|o|!-c:

':c-!|o|!*d3

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

두 프로그램 모두 줄 바꿈 문자열 리터럴을 사용하여 코드를 스택에 추가 한 다음 '다른 방법을 통해 명령을 생성합니다 . 스택을 인쇄 할 때 코드를 뒤로 밀지 만 '앞쪽에 유지됩니다. 를 생성하는 몇 가지 변형이 있습니다 '. 3d*, d3*, 00g, :c-때와 짝 3d*:9-함께 짝을 00g.

13 * 2 바이트의 Befunge-98에 게시 하기에는 너무 비슷한 솔루션

"2+ck, @,kc+2


0

자바 스크립트 (ES6), 36 + 36 = 72 바이트

프로그램 1 :

f=n=>('f='+f).replace(/4|5/g,n=>n^1)

프로그램 2 :

f=n=>('f='+f).replace(/5|4/g,n=>n^1)

이 프로그램은 자신을 복제하여 작동 및 교체 5와 함께 44함께5

console.log((
    f=n=>('f='+f).replace(/4|5/g,n=>n^1)
)())
console.log((
    f=n=>('f='+f).replace(/5|4/g,n=>n^1)
)())


2
이것은 quine 태그가 붙어 있기 때문에 , 이것은 자신의 소스를 읽으므로 일반적으로 "부정 행위의 quine"으로 간주됩니다. 그것에 대한 OP의 결정이 무엇인지 확실하지 않지만 일반적으로 허용되지 않습니다.
Stephen

0

클라인 , 26 24 바이트

<:3+@+3<:"

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

설명

이것은 내 Klein Quine 과 동일하게 작동합니다 . 여기서 소스를 거꾸로 인쇄 한 다음 a를 "봅니다. 마지막 소스 는 회문으로 인해 사라졌습니다. 따라서 우리가해야 할 일은 기능을 손상시키지 않고 비 회문으로 만듭니다. 으로는 전환 <:우리는 기능을 방해하지 않고이 작업을 수행 할 수 있었다.


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