자동 사이 클러 퀴


11

엉망이지만 비틀기.

성명서

quine은 코드를 인쇄하지만 첫 문자를 끝에 놓습니다.
(반대로 할 수 있지만 답에 해당 메모를 포함 시키십시오)
출력은 솔루션이기도 한 프로그램이어야합니다.

예 : 코드가 있다고 가정하면 코드를 foobar실행하면 oobarf다른 유효한 프로그램 이 반환 됩니다.

foobar -> oobarf
oobarf -> obarfo
obarfo -> barfoo
barfoo -> arfoob
arfoob -> rfooba
rfooba -> foobar

규칙

  • 귀하의 코드 분명히 다른 사람의 코드를 훔친 결과물이 아니어야합니다.
  • 코드는 2 자 이상이어야합니다 (짧은 코드는 재미 있지 않습니다)
  • 코드에는 적어도 두 개의 다른 문자가 포함되어야합니다 (예 : +++유효하지 않음)

채점

A와 짧은 코드 승에 도전.



3
@DomHastings 당신은 그것을 게시하는 개월이 있었다.
mbomb007

2
@ IQuick143> 2 자 이상이 말한 이유에 대한 좋은 요구 사항이라고 생각합니다
dylnan

5
겠습니까 는 '회전 quine'등의 수는? ; p
Kevin Cruijssen

3
@ mbomb007 이것이 가능한 언어를 찾는 것은 도전의 일부입니다
IQuick 143

답변:


19

Befunge-98 (PyFunge) , 2600 바이트

