상호 배타적 Quines


27

당신의 도전은 간단합니다. 서로 출력하는 문자를 공유하지 않는 두 개의 프로그램을 작성하십시오.

다음과 같은 경우 두 프로그램 PQ 는 상호 배타적 퀴입니다.

  1. P 출력 Q
  2. Q 출력 P
  3. PQ 모두에 속하는 문자 c 는 없습니다
  4. 각 프로그램 PQ적절한 quines입니다
    1. 이것은 빈 quine과 자신의 소스 코드를 읽는 quine을 invalid로 계산 합니다.

더 많은 규칙

  • 이 프로그램의 가장 짧은 결합 길이가 이깁니다. 즉, size ( P ) + size ( Q )가 점수이며 가장 낮은 점수가 이깁니다.
  • 두 프로그램 모두 같은 언어로되어 있습니다
  • 각 프로그램은 전체 프로그램 또는 기능 일 수 있으며 같을 필요는 없습니다.
    • 예를 들어, P 는 풀 프로그램이고 Q 는 함수일 수 있습니다.

확인

이것은 온라인으로보십시오! 스 니펫은 두 프로그램이 상호 배타적인지 여부를 확인할 수 있습니다. 입력은 처음 두 인수에 배치됩니다.




3
서로의 출처를 읽는 두 프로그램도 금지되어 있다고 가정합니다.
주세페

2
이 도전에 대한 비-에 소랑 답변을보고 싶습니다. (나는 그것을하는 방법에 대해 약간의 생각을 가지고 있었지만 지금까지는 방법을 보지 못했습니다. 대소 문자를 구분하지 않고 알파벳이 아닌 문자에 많이 의존하지 않기 때문에 Forth에서는 가능할 수 있습니다. )
Nathaniel

1
프로그램 자체가 아니라 두 프로그램의 컴파일러에 동일한 인수를 전달할 수 있다면. 일반적으로 컴파일러 플래그는 비용을 지불하면 허용되지만,이 과제에서는 상호 배타적 인 규칙에 위배된다고 주장 할 수 있습니다.
BlackCap

답변:


37

> <> , 점수 : 41 + 41 = 82

편집 : 둘 다 3을 포함했습니다.

'd3*}>a!o-!<<8:5@lI55>@z:5ll55>>q:>|q::|,

"r00gr40g44++bb+0p64++?b6+0.22#eW4s )Z

온라인으로 사용해보십시오! (다른 출력을 얻기 위해 라인을 바꾸십시오) 이번에는 검증으로!

><>문자를 출력하는 한 가지 방법 인 command가 있으므로 여기에서 사용하기에 특히 어려운 언어 o입니다. 다행히도, 우리가 사용할 수있는 페이지를 을 배치 명령 UT o내에서 같은 실행시 소스 코드에 자연 그대로의 세계에서 프로그래밍 대답.

이것은 많은 시행 착오를 겪었 습니다 . 나는 상호 배타적 인 두 가지 프로그램으로 시작했습니다.

'd3*}>N!o-!<<data

"r00gr40g8+X0pN+?Y0.data

각각은 첫 번째 빼기 및 두 번째 더하기 N에 의해 ​​자신과 데이터를 변환합니다. 그런 다음 이것을 반대로 출력합니다. 포인트는 각각의 프로그램 후에 데이터 N. 시프트 역방향의 다른 프로그램이 있다는 것이다 ( X프로그램 요구를 넣어 셀 번호 o와 Y 포인터는 위로 루프 셀하다. ?(가) 어디 o넣어이다) .

둘 다 서로 다른 방식으로 표현 된 동일한 구조를 따릅니다. 전체 코드에서 문자열 리터럴을 실행하여 스택에 추가합니다. 사용한 문자열 리터럴 명령을 다시 만들어 스택의 맨 아래에 놓습니다. 그들은 스택을 반복하여 각 문자에 N을 더하거나 빼고 인쇄합니다.

첫 번째 프로그램은 '문자열 리터럴로 사용 되며, 단순 d3*}값 39를 작성하여 스택 맨 아래로 푸시합니다. 두 번째는 "동일한 기능을 가진 문자열 리터럴로 사용 합니다. 그것은 r, 스택을 everses g세포 0,0에있는 문자를 ETS 다시 스택을 반전시킵니다. 그런 다음 g셀 4,0 ( g) 의 값 을 가져 o오고 8을 더하여 X에 넣습니다.

