부정 행위 주기적 Quine


19

개념

프로그래밍 언어로 코드를 출력하는 프로그램을 작성하십시오. 이 코드는 실행될 때 원래 프로그램을 출력해야합니다.

규칙

  • 이것은 부정 행위의 기사이므로 원본 소스 코드를 읽을 수 있습니다.
  • 첫 번째 출력 프로그램은 원래 프로그램과 동일한 언어로되어 있어야합니다.
  • 규칙적인 퀴인을 출력 할 수 없습니다. 두 프로그램은 달라야합니다.
  • 표준 허점이 적용됩니다.
  • 이것은 이므로 최단 답변이이기는하지만 선택되지는 않습니다.

나는 아직도 세미 퀸을 구성하는 것이 확실하지 않습니다.
Conor O'Brien

ConorO'Brien @ 원래 프로그램이 출력하는 출력 프로그램
dkudriavtsev

1
내가 참조. 문구는 매우 모호합니다.
Conor O'Brien

2
최단 답변을 선택하지 않는 이유는 무엇입니까? 이 카탈로그입니까?
ATaco

1
기록을 위해, 나는 그것을 상호 퀴즈 라고 부릅니다 (도전에는 다른 언어 가 필요합니다 ).
Martin Ender

답변:



21

달팽이, 0 바이트



두 번째 프로그램은

1

첫 번째 프로그램은 빈 입력에서 빈 패턴의 일치 횟수를 계산합니다 (실제로 영역 0을 갖지만 프로그램은 빈 입력에서 인쇄 할 항목을 결정할 수 있도록 해킹으로 항상 한 번 이상 실행됩니다). 두 번째 프로그램은 ( {1}정규식 과 같은 ) 수량 자로 시작 하여 구문 분석 오류를 발생시킵니다. 프로그램이 성공적으로 구문 분석되지 않으므로 STDOUT은 빈 문자열입니다.


나는 아마도 이것을 한 언어가 있다고 생각했다 (즉, null 프로그램은 비어 있지 않은 결과로 성공하지만 그 결과는 프로그램으로 아무것도하지 않는다). 나는 HOMESPRING을 시도했지만 통역사가 작동하지 못했습니다. 그래도 작동하는 다른 언어를 찾은 것 같습니다. (통역사와 연결되어 있습니까?)


20

7 , 2 바이트

7은 3 비트 문자 세트를 사용하지만 입력을 바이트 단위로 압축합니다 (메타에 따르면 서브 바이트 문자 세트가있는 언어는 디스크의 파일에 바이트를 사용하여 계산 ). xxd프로그램 덤프는 다음과 같습니다 .

00000000: 4cf4                                     L.

이 파일을 7 인터프리터에 제공하면 다음 프로그램이 출력됩니다.

00000000: 4fa6 7f                                  O..

그런 다음 원래 프로그램을 다시 출력합니다.

무슨 일이야? 프로그램이 다른 방식으로 부정 행위를하고 있음에도 불구하고 소스 읽기는 포함되어 있지 않습니다 (실제로 7에서 소스를 읽을 수 있다고 생각하지 않습니다). 당신이 무슨 생각을하는지 제게 알려주세요. 프로그램 작동 방식은 다음과 같습니다. (각 7 개의 명령에는 두 가지 변형이 있으며 그 중 일부에는 이름이없고 원래 프로그램에 표시 할 수 없습니다. 총 12 개의 명령이 6 쌍으로되어 있습니다. 활성 명령에는 굵게 표시하고 수동에는 굵게 표시하지 않습니다. 활성 명령에 이름이없는 경우 해당 수동 명령과 동일한 이름을 지정하고 구분하기 위해 굵게 표시합니다. 예 7를 들어 1, 각 명령은 자체 이름을 가지며 굵은 체는 구문 강조입니다.)

231 7 23 8 진으로 압축 해제 된 원래 프로그램
231 스택에 237 을 밉니다
    23 스택 위로 23
             (암시 적) 프로그램에 스택 상단 사본을 추가하십시오.
      2       스택 상단 중복 (현재 23 )
        3      스택 상단 출력, 팝 두 번째 스택 요소

이 시점에서 7 인터프리터는 스택의 맨 위에 표시 할 수없는 명령 ( 23)이 포함되어 스택 의 맨 위를 이스케이프하여 생성합니다 723(즉). 첫 번째 명령 출력은 출력 형식을 선택합니다. 이 경우, 형식 7, "프로그램과 같은 방식으로 출력 형식화"입니다. 따라서 명령은 출력을 바이트로 묶습니다. 그런 다음 프로그램은 계속됩니다.

231 7 23 23
             (암시 적) 프로그램에 스택 상단 사본을 추가하십시오.
        2     스택 상단 중복 (현재 237 )
          3    스택 상단 출력, 두 번째 스택 팝 팝
           7   빈 요소를 스택으로 밀어

이 시점에서 스택에 빈 스택 요소가 없으므로 프로그램이 종료됩니다. 23더 일찍 출력 합니다. 우리가 탈출 할 수 없다면 237(그리고 표현할 수없는 명령이 포함되어 있기 때문에)7231 . 그것은 직접 출력되어 프로그램의 최종 출력을 만듭니다 237231( 프로그램 과 같은 방식으로 포맷 됩니다 (즉, 바이트로 묶음)). 그렇습니다 4fa67f. ( 1출력에 영향을 미치는 측면에서 전적으로 의미가 없다는 것을 알 수 있습니다. 두 프로그램을 다르게 만드는 이유는 이것뿐입니다.)