ab*1'3:*2+*0pnd3*:::::::::::::::1'3:*3+*0p1'3:*5+*0p1'3:*d+*0p1'3:*f+*0p1'3:*fa++*0p1'3:*fd++*0p1'4'3*f-*0p1'4'3*7-*0p1'4'3*5-*0p6:*:*4-1p6:*:*4+1p6:*:*8+1p6:*:*a+1p6:*:*8+2p6:*:*f1++2p6:*:*f3++2pn75*1-:1'3:*4+*0p6:*:*f2++2pnaa*:::::::::::::::::1'3:*6+*0p1'3:*7+*0p1'3:*f1++*0p1'3:*f2++*0p1'3:*fe++*0p1'3:*ff++*0p1'4'3*e-*0p1'4'3*d-*0p1'4'3*4-*0p1'4'3*3-*0p6:*:*3-1p6:*:*2-1p6:*:*b+1p6:*:*c+1p6:*:*9+2p6:*:*a+2p6:*:*f4++2p6:*:*f5++2pn67*::::::::::1'3:*8+*0p1'3:*a+*0p1'3:*f4++*0p1'3:*f5++*0p1'4'3*f-5-*0p1'4'3*c-*0p1'4'3*2-*0p6:*:*1-1p6:*:*d+1p6:*:*b+2p6:*:*f6++2pna5*::1'3:*9+*0p1'3:*f3++*0p6:*:*1pn68*:::::1'3:*b+*0p1'3:*f8++*0p1'4'3*f-2-*0p1'4'3*9-*0p1'4'3*1+*0p6:*:*f7++2pne8*:::::::1'3:*c+*0p1'3:*f9++*0p1'4'3*f-1-*0p1'4'3*8-*0p1'4'3*2+*0p6:*:*f2++1p6:*:*f+2p6:*:*f8++2pnf4*:1'3:*e+*0p1'4'3*3+*2pn77*::::1'3:*f6++*0p1'4'3*f-4-*0p6:*:*f1++1p6:*:*c+2p6:*:*e+2pnb4*1-::1'3:*f7++*0p6:*:*f+1p6:*:*d+2pnf4*1-::1'3:*fb++*0p6:*:*7+2p1'3:*1+*2pnf4*2-1'3:*fc++*0pn95*:::1'4'3*f-3-*0p1'4'3*a-*0p1'4'3**0p6:*:*1+1pn87*1'4'3*b-*0pnac*2-:1'4'3*6-*0p1'4'3*3+*0pnf4*3-1'4'3*1-*0pn88*2-6:*:*5-1pnc9*1-6:*:*2+1pnb4*:6:*:*3+1p6:*:*6+1pn88*6:*:*9+1pnd4*1-6:*:*e+1pnc8*2-:1'3:**1p1'3:**2pnd7*2+6:*:*4+2pn75*6:*:*6+2pn>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ab*1'3:*2+*0pnd3*:::::::::::::::1'3:*3+*0p1'3:*5+*0p1'3:*d+*0p1'3:*f+*0p1'3:*fa++*0p1'3:*fd++*0p1'4'3*f-*0p1'4'3*7-*0p1'4'3*5-*0p6:*:*4-1p6:*:*4+1p6:*:*8+1p6:*:*a+1p6:*:*8+2p6:*:*f1++2p6:*:*f3++2pn75*1-:1'3:*4+*0p6:*:*f2++2pnaa*:::::::::::::::::1'3:*6+*0p1'3:*7+*0p1'3:*f1++*0p1'3:*f2++*0p1'3:*fe++*0p1'3:*ff++*0p1'4'3*e-*0p1'4'3*d-*0p1'4'3*4-*0p1'4'3*3-*0p6:*:*3-1p6:*:*2-1p6:*:*b+1p6:*:*c+1p6:*:*9+2p6:*:*a+2p6:*:*f4++2p6:*:*f5++2pn67*::::::::::1'3:*8+*0p1'3:*a+*0p1'3:*f4++*0p1'3:*f5++*0p1'4'3*f-5-*0p1'4'3*c-*0p1'4'3*2-*0p6:*:*1-1p6:*:*d+1p6:*:*b+2p6:*:*f6++2pna5*::1'3:*9+*0p1'3:*f3++*0p6:*:*1pn68*:::::1'3:*b+*0p1'3:*f8++*0p1'4'3*f-2-*0p1'4'3*9-*0p1'4'3*1+*0p6:*:*f7++2pne8*:::::::1'3:*c+*0p1'3:*f9++*0p1'4'3*f-1-*0p1'4'3*8-*0p1'4'3*2+*0p6:*:*f2++1p6:*:*f+2p6:*:*f8++2pnf4*:1'3:*e+*0p1'4'3*3+*2pn77*::::1'3:*f6++*0p1'4'3*f-4-*0p6:*:*f1++1p6:*:*c+2p6:*:*e+2pnb4*1-::1'3:*f7++*0p6:*:*f+1p6:*:*d+2pnf4*1-::1'3:*fb++*0p6:*:*7+2p1'3:*1+*2pnf4*2-1'3:*fc++*0pn95*:::1'4'3*f-3-*0p1'4'3*a-*0p1'4'3**0p6:*:*1+1pn87*1'4'3*b-*0pnac*2-:1'4'3*6-*0p1'4'3*3+*0pnf4*3-1'4'3*1-*0pn88*2-6:*:*5-1pnc9*1-6:*:*2+1pnb4*:6:*:*3+1p6:*:*6+1pn88*6:*:*9+1pnd4*1-6:*:*e+1pnc8*2-:1'3:**1p1'3:**2pnd7*2+6:*:*4+2pn75*6:*:*6+2pn>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

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

이것이 지옥 축제였습니다.

작동 방식 :
프로그램은 프로그램 B를 자체적으로 어셈블 한 소스 바이트의 절반을 두 번 인쇄 한 put 문입니다.
이 프로그램은 실제로 1300 바이트 프로그램의 사본 2 개이므로 전체 1300 바이트 프로그램이 항상 전체로 실행됩니다.

더 나은 설명 :
모든 비 펀지-98 quine 심볼을 같은 포함 할 필요가 @또는 q,
문제 : 그 상징 중에 있기 때문에 Especialy는 점을 시작하는 좋은 없습니다 @q즉시 프로그램을 종료합니다.
해결책 : 소스 코드에서 해당 문자를 제거하십시오

문제 : 어떻게?
솔루션 : p(put) 명령을 사용 하여 소스 코드를 수정하여 1 바이트만큼 이동 된 소스 코드를 포함하고 부정 행위를 하는 명령을 사용 하지 않는 필수 문자를 포함하십시오 g.