두 프로그램 모두 서로 다른 루핑 방법을 사용합니다. 첫 번째 프로그램은 skip 명령 ( !)을 사용하여 왼쪽으로가는 동안 명령의 절반 만 실행하고 방향을 반대로 전환하고 다른 절반을 실행합니다. 두 번째는 점프 명령 ( .)을 사용하여 셀 Y의 루프 시작으로 뒤로 건너 뜁니다. 둘 다 스택에 더 이상 항목이없고 프로그램 오류가 발생할 때까지 실행됩니다.

한 문자를 이동하면 해당 문자가 해당 프로그램에 필수적인 다른 문자로 바뀌므로 다른 프로그램의 데이터로 사용할 수 없기 때문에 N 값이 가장 낮은 여러 가지 문제가 발생했습니다. 두 프로그램은 같은 캐릭터로 바뀔 것입니다. 예를 들면 다음과 같습니다.

  1. ++1 = ,= --1
  2. .+2 = 0
  3. *= --3
  4. g+4 = k= o-4

기타

결국 나는 a이 문제를 피할 수있는 10 ( )에 도달했습니다 . 시프트가 반전되는 짧은 버전이있을 수 있으며 첫 번째 프로그램은 N을 더하는 반면 두 번째 프로그램은 N을 뺍니다. 그러나 첫 번째 프로그램은 일반적으로 ASCII 스케일의 하단에 있기 때문에 더 나빠질 수 있으므로 빼는 것이 충돌을 피하는 것이 좋습니다.


19

넷째 (64 비트 little-endian gforth) , 428 + 637 = 1065 바이트

s"	:	l	bl	-	;	:	m	l	emit	;	:	s	space	;	:	z	m	m	m	m	s	;	:	p	.	't	'i	'm	'e	z	;	'e	'r	'e	'h	z	:	q	>r	char	l	bl	l	do	dup	@	.	'L	m	s	cell+	loop	r>	.	;	:	n	'e	'p	'y	't	z	;	q	;	's	p	'B	l	p	#tab	p	'p	'u	'd	'Q	char+	z	n	'B	l	p	n":	l	bl	-	;	:	m	l	emit	;	:	s	space	;	:	z	m	m	m	m	s	;	:	p	.	't	'i	'm	'e	z	;	'e	'r	'e	'h	z	:	q	>r	char	l	bl	l	do	dup	@	.	'L	m	s	cell+	loop	r>	.	;	:	n	'e	'p	'y	't	z	;	q	;	's	p	'B	l	p	#tab	p	'p	'u	'd	'Q	char+	z	n	'B	l	p	n
HERE 3245244174817823034 , 7784873317282429705 , 665135765556913417 , 7161128521877883194 , 682868438367668581 , 679209482717038957 , 680053688600562035 , 678116140452874542 , 682868623551327527 , 680649414991612219 , 682868636436227367 , 7136360695317203258 , 7809815063433470312 , 8458896374132993033 , 5487364764302575984 , 7810758020979846409 , 680166068077538156 , 4181938639603318386 , 8081438386390920713 , 8793687458429085449 , 2812844354006760201 , 7784826166316108147 , 676210045490917385 , 681493840106293616 , 7521866046790788135 , 679491013524025953 , 7928991804732031527 , 216 115 EMIT 34 EMIT 9 EMIT 2DUP TYPE 34 EMIT TYPE 

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

확인 스크립트

Forth를 사용한다는 아이디어에 대해 @Nathaniel 에게 감사를 전했다. 그는 Forth가 대소 문자를 구분하지 않는다는 의견을 상기시켰다 . 그런 다음 분위기가 바뀌 었습니다. 이것이 작동하지 않는 이유를 찾은 다음이 문제에 대한 해결책을 계속해서 반복했습니다. 실내 트레이닝 자전거를 뒤집어 놓은 모양의 피젯 스피너처럼 돌리면서 핸들 바의 한쪽 끝을 잡고 약간 기울여야합니다.

이 프로그램을 작성하기 전에 어떤 프로그램에서 어떤 문자를 사용할 수 있는지 작성했습니다. 특히 두 번째 프로그램은 대문자, 10 진수, 탭 및 쉼표 만 사용할 수 있습니다. 이것은 첫 번째 프로그램이 모두 소문자임을 의미하지만 ASCII 값으로 대문자를 사용했습니다.

