개념
프로그래밍 언어로 코드를 출력하는 프로그램을 작성하십시오. 이 코드는 실행될 때 원래 프로그램을 출력해야합니다.
규칙
- 이것은 부정 행위의 기사이므로 원본 소스 코드를 읽을 수 있습니다.
- 첫 번째 출력 프로그램은 원래 프로그램과 동일한 언어로되어 있어야합니다.
- 규칙적인 퀴인을 출력 할 수 없습니다. 두 프로그램은 달라야합니다.
- 표준 허점이 적용됩니다.
- 이것은 코드 골프 이므로 최단 답변이이기는하지만 선택되지는 않습니다.
프로그래밍 언어로 코드를 출력하는 프로그램을 작성하십시오. 이 코드는 실행될 때 원래 프로그램을 출력해야합니다.
답변:
두 번째 프로그램은
1
첫 번째 프로그램은 빈 입력에서 빈 패턴의 일치 횟수를 계산합니다 (실제로 영역 0을 갖지만 프로그램은 빈 입력에서 인쇄 할 항목을 결정할 수 있도록 해킹으로 항상 한 번 이상 실행됩니다). 두 번째 프로그램은 ( {1}
정규식 과 같은 ) 수량 자로 시작 하여 구문 분석 오류를 발생시킵니다. 프로그램이 성공적으로 구문 분석되지 않으므로 STDOUT은 빈 문자열입니다.
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 인터프리터는 스택의 맨 위에 표시 할 수없는 명령 ( 2
및 3
)이 포함되어 스택 의 맨 위를 이스케이프하여 생성합니다 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
는 프로그램을 표현하기에 충분하므로 이것이 전부입니다.
부정 행위 :
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}))
실행될 때 원래 프로그램을 인쇄합니다.
지역 사회는 이런 종류의 것을 부정 행위의 퀴니로 간주 하여 기준을 충족시킵니다.
1
2
후행 줄 바꿈으로.
이것은 인쇄
2
1
후행 줄 바꿈으로 첫 번째 코드를 인쇄합니다.
RProgN은 스택 터지는 것을 위에서 아래로 인쇄합니다.
1\n1\n
RProgN에서 비 부정 행위가 될 것이라는 것을 암시하는 채팅 토론이있었습니다. 왜냐하면 각 1이 서로 인쇄하기 때문입니다. 이 모든 것이 실제로 암시하는 것은 때때로 부정 행위를 정의하기가 어렵다는 것입니다. (단, 질문은 실제로 부정
1\n
에서는 기술적으로 유효한 퀴인 입니다 1
. 상수는 아니지만 1
스택으로 푸시하는 함수를 호출하는 것입니다 .
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)
(_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
.
1
결국 정규 표현식으로 대체됩니다.
rev $0 # 0$ ver
@izabera 덕분에 -3
Bash
, Tac
`레브, 그리고?
rev $0 # 0$<space><space>ver
어떤 이유로 내가 코멘트에 두 개의 공백을 넣을 수 없습니다
tac
rev
-ed는 cat
입니다.
"$r00gol?!;50.01
출력
"$r00gol?!;50.10
이것은 여기에 제공된 수정입니다 . 부정 행위인지 확실하지 않으며 코드 상자를 읽고 출력합니다.