하스켈 , 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
, b
및 c
프로그램 2가 사용하는 숫자 인코딩의 숫자를 저장하는 그의 ASCII 코드 적은 100보다 유일한 소문자가 있습니다.
- 프로그램 2의 핵심 코드의 문자열 리터럴 인코딩은 비 ASCII 유니 코드를 사용하여 더 난독 화됩니다. 모든 문자는 원래 문자와 겹치지 않도록 코드 포인트에 182를 추가합니다.
- 182는 128 이었지만, 182가 디코딩을 단축하기 위해 프로그램 1의 코드에 대한 문자열 리터럴 길이의 두 배라는 사실을 남용 할 수 있음을 깨달았습니다. 보너스로 프로그램 2는 줄 바꿈을 사용할 수 있습니다.
프로그램 2는 일반적으로 최상위 함수 방정식 (최종 익명 함수 제외), 문자 리터럴 및 10 진수, 목록 / 범위 구문 및 연산자, 퀴 데이터를 Int
끝에 s 목록의 목록으로 작성 됩니다.
- 프로그램 1의 핵심 코드는 최종 큰 따옴표와 함께 코드 포인트 목록으로 인코딩됩니다.
- 프로그램 2의 핵심 코드는 프로그램 1에 사용 된 문자열 리터럴의 코드 포인트 목록으로 인코딩되며 여전히 182만큼 위로 이동합니다.
연습, 프로그램 1
b
과 c
람다 표현식 최종 인수로 주어진 각각 프로그램 1 및 2에 대한 문자열 상수의 값이다. ()
프로그램이 함수를 정의해야한다는 PPCG의 규칙을 만족시키기위한 유일한 주장입니다.
foldr(\a->map pred)b(show()>>c)
또는 의 길이와 같은 횟수만큼 문자열 b
을 적용 하여 문자열 을 프로그램 2의 핵심 코드로 디코딩합니다 .map pred
show()>>c == c++c
182
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,...]]
은 q
quine 데이터와 결합 된 익명 함수 입니다.