달리기는 237231거의 같은 방식으로 진행됩니다. 차이점은 1첫 번째 인쇄 직후에 쓸모없는 실행 이 있다는 것입니다 (그리고 프로그램의 현재 끝에 도달하면 두 번째로 빈 요소가 암시 적으로 삭제됩니다). 다시 말하지만, 결과 231는 스스로 출력됩니다.23 끝나고 출력 자체가 앞에 7와서 231723원래 프로그램을 얻습니다 .

관찰자는 두 프로그램이 언어의 "네이티브"8 진에서 동일한 길이 임에도 불구하고 디스크에서 길이가 다르다는 것을 알 수 있습니다. 7 개의 프로그램은 1 비트의 임의의 수로 채워질 수 있고 패킹 된 형식은 후행 패딩을 버립니다. 인코딩 방법은 다음과 같습니다.

2  3  1  7  2  3
010011001111010011(1...)
4   c   f   4   padding

다시 말해, 2 바이트 4C F4는 프로그램을 표현하기에 충분하므로 이것이 전부입니다.


11

파이썬 3 297 279 251 243 225 218 208 180 126 111 바이트

부정 행위 :

A=''';print(("A="+("'"*3+A)*2).translate({65:66,66:65}))''';print(("A="+("'"*3+A)*2).translate({65:66,66:65}))

인쇄합니다 :

B=''';print(("B="+("'"*3+B)*2).translate({65:66,66:65}))''';print(("B="+("'"*3+B)*2).translate({65:66,66:65}))

실행될 때 원래 프로그램을 인쇄합니다.


와! 멋있는! 나는 그런 생각을하지 않았을 것입니다.
dkudriavtsev

8

배치, 14 바이트

@echo @type %0

cyclicquine.bat출력으로 실행할 때

@type cyclicquine.bat

실행할 때 원래 배치 파일을 출력합니다.


8

RProgN , 4 바이트

지역 사회는 이런 종류의 것을 부정 행위의 퀴니로 간주 하여 기준을 충족시킵니다.

1
2

후행 줄 바꿈으로.

이것은 인쇄

2
1

후행 줄 바꿈으로 첫 번째 코드를 인쇄합니다.

RProgN은 스택 터지는 것을 위에서 아래로 인쇄합니다.

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


1\n1\nRProgN에서 비 부정 행위가 될 것이라는 것을 암시하는 채팅 토론이있었습니다. 왜냐하면 각 1이 서로 인쇄하기 때문입니다. 이 모든 것이 실제로 암시하는 것은 때때로 부정 행위를 정의하기가 어렵다는 것입니다. (단, 질문은 실제로 부정

또한, 말하기를 꺼려했지만 RProgN 1\n에서는 기술적으로 유효한 퀴인 입니다 1. 상수는 아니지만 1스택으로 푸시하는 함수를 호출하는 것입니다 .
ATaco

사용중인 적절한 quine에 대한 여러 정의가 있습니다. 적어도 하나는 유효하지 않지만 다른 일부는 유효 할 수 있습니다.

@ ais523 당신은 나의 호기심을 불러 일으켰습니다. 당신은 RProgN을 지정했지만 내 작은 언어가 그다지 (또는 어떤)주의를 끌지 않았다고 생각하지 않았습니다. 특히 RProgN에 대한 대화입니까, 아니면 비슷한 구문을 가진 언어입니까?
ATaco

7 인데, 프로그램의 세그먼트를 "뒤로"인쇄하는 경향이 있습니다. 나는 거기에 주어진 의견을 외삽하고있었습니다.

6

줄프, 6 바이트

1q_a_q

실행하면 다음이 출력됩니다.

q_a_q1

결과적으로 출력 1q_a_q됩니다.

여기 사용해보십시오!

설명

1q_a_q
1       the digit one (ignored)
 q      the source code (ignored)
     q  the source code
    _   reversed
   a    and outputted
 _      and reversed (ignored)

q_a_q1
q       the source code (ignored)
     1  the digit one (ignored)
    q   the source code
   _    reversed
  a     and outputted
 _      and reversed (ignored)

5

자바 스크립트 (ES6), 69 60 59 바이트

(_0=_=>console.log(`(_0=${_0})()`.replace(/0/g,n=>+!+n)))()

출력 :

(_1=_=>console.log(`(_1=${_1})()`.replace(/1/g,n=>+!+n)))()

-1 바이트 (@ETHProductions) : \ d 대신 정규식에서 0을 사용하십시오.


n=>1-n대신 사용해보십시오 n=>+!+n.
Conor O'Brien

@Conner O'Brien 불행히도 1결국 정규 표현식으로 대체됩니다.
darrylyeo

@ETHproductions Heh, 나는 그것을 생각해야했다.
darrylyeo



1

> <>, 16 바이트

"$r00gol?!;50.01

여기 사용해보십시오!

출력

"$r00gol?!;50.10

이것은 여기에 제공된 수정입니다 . 부정 행위인지 확실하지 않으며 코드 상자를 읽고 출력합니다.


1
00g를 : 2-로 변경할 수 있으며 코드 상자를 읽지 않고도 동일한 바이트 수를 유지합니다.
청록 펠리칸

@Tealpelican, 감사합니다! 목표는 그것이 "속임수"로 간주되는 것입니다 : p. (그리고 나는 그 규칙을 완전히 이해하지 못합니다)
redstarcoder
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.