탭이 다루기 어려우므로 설명에 공백을 대신 사용합니다.

첫 번째 프로그램의 형식은 s" code"code-는 s"표준 프레임 워크 quine - 다음 코드의 두 번째 복사본에 의해 처리되는 문자 스트링을 시작한다. 그러나 자체 소스 코드를 출력하는 대신 다음과 같은 다른 프로그램을 작성합니다.

  • HERE
  • 원래 문자열에서 8 바이트마다 64-bit-number-literal ,
  • length-of-the-string
  • 115 EMIT 34 EMIT 9 EMIT 2DUP TYPE 34 EMIT TYPE

이것은 Forth의 데이터 공간을 사용합니다. HERE현재 할당 된 데이터 공간 영역의 끝에 포인터를 반환하고 ,숫자로 채워진 셀을 추가합니다. 따라서 처음 세 글 머리 기호는을 사용하여 만든 문자열 리터럴처럼 보일 수 있습니다 s". 두 번째 프로그램을 마치려면 :

  • EMIT ASCII 값이 주어진 문자를 출력합니다.
    • 115 EMIT 소문자를 인쇄합니다 s
    • 34 EMIT 따옴표 문자를 인쇄합니다 "
    • 9 EMIT 탭을 인쇄합니다
  • 2DUP스택의 최상위 두 요소를 복제합니다 ( a b -- a b a b ). 여기서 포인터와 문자열의 길이입니다.
  • TYPE 코드의 첫 번째 사본을 출력하기 위해 문자열을 인쇄합니다.
  • 34 EMIT닫는 따옴표를 인쇄 "하고 마지막으로
  • TYPE 코드의 두 번째 사본을 출력합니다.

첫 번째 프로그램이 어떻게 작동하는지 봅시다. 대부분의 경우 'x문자 리터럴에 gforth 구문 확장을 사용 하고 때로는 공백의 ASCII 값을 빼는 숫자를 피해야 합니다 bl.

s" ..."      \ the data
: l bl - ;   \ define a word, `l`, that subtracts 32
: m l emit ; \ define a word, `m`, that outputs a character. Because 32 is
             \ subtracted using `l`, lowercase characters are converted to
             \ uppercase, and uppercase characters are converted to some
             \ symbols, which will become useful later
: z m m m m space ; \ `z` outputs four characters using `m`, followed by a
                    \ space. This is very useful because all words used in the
                    \ second program are four characters long
: p . 't 'i 'm 'e z ; \ define a word, `p`, that, given a number, outputs that
                      \ number, followed by a space, `EMIT`, and another space
'e 'r 'e 'h z \ here is where outputting the second program starts - `HERE `
: q \ define a helper word, `q`, that will be called only once. This is done
    \ because loop constructs like do...loop can't be used outside of a word.
  >r \ q is called with the address and the length of the data string. >r saves
     \ the length on the return stack, because we don't need it right now. While
     \ it might seem like this is too complicated to be the best way of doing
     \ this for codegolf, just discaring the length would be done using four
     \ characters - `drop`, which would give you the same bytecount if you could
     \ get the length again in... 0 characters.
  char l \ get a character from after the call to q, which is `;`, with the
         \ ASCII value of $3B, subtract $20 to get $1B, the number of 64-bit
         \ literals necessary to encode the string in the second program.
  bl l \ a roundabout way to get 0
  do   \ iterate from 0 (inclusive) to $1B (exclusive)
    \ on the start of each iteration, the address of the cell we are currently
    \ processing is on the top of the stack.
    dup @ . \ print the value. The address is still on the stack.
    'L m space \ the ASCII value of L is exactly $20 larger than the one of ,
    cell+ \ go to the next cell
  loop
  r> . \ print the length of the string
;
: n 'e 'p 'y 't z ; \ define a word, `n`, that outputs `TYPE`
q ; \ call q, and provide the semicolon for `char` (used to encode the length
    \ of the string in 64-bit words). Changing this to an uppercase U should
    \ make this work on 32-bit systems, but I don't have one handy to check that