문제점 : (이것이 언제 끝날까요)
put 명령은 n x y문자, x-coord, y-coord를 결정하는 3 개의 값 을 팝니다. 그러나이 값의 초기화가 반으로 나뉘면 시작 소스 코드에 잘못된 문자를 쓸 수 있습니다. quining.
해결책 : (마지막 약속)
소스 코드 2 부를 사용하십시오. 후자는 "올바른 것"입니다. 이것은 실수로 반으로 나눈 put 문 (p 명령 + 상수 이니셜 라이저)이 다른 문제를 수정합니다. 실행되지 않으면, 각 명령문의 사본 2 개를 갖도록 수정됩니다. 이것이 작동해야하는 마지막 것은 전체 소스 코드를 반으로 만드는 방법입니다.

답변 :
그들이 말하는 1000 단어의 이미지.  그런 다음 그들은 Piet를 만들었습니다.

이것은 문자열 바이트의 두 사본이 이동 한 이유 == 바이트 시프트 된 문자열의 두 사본이 표시되는 이유에 대한 시각적 증거입니다. 즉, 우리는 코드의 절반을 가져 와서 바이트 시프트 한 다음 두 번 인쇄 할 수 있습니다 (또는 코드의 절반을 가져 와서 바이트 시프트, 인쇄, 반복 [실제로 발생하는 상황])

구현 방법 : 0123456789abcdef가 소스라고 가정

유사 코드 :

0123456789abcv;;"123456789abcdef" < go this way <--
             >PS'0,   repeat 2x   ^

PS는 인쇄 스택 (실제 지침이 아님)을 의미합니다. 우리는 소스 코드의 절반을 스택으로 역순으로 푸시 ""한 다음 스택을 인쇄 한 다음 앞에 이동 '하는 첫 번째 문자 0를 가져오고 ( 명령) '바이트 이동을 일으키는 마지막 문자 를 인쇄 한 다음 사이클을 반복합니다 한 번 더 두 번째 사본을 인쇄하십시오. 처리해야 할 기술 중 하나는 소스 내부의 기호입니다. 소스 코드를 실행하는 동안 코드를 작성하면 문제가 발생할 수 있습니다. 외부에서 처리하는 put 문을 추가하여이 문제를 피했습니다.

이렇게하면 코드가 다음과 같이 보입니다. 암호

설명 :
초록색 강조 표시 : 소스에 문자를 추가하는 코드
회색 문자 (시인성이 좋지 않은 문제) 녹색 코드에 의해 추가되는 코드
빨간색 강조 표시 : 소스 코드의 후반 첫 문자를 파란색 영역으로 이동시키는 코드 .
파란색 강조 표시 : 빨간색 강조 표시
주황색 강조 표시 : @노란색 영역에 (종료) 명령을 넣어 2 바이트 시프트 사본을 쓴 후 종료되도록하는 코드입니다 .

화살표는 코드 흐름이 어떻게 진행되는지 더 명확하게 만들어야합니다.

다음은 마지막으로 힘든 부분 온다
어디 할 아기의 소스 코드에서 온은?

짧은 대답 : C # Magic
긴 대답 : 100 개 이상의 C # 코드로 컴파일 된 Befunge 코드 스 니펫. 수동으로 약 100 개의 상수 이니셜 라이저 (특정 숫자를 스택으로 푸시하는 befunge 코드 조각)를 작성한 다음 사용자 정의 C # 프로그램을 사용하여 1300 바이트 Befunge 출력으로 컴파일하여 두 번 복사하여 마지막으로 만들었습니다. 프로그램.

아직 여기 있어요? 읽어 주셔서 감사합니다! (또는 적어도 끝까지 스크롤)
나는 나쁜 농담이 재미 있고 성 가시지 않기를 바랍니다.

참고 :이 코드에서 put 문은 부정 행위가 될 ag 명령을 생성하지 않습니다.

편집 : 개발자 도구를 사용하여 TIO에서 다음 Javascript 코드를 사용하여 코드를 확인했습니다.

setInterval(()=>{document.getElementById("code").value = 
document.getElementById("output").value; 
document.getElementById("run").click();}, 2000);

나는 완전한 설명을 정말로 기대하고 있지만, 이것은 꽤 업적처럼 보이며 현상금을받을 가치가 있습니다!
Nathaniel

1
@Nathaniel 전체 설명이 되었으면 좋겠습니다. 희망합니다! : D
IQuick 143

1
p잘못된 주장을 다루는 데있어 그 부분 은 천재입니다.
leo3065

@ leo3065 감사합니다 :)
IQuick 143

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