Haskell , 3 quines, 1119 바이트
퀸 1, 51 바이트
IO
stdout에 직접 익명 작업이 인쇄됩니다.
putStr`mappend`print`id`"putStr`mappend`print`id`"
온라인으로 사용해보십시오!
Quine 2, 265 바이트
이 함수 f
는 더미 인수를 사용하여 문자열을 반환합니다.
f c=[b=<<g]!!0++show g;b c=[[[show 9!!0,show 1!!0..]!!6..]!!c];g=[93,0,90,52,82,89,52,51,51,94,84,24,24,39,34,34,106,95,102,110,0,94,50,89,0,90,52,82,82,82,106,95,102,110,0,48,24,24,39,35,106,95,102,110,0,40,24,24,39,37,37,84,24,24,45,37,37,84,24,24,90,84,50,94,52]
온라인으로 사용해보십시오!
Quine 3, 803 바이트
LANGUAGE
pragma 뒤의 모든 것은 더미 인수를 취하고 문자열을 반환하는 임의의 함수입니다.
{-#LANGUAGE CPP#-}(\q(_:_:_:_:_:_:_:_:z)y(#)_->(y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x)$y(:)#y(:)$ \x->x)z)'\''__TIME__(\(?)v k x->v$k?x)$ \(&)(%)v->v&'{'&'-'&'#'&'L'&'A'&'N'&'G'&'U'&'A'&'G'&'E'&' '&'C'&'P'&'P'&'#'&'-'&'}'&'('%'\\'&'q'&'('&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'z'&')'&'y'&'('&'#'&')'&'_'&'-'&'>'&'('&'y'&'('%'\\'&'k'&' '&'x'&'-'&'>'%'\''&'&'%'\''&':'&'q'&':'&'k'&':'&'q'&':'&'x'&')'&'#'&'y'&'('%'\\'&'k'&' '&'x'&'-'&'>'%'\''&'%'%'\''&':'&'q'&':'%'\''%'\\'%'\\'%'\''&':'&'k'&':'&'q'&':'&'x'&')'&'$'&'y'&'('&':'&')'&'#'&'y'&'('&':'&')'&'$'&' '%'\\'&'x'&'-'&'>'&'x'&')'&'z'&')'%'\''%'\\'%'\''%'\''&'_'&'_'&'T'&'I'&'M'&'E'&'_'&'_'&'('%'\\'&'('&'?'&')'&'v'&' '&'k'&' '&'x'&'-'&'>'&'v'&'$'&'k'&'?'&'x'&')'&'$'&' '%'\\'&'('&'&'&')'&'('&'%'&')'&'v'&'-'&'>'&'v'
온라인으로 사용해보십시오!
캐릭터
퀸 1 :
"S`adeimnprtu
퀸 2 :
!+,.0123456789;<=[]bcfghosw
퀸 3 :
#$%&'()-:>?ACEGILMNPTU\_kqvxyz{}
작동 원리
퀸 1
putStr`mappend`print`id`"putStr`mappend`print`id`"
Quine 1은 최근의 Golf you에 대한 수정 된 답변입니다.
- 전체 프로그램이 필요하지 않기 때문에
main=
제거되었습니다.
<>
그리고 $
그들의 거의 동의어 mappend
와 로 대체되었습니다 id
.
이것은 중요한 캐릭터들 =<>
과 $
다른 quine들을위한 유용한 연산자 를 자유롭게합니다 .
퀸 2
f c=[b=<<g]!!0++show g;b c=[[[show 9!!0,show 1!!0..]!!6..]!!c];g=[93,0,......]
Quine 2는 최근의 Mutually Exclusive Quines 답변 2를 프로그래밍하는 데 다소 유사한 방법을 사용 하지만 직접 quine 하고 특히 quine 3에 필요한 문자 리터럴을 사용하지 않도록 조정되었습니다.show
. 깎아 지른 행운에 의해 그 문자 중 아직 사용 된 문자가 없습니다.
이 quine은 공백 대신 탭을 사용하지만 가독성을 위해 아래 공백을 사용했습니다.
g
코드 끝의 정수 목록으로 quine 데이터입니다. 각 숫자는 나머지 코드의 문자를 나타냅니다.
- 숫자는로 이동
9
하므로 탭은 0
입니다. 따라서 함수 및 변수 이름의 소문자를 2 자리로 맞출 수 있으므로 인코딩이 약간 짧아집니다.
b c=[[[show 9!!0,show 1!!0..]!!6..]!!c]
숫자를 문자 (실제로 한 문자 문자열)로 변환하는 함수입니다.
[[show 9!!0,show 1!!0..]!!6..]
로 시작하는 탭 문자로 시작하는 문자 범위입니다 !!c
.
- 탭 문자 자체는 다른 범위로 인덱싱하여 생성되는
[show 9!!0,show 1!!0..]
상기 숫자 문자로 시작 '9'
하고 '1'
, 8 단계에서 뛰어 내려.
- 숫자 문자는
show
해당 숫자 의 문자열 로 색인하여 생성됩니다 .
f c=[b=<<g]!!0++show g
주요 기능입니다. c
더미 논쟁이다.
b=<<g
=<<
각 숫자를 g
문자 로 변환 하는 데 사용 합니다 . ( =<<
예를 들어 , 대신에 사용 하면 리턴 된 문자를 목록에 랩해야하는 map
이유 b
가 있습니다.)
show g
g
의 목록에 문자열 표현을 제공하고 문자열을 ++
연결합니다.
=<<
보다 우선 순위가 낮 으므로 ++
일부 브라케팅이 필요합니다. ()
(Quine 3에 예약 됨) 사용을 피하기 위해 [...]!!0
하나의 요소가있는 목록으로 색인합니다.
퀸 3
다른 quine을 디자인함으로써 quine 3은 여전히 괄호, 람다 식, 문자 리터럴 및 문자열 / 목록 생성자에 액세스 할 수 :
있습니다. 이것은 quine의 코드를 문자열 앞에 추가 하는 함수를 구성하기에 충분 합니다.
불행하게도, 모든 소문자 모음 (때로는을 제외하고 y
)이 사용되어 유용한 영숫자 내장 함수가 남지 않았습니다. 또한 []""
사라졌습니다. 이 잎없이 정상적인 방법에 빈 문자열을 구성하는 시작 에 코드를 척.
그러나 거의 모든 대문자를 사용할 수 있으므로 LANGUAGE
언어 확장을 위한 pragma가 가능합니다. 운 좋게도 CPP
(C 전 처리기 사용)는 대문자로만 이름이 지정된 유일한 언어 확장입니다. 그리고 CPP 매크로는 종종 대문자로되어 있습니다.
따라서 필수 빈 문자열을 얻기 위해 quine enable은 매크로를 CPP
사용 __TIME__
하여 형식의 문자열 상수 "??:??:??"
(항상 동일한 길이를 갖도록 편리하게 보장됨)를 가져오고 패턴 일치 를 얻 습니다.
{-#LANGUAGE CPP#-}(\q(_:_:_:_:_:_:_:_:z)y(#)_->(y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x)$y(:)#y(:)$ \x->x)z)'\''__TIME__(\(?)v k x->v$k?x)$ \(&)(%)v->v&'{'&'-'&......
언어 pragma 후 quine은 해당 매개 변수를이 네 가지 인수에 바인딩하는 람다 식으로 구성됩니다 (최종 더미 매개 변수 _
는 나중에 적용됨).
q
'\''
작은 따옴표 문자를 제공하여에 바인딩됩니다 .
_:_:_:_:_:_:_:_:z
__TIME__
, 일명 같은 문자열에 바인딩되어 빈 문자열 "??:??:??"
을 만듭니다 z
.
y
바인딩 (\(?)v k x->v$k?x)
오른쪽 ( "foldr") 양식을 연결하는 ( "foldl")에 관련된 왼쪽에서 quine 데이터를 변환하는 데 도움이 람다 콤비;
- quine 데이터 자체에
(#)
바인딩 된 연산자 \(&)(%)v->v&'{'&'-'&...
입니다.
퀴네 데이터는 매개 변수가있는 람다 식인 교회 인코딩 형식으로 제공됩니다 (&)(%)v
.
- 인스턴스화 특정 값으로 표현을인가함으로써
(&)
, (%)
그리고 v
,이 인코딩은 quine의 코어 코드를 만들거나 quine 데이터 표현 자체를 다시 사용할 수있다.
- 하스켈의 기본 정착 규칙에 의해,
&
그리고 %
될 람다 내부에 결합 연산자를 떠났다. 따라서 문자 매개 변수 v
는 왼쪽부터 시작 하여 결합됩니다 .
- 대부분의 문자
k
에는 해당하는 문자 가 &'k'
있습니다.
- 때
k
입니다 '
또는\
문자 리터럴 내부 이스케이프해야하는, 인코딩 대신이다 %'\k'
.
데이터 인코딩은 연관되어 있지만 문자열은 올바른 연관 방식으로 작성되므로 결합기 y = (\(?)v k x->v$k?x)
가 도입되어 불일치를 연결합니다.
더 일반적으로, (#)
quine 데이터 함수는 언제 f1,f2
문자를 문자열과 결합하는 함수입니다.
(y(f1)#y(f2)$v) x
= (...(y(f1)(y(f1)v '{') '-')...) x
= v(f1 '{' (f1 '-' (... x)))
quine data 함수를 (&)=y(f1)
and로 적용하면 (%)=y(f2)
처방 된 f1
및 f2
quine data의 문자를와 결합 x
하여 결과 문자열을v
.
주요 람다 표현의 본문은 이것을 모두 정리합니다.
(y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x)$y(:)#y(:)$ \x->x)z
'&':q:k:q:x
문자 가 문자열 k
앞에 추가 &'k'
되는 x
동안'%':q:'\\':k:q:x
앞에 추가 %'\k'
원래 quine 데이터 형태이다.
- 그러므로
y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x
quine 데이터 표현을 재구성하고 마지막 z
(빈 문자열) 앞에 추가 한 다음 다음 함수로 전달 하는 올바른 매개 변수입니다 .
y(:)#y(:)
quine의 핵심 코드를 다른 수정없이 문자열 앞에 추가하는 올바른 매개 변수입니다.
- 마지막으로
\x->x
get은 생성 된 quine과는 아무 상관이 없으며 반환됩니다.