's p \ print the code that outputs the lowercase s
'B l p \ likewise, 'B l <=> $42 - $20 <=> $22 <=> the ASCII value of a comma
#tab p \ print the code that outputs a tab
'p 'u 'd 'Q char+ z \ char+ is the best way to add 1 without using any digits.
                    \ it is used here to change the Q to an R, which can't be
                    \ used because of `HERE` in the second program. R has an
                    \ ASCII value exactly $20 larger than the ASCII value of 2,
                    \ so this line outputs the `2DUP`.
n 'B l p n \ output TYPE 34 EMIT TYPE to finish the second program. Note the
           \ that the final `n` introduces a trailing space. Trying to remove
           \ it adds bytes.

이 작업을 마치기 위해을 사용하려고 EVALUATE했지만 두 번째 프로그램이 위에 표시된 두 프로그램보다 더 커졌습니다. 어쨌든, 여기 있습니다 :

: s s" ; s evaluate"s" : l bl - ; : m l emit ; : d here $b $a - allot c! ; : c here swap dup allot move ; : q bl l do #tab emit dup @ bl l u.r cell+ #tab emit 'L m loop ; here bl 'B l 's bl 's bl 'Z l d d d d d d d -rot c bl 'B l 's 'B l d d d d s c 'B l d c 'e 'r 'e 'h m m m m 'A q #tab emit 'e 'p 'y 't m m m m"; s evaluate

s" ..."...접근 방식 을 능가하는 수준으로 골프를 치르는 경우 계속 진행하여 자신의 답변으로 게시하십시오.


1
큰! 내 의견이이 솔루션을 촉발하게 된 것을 기쁘게 생각합니다!
Nathaniel

16

Perl, (311 + 630 = 941 바이트) 190 + 198 = 388 바이트

두 프로그램 모두 표준 출력으로 인쇄됩니다.

첫 번째 perl 프로그램은 대부분 인쇄 가능한 ASCII 문자와 개행 문자를 포함하며 정확히 하나의 개행 문자로 끝나지만 두 문자 ÿ는 ASCII가 아닌 바이트 \ xFF를 나타냅니다.

@f='^"ÿ"x92;@f=(@f,chr)for 115,97,121,36,126,191,153,194,216,113;print@f[1..5,5,10,5..9,0,9,0,5]'^"ÿ"x92;@f=(@f,chr)for 115,97,121,36,126,191,153,194,216,113;print@f[1..5,5,10,5..9,0,9,0,5]

두 번째는 대부분이 비 ASCII 바이트를 포함하며,이 게시물에서 별표로 대체되는 여러 개의 높은 제어 문자를 포함하며 개행은 전혀 없습니다.

say$~~q~¿*ÂØ¡Ý*Ý*ÆÍÄ¿*Â׿*Ó***Ö***ßÎÎÊÓÆÈÓÎÍÎÓÌÉÓÎÍÉÓÎÆÎÓÎÊÌÓÎÆËÓÍÎÉÓÎÎÌÄ*****¿*¤ÎÑÑÊÓÊÓÎÏÓÊÑÑÆÓÏÓÆÓÏÓʢءÝ*Ý*ÆÍÄ¿*Â׿*Ó***Ö***ßÎÎÊÓÆÈÓÎÍÎÓÌÉÓÎÍÉÓÎÆÎÓÎÊÌÓÎÆËÓÍÎÉÓÎÎÌÄ*****¿*¤ÎÑÑÊÓÊÓÎÏÓÊÑÑÆÓÏÓÆÓÏÓÊ¢~

첫 번째 프로그램의 16 진 덤프는 다음과 xxd같습니다.

00000000: 4066 3d27 5e22 ff22 7839 323b 4066 3d28  @f='^"."x92;@f=(
00000010: 4066 2c63 6872 2966 6f72 2031 3135 2c39  @f,chr)for 115,9
00000020: 372c 3132 312c 3336 2c31 3236 2c31 3931  7,121,36,126,191
00000030: 2c31 3533 2c31 3934 2c32 3136 2c31 3133  ,153,194,216,113
00000040: 3b70 7269 6e74 4066 5b31 2e2e 352c 352c  ;print@f[1..5,5,
00000050: 3130 2c35 2e2e 392c 302c 392c 302c 355d  10,5..9,0,9,0,5]
00000060: 275e 22ff 2278 3932 3b40 663d 2840 662c  '^"."x92;@f=(@f,
00000070: 6368 7229 666f 7220 3131 352c 3937 2c31  chr)for 115,97,1
00000080: 3231 2c33 362c 3132 362c 3139 312c 3135  21,36,126,191,15
00000090: 332c 3139 342c 3231 362c 3131 333b 7072  3,194,216,113;pr
000000a0: 696e 7440 665b 312e 2e35 2c35 2c31 302c  int@f[1..5,5,10,
000000b0: 352e 2e39 2c30 2c39 2c30 2c35 5d0a       5..9,0,9,0,5].

그리고 두 번째 프로그램의 16 진 덤프는 다음과 같습니다.

00000000: 7361 7924 7e7e 717e bf99 c2d8 a1dd 00dd  say$~~q~........
00000010: 87c6 cdc4 bf99 c2d7 bf99 d39c 978d d699  ................
00000020: 908d dfce ceca d3c6 c8d3 cecd ced3 ccc9  ................
00000030: d3ce cdc9 d3ce c6ce d3ce cacc d3ce c6cb  ................
00000040: d3cd cec9 d3ce cecc c48f 8d96 918b bf99  ................
00000050: a4ce d1d1 cad3 cad3 cecf d3ca d1d1 c6d3  ................
00000060: cfd3 c6d3 cfd3 caa2 d8a1 dd00 dd87 c6cd  ................
00000070: c4bf 99c2 d7bf 99d3 9c97 8dd6 9990 8ddf  ................
00000080: cece cad3 c6c8 d3ce cdce d3cc c9d3 cecd  ................
00000090: c9d3 cec6 ced3 ceca ccd3 cec6 cbd3 cdce  ................
000000a0: c9d3 cece ccc4 8f8d 9691 8bbf 99a4 ced1  ................
000000b0: d1ca d3ca d3ce cfd3 cad1 d1c6 d3cf d3c6  ................
000000c0: d3cf d3ca a27e                           .....~

두 번째 프로그램에서 따옴표로 묶은 문자열 (길이 189 바이트, 물결표로 구분)은 마지막 줄 바꿈을 제외한 전체 첫 번째 프로그램이며 각 바이트를 비트 단위로 보완하여 인코딩됩니다. 두 번째 프로그램은 ~연산자가 perl에서 수행 하는 각 바이트를 보완하여 단순히 문자열을 디코딩합니다 . 프로그램은 디코딩 된 문자열 다음에 줄 바꿈을 인쇄합니다 (이 say방법은 줄 바꿈을 추가 함).

이러한 구성에서, 제 2 프로그램의 디코더는 단지 6 개의 다른 ASCII 문자를 사용하므로, 제 1 프로그램은 ASCII 문자만을 포함하고이 6 개의 문자를 제외하는 한 실질적으로 임의적 일 수있다. 이 다섯 문자를 사용하지 않고 펄 프로그램을 작성하는 것은 어렵지 않습니다. 실제 퀴네 로직은 첫 번째 프로그램에 있습니다.

첫 번째 프로그램에서 quine logic은 11 워드 길이 사전을 사용하고 @f해당 워드의 출력을 어셈블합니다. 첫 번째 단어는 첫 번째 프로그램의 소스 코드 대부분을 반복합니다. 나머지 단어는 특정 단일 문자입니다. 예를 들어, 단어 5는 물결표로, 두 번째 프로그램에서 두 문자열 리터럴의 구분 기호입니다. 대괄호 사이의 숫자 목록은 단어를 어떤 순서로 인쇄 할 수있는 레시피입니다. 이것은 quines에 대한 일반적인 일반적인 구성 방법입니다.이 경우 유일한 비틀림은 첫 번째 사전 단어가 바이트 단위로 보완되어 인쇄된다는 것입니다.


14

하스켈 , 306 + 624 = 930 바이트

프로그램 1 : 더미 인수를 취하고 문자열을 반환하는 익명 함수.

(\b c()->foldr(\a->map pred)b(show()>>c)`mappend`show(map(map fromEnum)$tail(show c):pure b))"İĴİóđđđÝöÝâÝæÝääē××êääē××İēÀħđĮâħēĕóİóòòĮááħááđéêâéêēááĮÀħ""(\b c()->foldr(\a->map pred)b(show()>>c)`mappend`show(map(map fromEnum)$tail(show c):pure b))"

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

프로그램 2 : q[[40,...]]마지막에는 더미 인수를 취하고 문자열을 반환하는 익명 함수입니다.

z~z=[[['@','0'..]!!4..]!!z]
q[x,q]_=z=<<x++q++[34,34]++x
q[[40,92,98,32,99,40,41,45,62,102,111,108,100,114,40,92,97,45,62,109,97,112,32,112,114,101,100,41,98,40,115,104,111,119,40,41,62,62,99,41,96,109,97,112,112,101,110,100,96,115,104,111,119,40,109,97,112,40,109,97,112,32,102,114,111,109,69,110,117,109,41,36,116,97,105,108,40,115,104,111,119,32,99,41,58,112,117,114,101,32,98,41,41,34],[304,308,304,243,273,273,273,221,246,221,226,221,230,221,228,228,275,215,215,234,228,228,275,215,215,304,275,192,295,273,302,226,295,275,277,243,304,243,242,242,302,225,225,295,225,225,273,233,234,226,233,234,275,225,225,302,192,295]]

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

문자 세트 1 (공백 포함) :

 "$()-:>E\`abcdefhilmnoprstuw×ÝáâäæéêñòóöđēĕħĮİĴ

문자 세트 2 (개행 포함) :

!'+,.0123456789<=@[]_qxz~

세트 1에만 비 ASCII 문자가 포함되므로 UTF-8 바이트도 분리됩니다.

작동 원리

  • 프로그램 1은 일반적으로 람다 식, 공백 및 괄호, 내장 영숫자 함수를 자유롭게 사용하고 끝에 quine 데이터를 문자열 리터럴로 사용합니다.

    • 프로그램 1의 자체 핵심 코드는 단순히 따옴표로 묶어 문자열 리터럴 데이터로 변환됩니다.
      • 이를 지원하기 위해, 모든 백 슬래시 뒤에 a또는 b그 왕복 통해 유효한 이스케이프 시퀀스를 형성한다, show.
      • 또 다른 작은 이점은이다 a, bc프로그램 2가 사용하는 숫자 인코딩의 숫자를 저장하는 그의 ASCII 코드 적은 100보다 유일한 소문자가 있습니다.
    • 프로그램 2의 핵심 코드의 문자열 리터럴 인코딩은 비 ASCII 유니 코드를 사용하여 더 난독 화됩니다. 모든 문자는 원래 문자와 겹치지 않도록 코드 포인트에 182를 추가합니다.
      • 182는 128 이었지만, 182가 디코딩을 단축하기 위해 프로그램 1의 코드에 대한 문자열 리터럴 길이의 두 배라는 사실을 남용 할 수 있음을 깨달았습니다. 보너스로 프로그램 2는 줄 바꿈을 사용할 수 있습니다.
  • 프로그램 2는 일반적으로 최상위 함수 방정식 (최종 익명 함수 제외), 문자 리터럴 및 10 진수, 목록 / 범위 구문 및 연산자, 퀴 데이터를 Int끝에 s 목록의 목록으로 작성 됩니다.

    • 프로그램 1의 핵심 코드는 최종 큰 따옴표와 함께 코드 포인트 목록으로 인코딩됩니다.
    • 프로그램 2의 핵심 코드는 프로그램 1에 사용 된 문자열 리터럴의 코드 포인트 목록으로 인코딩되며 여전히 182만큼 위로 이동합니다.

연습, 프로그램 1

  • bc람다 표현식 최종 인수로 주어진 각각 프로그램 1 및 2에 대한 문자열 상수의 값이다. ()프로그램이 함수를 정의해야한다는 PPCG의 규칙을 만족시키기위한 유일한 주장입니다.
  • foldr(\a->map pred)b(show()>>c)또는 의 길이와 같은 횟수만큼 문자열 b을 적용 하여 문자열 을 프로그램 2의 핵심 코드로 디코딩합니다 .map predshow()>>c == c++c182
  • tail(show c)문자열 c을 프로그램 1의 핵심 코드 로 변환하고 마지막 큰 따옴표가 추가됩니다.
  • :pure b이것을리스트와 문자열로 결합합니다 b.
  • map(map fromEnum)$ 문자열을 코드 포인트 목록으로 변환합니다.
  • `mappend`show(...) 결과 목록 목록을 직렬화하고 프로그램 2의 핵심 코드에 추가합니다.

연습, 프로그램 2

  • 최상위 z~z=[[['@','0'..]!!4..]!!z]는 코드 포인트를 다시 문자로 변환하는 기능입니다 (일부 문자를 toEnum사용할 수 있는 것은 아니므로 쓰기 필요 ).
    • 코드 포인트 인수를라고도합니다 z. 게으름 마커 ~는이 위치에 영향을 미치지 않지만 공백 문자는 피합니다.
    • ['@','0'..] ASCII 코드 64에서 시작하여 각 단계마다 16 씩 아래로 점프하는 뒤로 스테핑 목록 범위입니다.
    • 이것에 적용하면 캐릭터 !!4\NUL생깁니다.
    • [ ..]범위 내 에서 줄 바꿈하면 !!z색인 을 생성 하는 모든 문자 목록이 제공 됩니다.
    • 캐릭터는 마침내 싱글 톤리스트에 싸여 있습니다. 이를 통해 사용할 수없는 및 대신을 z사용하여 목록을 통해 함수 를 매핑 할 수 있습니다 .=<<map<$>
  • 최상위 q[x,q]_=z=<<x++q++[34,34]++x는 quine 데이터 목록에서 프로그램 1을 구성하는 함수입니다.
    • x는 프로그램 1의 핵심 데이터 (최종 큰 따옴표 포함)이고 내부 q는 프로그램 2의 핵심에 대한 난독 화 된 데이터입니다 _. 최종 익명 함수를 문자열 대신 함수로 만들기위한 유일한 더미 인수입니다.
    • x++q++[34,34]++x ASCII 코드 34와 함께 두 개의 큰 따옴표를 포함하여 조각을 연결합니다.
    • z=<<z연결을 통해 코드 포인트에서 문자로 변환 하여 맵핑 하여 프로그램 1을 구성 합니다.
  • 마지막 q[[40,...]]qquine 데이터와 결합 된 익명 함수 입니다.

5

젤리 , 128 90 87 86 85 79 16 + 32 = 48 바이트

“OṾ⁾ọṙŒs”OṾ⁾ọṙŒs

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

79,7806,8318,7885,7769,338,115ỌṘ

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

첫 번째 프로그램은 다음을 수행합니다.

“OṾ⁾ọṙŒs”OṾ⁾ọṙŒs
“OṾ⁾ọṙŒs”          String literal: 'OṾ⁾ọṙŒs'
         O         ord: [79, 7806, 8318,...]
          Ṿ        Uneval. Returns '79,7806,8318,7885,7769,338,115'
           ⁾ọṙ     Two character string literal: 'ọṙ'
              Œs   Swap case the two char literal: 'ỌṘ'.

이 문자열 잎 79,7806,8318,7885,7769,338,115ỌṘ체인의 두 인수로를 그들은 암시 적으로 연결된과 끝 부분에 인쇄되어 있습니다.

두 번째 프로그램은를 반환하는 숫자 목록의 chr( )를 계산 합니다 OṾ⁾ọṙŒs. 따옴표와 함께 인쇄 하고 전체 출력으로 “OṾ⁾ọṙŒs”남겨두고 입력을 반환합니다 “OṾ⁾ọṙŒs”OṾ⁾ọṙŒs.


5

Gol> <> , 23 + 23 = 46 22 + 22 = 44 20 + 20 = 40 바이트

"lF{3+|3d*HqlJJJQpp2

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

'5ssTMMMotK-g6.6~Io

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

온라인으로 확인하십시오!

작동 방식

"lF{3+|3d*HqlJJJQpp2

"..."        Push everything to the stack
 lF{3+|      Add 3 to everything on the stack
       3d*   Push 39 `'`
          H  Print everything on the stack (from the top) and halt

'5ssTMMMotK-g6.6~Io

'...'        Push everything to the stack
 5ss         Push 37 (34 `"` + 3)
    T    t   Loop indefinitely...
     MMMo      Decrement 3 times, pop and print
               At the end, `o` tries to print charcode -3, which is fishy (thanks Jo King)
               Program terminates

Jo King의> <> answer 에서 채택되었습니다 . 출력 및 반복에 대한 더 많은 대체 명령이 있으므로 gor 가 필요하지 않았고 p두 본체가 훨씬 짧아졌습니다.

또 다른 주요 차이점은 스택 맨 위에서 상대방의 견적을 직접 생성한다는 것입니다. 이 방법으로의 불변을 유지하는 것이 약간 더 쉬웠습니다 quote + my code + opponent code(reversed and shifted).

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