긴 quine 라인에 대항하십시오


28

또는 : 수직 quine을 구축하십시오

긴 선에 맞서 싸우 십시오 .

당신의 임무는 가능한 한 짧은 선 길이로 수직 퀴니를 만드는 것입니다.

채점

기준을 타이 브레이커로 사용하여 줄 길이를 줄이면 줄 바꿈이 가장 짧습니다 .

줄 길이는 줄 바꿈 문자를 제외한 프로그램에서 가장 긴 줄로 결정됩니다.

예를 들면 다음과 같습니다.

$_=
Q.
P

행 길이는 3이고 바이트 수는 8입니다.

Q
$
_
P

줄 길이가 1이고 바이트 수가 7입니다 (후행 줄 바꿈이 없다고 가정).

규칙

Quines는 quine의 커뮤니티 정의를 충족해야합니다 .

표준 허점 은 금지되어 있습니다.


이것이 영감을 얻은 도전의 규칙이 여기에도 적용됩니까? ( " 모든 줄 바꿈은 의미가 있어야 제거하고 인접 라인을 직접 출력에 영향을주지 않고 연결될 수 있습니다 줄 바꿈, 제거해야합니다.. ")
케빈 Cruijssen

6
@KevinCruijssen 아니요,이 도전이 짧은 줄 길이를 장려 할 수있는 자유를 원했습니다! 내가 다른 도전에서 바꾸고 싶었던 것은 바로 그 것이었다!
Dom Hastings

답변:


31

Lenguage , 선 길이 0, ≈ 1.01 × 10 805 바이트

소스 코드는

10124204951141713202533972929121310016060433092338061822344361345785088607872212687519180665846846689047959498775873817205954910072327976407177053174071436371843670134990737172675632938993247496933911137703773908536875512359091727633452506044935740750830240213878294804481182083555147915724921824921475110508228264569693355158523956426011218344830576542194309867719995259333487662608933990607888012376767799159279952780093033761421596267435996052643805835600325453580090964941176722519904997142820547696122795384058768166716813179490118821654787005844786013890425692181280317909786461426684986082270532414940905922244777135016193088362341771414388821075092853157152933099269703875111747946164773211049512395358715902962437487134522781505709420586981997748912591875626029183292826655753251235587052422561943

linefeeds는 다음에 나오는 brainfuck 프로그램을 인코딩합니다.

>>++++++++>+++>+++>+>+>+>+>+>+>+>+++>+>+>+>+>+>+>+>+>+++>+>+>+>+>+>+>+>+>++++++++>++++>++++++++>++++>+++++++>++>+++>+>+++>++>+++>+++>+>+>+>+>+>+>+>+>++++>++++>+++++++>+>++++>++++++++>++>+++++++>+++>++++++++>++>+++++++>+++>++++++++>++>+++++++>+++>++++++++>++>+++++++>+++>++++++++>++>+++++++>+++++>+>+>+>+>+>+>+>+>+>+>++++++++>++++>+++++++>+++++++>+>+>+++>+>+>+>++++++++>+++>+++++++>+>+++>+>+++>+>+++>+>++++++++>++++>++++++++>++++>++++++++>++++>++++>+>+++>+++>++>+++++++>+++++++>+>+>+>++++++++>+++>+>++++++++>++++>+>+++>++>+++++++>++>+++++++>++++>++++>++++++++>+++>++++++++>+++>+++>+>++++>++++>++>+++++++>+++>+++>++++++++>++++>+>+++>++>+++++++>++++>++++>+++++++>+++>+++>+++>+++>++++++++>++++>++++>+>+++>+>+++>++>+++++++>+++++++
[
    [->+>+<<]
    >>>>[<<[->+<]>>[-<<+>>]>]
    <<[-[->+<]+>]+++
    [[->>+<<]<]<
]
+>+>+>+
[>]+++>++
[
    [<]++++++++++.[-]
    >[-]>[-]>[-]>[-]
    <+[<<++++++++>>->+>-[<]<]
    ++++++++>++++++++>+++++++>>
]

소스 코드는 대부분 @ jimmy23013의 방사선으로 부드럽게 된 Lenguage quine 과 동일 .합니다. 마지막으로 빼고 null 바이트 대신 줄 바꿈을 인쇄하고 1 줄의 데이터 섹션에 해당하는 변경 사항을 ++++++++++.[-]대체 .합니다.


나는 그것이 불가피하다는 것을 알고 있었다! 나는 포괄적 인 질문을 원했습니다. 사람이 ...이 이길 수 있는지 궁금해
돔 헤이스팅스

주님,이 언어는 왜 코드 볼링이 잘 수신되지 않는지에 대한 정의입니다. 정말 멋진 것입니다 ... "Hello World"가 필요하다고 믿을 수 없습니다"about 1.75*10**76 yottabytes in ASCII"
Magic Octopus Urn


사용하여 당신이 할 수있는 골프 코드의 99 % 이상]++++++++ ++.-->
jimmy23013

28

자바 스크립트, 라인 길이 1 960 956 928 바이트


[
t
,
r
,
u
,
e
,
f
,
a
,
l
,
s
]
=
!
0
+
[
!
1
]
;
[
,
n
,
d
,
,
q
,
i
]
=
t
.
a
+
t
V
=
[
]
[
f
+
i
+
n
+
d
]
;
[
,
,
,
c
,
,
,
o
,
,
_
,
,
,
,
,
y
,
z
]
=
V
+
0
F
=
V
[
E
=
c
+
o
+
n
+
s
+
t
+
r
+
u
+
c
+
t
+
o
+
r
]
P
=
(
1
+
e
+
2
+
3
-
4
+
t
)
[
2
]
f
=
F
(
r
+
e
+
t
+
u
+
r
+
n
+
_
+
a
+
t
+
o
+
(
0
+
{
}
)
[
3
]
)
(
)
(
3
*
4
+
[
]
[
E
]
[
n
+
a
+
(
0
[
E
]
+
0
)
[
9
+
2
]
+
e
]
)
[
1
]
F
(
a
,
a
+
l
+
e
+
r
+
t
+
y
+
a
+
P
+
q
+
P
+
a
+
P
+
q
+
z
)
`
[
t
,
r
,
u
,
e
,
f
,
a
,
l
,
s
]
=
!
0
+
[
!
1
]
;
[
,
n
,
d
,
,
q
,
i
]
=
t
.
a
+
t
V
=
[
]
[
f
+
i
+
n
+
d
]
;
[
,
,
,
c
,
,
,
o
,
,
_
,
,
,
,
,
y
,
z
]
=
V
+
0
F
=
V
[
E
=
c
+
o
+
n
+
s
+
t
+
r
+
u
+
c
+
t
+
o
+
r
]
P
=
(
1
+
e
+
2
+
3
-
4
+
t
)
[
2
]
f
=
F
(
r
+
e
+
t
+
u
+
r
+
n
+
_
+
a
+
t
+
o
+
(
0
+
{
}
)
[
3
]
)
(
)
(
3
*
4
+
[
]
[
E
]
[
n
+
a
+
(
0
[
E
]
+
0
)
[
9
+
2
]
+
e
]
)
[
1
]
F
(
a
,
a
+
l
+
e
+
r
+
t
+
y
+
a
+
P
+
q
+
P
+
a
+
P
+
q
+
z
)
`

더 읽기 쉬운 버전으로 quine이됩니다 (매우 줄 바꿈 제거).


[t,r,u,e,f,a,l,s]=!0+[!1];[,n,d,,q,i]=t.a+t
V=[][f+i+n+d];[,,,c,,,o,,_,,,,,y,z]=V+0
F=V[E=c+o+n+s+t+r+u+c+t+o+r]
P=(1+e+2+3-4+t)[2]
f=F(r+e+t+u+r+n+_+a+t+o+(0+{})[3])()(3*4+[][E][n+a+(0[E]+0)[9+2]+e])[1]
F(a,a+l+e+r+t+y+a+P+q+P+a+P+q+z)`
[t,r,u,e,f,a,l,s]=!0+[!1];[,n,d,,q,i]=t.a+t
V=[][f+i+n+d];[,,,c,,,o,,_,,,,,y,z]=V+0
F=V[E=c+o+n+s+t+r+u+c+t+o+r]
P=(1+e+2+3-4+t)[2]
f=F(r+e+t+u+r+n+_+a+t+o+(0+{})[3])()(3*4+[][E][n+a+(0[E]+0)[9+2]+e])[1]
F(a,a+l+e+r+t+y+a+P+q+P+a+P+q+z)`

설명

아휴. 위험한 여행이 될 것이기 때문에 여기에 타십시오.

나는 길이 1 노 (직접, 어쨌든) 내장 기능, 키워드 이러한 문제를 해결하거나 화살표를하는 방법을 알아 내려고 오랜 시간을 보낸이와 쉽게 가능하다는 것을 실현 기능을-전에 JSF *** , 한 캔 멀티 바이트 토큰을 피하면서 JavaScript 코드를 평가하십시오. 그러나 JSF 솔루션은 수십 또는 수십만이 아니라도 수천 바이트 길이가 될 수 있습니다. 고맙게도, 우리는 단지 그에 국한되지 않습니다. ()[]+!우리는 모든 ASCII를 사용할 수 있습니다!

먼저 JSF의 필수 구성 요소 인 "더 많은 기능을 잠금 해제"하기 위해 문자열로 만들 수있는 문자를 골라 시작하기로 결정했습니다. 문자열을 사용하여 길이가 3 인 줄이 필요한 문자를 직접 사용할 수 없으므로 대신 JSF에서 트릭을 훔쳐서 1 바이트 토큰으로 작성할 수있는 리터럴에서 몇 개의 문자를 가져옵니다.

JSF***   Used here   Value        Chars unlocked
!![]     !0          true         true
![]      !1          false        fals
[][[]]   t.a         undefined    ndi

이것으로부터 [].findFunction 객체 인로 시작하여 바깥쪽으로 확장 할 수 있습니다 . 문자열이 변환하는 것은 function find() { ...우리에게 액세스를 제공 c, o공간 ( _) 괄호 ( yz). 아마도 더 중요한 것은 이제 우리는 그것 constructorFunction함수에 접근 할 수있게되었다 .이 함수는 처음에는 소리가 나는 것처럼 문자열을 만들고에 전달한 Function()다음 생성 된 함수를 호출하여 코드를 실행하는 기능을 제공한다 .

아마도 프로그램 자체에서 사용되는 전반적인 방법을 언급해야 할 것입니다. 2015 년 현재, JavaScript에는 " 태그 된 템플릿 "이라는이 멋진 기능이 있습니다.이 기능 은 문자열에서 이스케이프되지 않은 줄 바꿈을 허용 할뿐만 아니라 문자열 리터럴을 사용하여 직접 함수를 호출 할 수 있도록합니다 ( myFunc`abc`;대략 myFunc(["abc"])). 프로그램에서 마지막으로 함수 호출을 넣으면 일반적인 구조는 다음과 같습니다.

code;func`code;func`

func그 다음에는 모두 인수가 출력되고 그 뒤에 백틱, 그 다음에 다시 인수, 그리고 두 번째 백틱이 출력됩니다. 인수가 a있고 백틱이 저장되어 있다고 가정하면 f코드로이를 수행 할 수 있습니다 alert(a+f+a+f). 그러나 현재 우리는 누락 +되고 역행 자체 가 없습니다 . +(에 저장 됨 P)은 어렵지 않습니다. 우리는 JSF에서 또 다른 트릭을 훔쳐 문자열을 만들고 1e23숫자로 변환 한 다음 다시 문자열로 바꾸고 "1e+23".

백틱을 얻는 것은 조금 더 복잡합니다. 처음에는 취득하려 String.fromCharCode하지만, 찾는 C밝혀졌다 거의 어려운로한다. 다행히 atob얻기 쉬운 정도이다 ( Function("return atob")(); b에서 생성되어 0+{}제공되는 [object Object])와 적절한 마법 문자열이 발견되면, 모든 ASCII 문자를 제공 할 수 있습니다. 짧은 스크립트가 준 12A편리하게 찾을 수있는 옵션 중 하나로서 12Array(A가 생성하는 짧은 비트, 덕분에 [].constructor[n+a+m+e], m에서 발견된다 0 .constructor+0: "function Number() { ...").

마지막으로 모든 것을 하나로 묶습니다. 백틱을 variable에 할당 f하지만 함수 문자열에서 직접 사용할 수 없으므로 variable q을 문자로 설정 f하고 대신 사용합니다. 이것은 우리의 최종 문자열을 만든다 a+l+e+r+t+y+a+P+q+P+a+P+q+z, 또는 "alert(a+f+a+f)". 그런 다음이에 Function()피드를 제공하고 완성 된 코드를 결과에 피드하면 voila, 한 줄에 하나 이상의 문자가 포함 된 JavaScript quine이 있습니다!


지금은 머리가 끔찍한 느낌이 들기 때문에이 설명에서 실수 나 내가 놓친 것들에 대해 문의하십시오. 휴식을 취한 후 다시 연락 드리겠습니다.


좋은! 실제로 JS 프로그래머는 아니지만 JSFuck에 대해 읽은 내용에서 요점을 추측 할 수 있지만 특히 그 f=라인에 대한 설명을 원합니다 .
Ørjan Johansen 님

1
@ ØrjanJohansen 죄송합니다. 전체에 대한 설명을 작성하려고했지만 문제가 해결되지 않아 질문에 빠르게 답변 해 드리겠습니다 f. 단일 백틱 으로 설정하는 복잡한 방법 입니다. 줄 자체는와 같습니다 f=atob("12Array")[1]. 다른 트릭은 q실제로 f첫 번째 줄 F(...)의 문자 ff설정되어 있기 때문에 변수 가 더 이상 해당 문자로 설정되지 않기 때문에 줄에서 평가 된 문자열에 문자를 넣을 수 있습니다 . 은 a+l+e+r+t+y+a+P+q+P+a+P+q+z동일합니다 "alert(a+f+a+f)".
ETHproductions

좋아, 이제 이해해! 당신은 무엇을 말할 수 0+{}0[E]얻기 위해에 캐릭터 라인 화 b하고 m.
Ørjan Johansen

참으로 좋습니다! 우리는 simar 접근법을 사용했지만 내 시도 보다 훨씬 작습니다 !
Dom Hastings

@DomHastings 너무 오래 링크가 작동하지 않습니다 ;-)
ETHproductions

15

Haskell , 라인 길이 6, 400 343 336 바이트

{main=
putStr
$s++(s
>>=(++
":\n")
.show)
++
"[]}";
s='{':
'm':
'a':
'i':
'n':
'=':
'\n':
'p':
'u':
't':
'S':
't':
'r':
'\n':
'$':
's':
'+':
'+':
'(':
's':
'\n':
'>':
'>':
'=':
'(':
'+':
'+':
'\n':
'"':
':':
'\\':
'n':
'"':
')':
'\n':
'.':
's':
'h':
'o':
'w':
')':
'\n':
'+':
'+':
'\n':
'"':
'[':
']':
'}':
'"':
';':
'\n':
's':
'=':
[]}

온라인으로 사용해보십시오! 나는 길을 알지 못 putStr하므로 줄 길이는 6입니다. 바깥 쪽 중괄호는 단일 선언 내에서 줄 바꿈 후 다른 요구되는 들여 쓰기를 제거 할 수 있습니다.



12

CJam , 줄 길이 1, 16 13 바이트

"
_
p
"

_
p

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

표준 quine에 줄{"_~"}_~ 바꿈을 삽입하는 것이 더 짧은 표준 quine "_p"␊_p도 올바른 일을한다는 것은 작은 기적입니다 . (감사합니다, 마틴!) 마지막 줄 바꿈이 필요합니다.

설명 (줄 바꿈)

"•_•p•"        Push that string.
       ••      Do nothing.
         _     Duplicate the string.
          •    Do nothing.
           p   Pop it and print it with quotes and a newline: "•_•p•"•
            •  Do nothing.

종료시 스택에 남은 내용이 인쇄 ( •_•p•)되어 총 출력이 산출 "•_•p•"••_•p•됩니다.


2
내가 말해야 할 것은 ...
•••

6

하스켈 + CPP, 라인 길이 2, 705 (237) 바이트

m\
a\
i\
n\
=\
p\
u\
t\
S\
t\
r\
$\
(\
:\
"\
\\
\\
\\
n\
"\
)\
=\
<\
<\
s\
+\
+\
s\
h\
o\
w\
 \
s\
;\
s\
=\
"\
m\
a\
i\
n\
=\
p\
u\
t\
S\
t\
r\
$\
(\
:\
\\
"\
\\
\\
\\
\\
\\
\\
n\
\\
"\
)\
=\
<\
<\
s\
+\
+\
s\
h\
o\
w\
 \
s\
;\
s\
=\
"\

온라인으로 사용해보십시오! -CPPC 전처리 기를 활성화 하는 플래그 를 사용하면 줄 끝에서 백 슬래시를 사용하여 다음 줄에서 계속할 수 있습니다.

실제 코드는 main=putStr$(:"\\\n")=<<s++show s;s="<data>" 입니다.

편집 : Ørjan Johansen 덕분에 캐주얼 -468 바이트 !


1
로 변경하기 위해 많은 탈출을 절약합니다 main=putStr$(:"\\\n")=<<s++show s;s="<data>". 온라인으로 사용해보십시오!
Ørjan Johansen 님이

5

녹, 줄 길이 : 5, 바이트 : 301 299

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

외형에도 불구하고이 언어는 난해한 프로그래밍 언어가 아니며 많은 포맷 라인 노이즈가 있습니다.

사용할 수 있도록 세로 길이 5를 선택했습니다 print. 세로 길이가 짧고 C 함수가 extern키워드를 사용한다고 선언하고 stdout6 바이트 길이, write5 바이트 길이, no_main7 바이트 길이 (메인은 일반적으로 함수;) 라고 인쇄하는 방법이 없다고 생각합니다 .

fn
main
(){
let
t=(
r#"fn
main
(){
let
t=("#
,r#")
;
print
!(
r#"{}
r#"{
}"{}
,r#"{
}"{},
r#"{
}"{}
{}{}{
}{
}""#,
r#"
,t.0,
t.0,
'#',
t.1,
'#',
t.2,
'#',
t.1,
'#',
t.2,
'}'
)"#
)
;
print
!(
r#"{}
r#"{
}"{}
,r#"{
}"{},
r#"{
}"{}
{}{}{
}{
}"#
,t.0,
t.0,
'#',
t.1,
'#',
t.2,
'#',
t.1,
'#',
t.2,
'}'
)}

그렇지 않습니다 수평 길이는?
anatolyg

@anatolyg 고정
Konrad Borowski 5

구문 강조 표시없이 원시 문자열 중첩을 사용하면이를 해석 할 수 없습니다. 나는 생각하지 않는다 cargo fmt...도 여기에 도움이 될 것이다
CAD97

@ CAD97 구문 강조를 원하는 경우 play.rust-lang.org에서 이를 강조 표시합니다. 이것이 "온라인으로 시도"링크에 TIO 대신 사용했던 이유입니다.
Konrad Borowski




2

빨간색 선 길이 : 10, 49 바이트

s: [prin [
    "s:"
    mold s
    "do s"
]] do s

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

이 사실에있다 REBOL의 quine

설명 : Red / Rebol mold은 4 개의 공백을 넣는 코딩 스타일을 따릅니다.

s: [prin [     ; s is a block; print the following: 
    "s:"       ; literal "s:"
    mold s     ; the representation of the block itself - all between []
    "do s"     ; literal "do s"
]] do s        ; evaluate the block


2

RProgN 2 , L = 1, B = 15 바이트

«
Ø
.
`
-
S
`
.

이것은 프로그램과 동등합니다 :

«Ø.`
-S`
.

고장

«먼저 암시 적으로 나머지 프로그램을 나타내는 함수를 스택에 푸시 한 다음 실행을 계속합니다. Ø.함수에 빈 문자열을 추가하여이를 문자열 화합니다. 이것은 줄 바꿈이 없기 때문에 항상 등가 프로그램처럼 엄격해질 것입니다. `\n-문자열에서 줄 바꿈을 모두 제거합니다 «Ø.`=S`.. S그런 다음 그것을 단일 문자 스택으로 변환하고 줄 `\n.바꿈으로 스택을 결합하여 예상 프로그램을 반환합니다.

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


2

언더로드 , 라인 길이 1, 20 바이트

(
:
a
S
S
)
:
a
S
S

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

이것은 줄 바꿈이 추가 된 표준 Underload quine입니다. 알 수없는 명령 문자를 무시하는 TIO와 같은 구현이 필요합니다.

부분 ()은 스택에 놓인 문자열 리터럴이며, :복제 a하고 상단 스택 항목을 괄호로 묶은 다음 S인쇄합니다.



1

자바 스크립트 (ES6 REPL), 전체 프로그램, 줄 길이 : 3, 바이트 수 : 31

(
f=
_=>
`(
f=
${f
}
)
()`
)
()

이것은 자체 포함 된 전체 프로그램에 대한 @ kamoroso94의 답변 포트입니다.

아무도 줄 길이에 더 추가하지 않고 일부 바이트를 제거하는 방법을 찾으면 자유롭게 의견을 말하십시오 :)


REPL에서 실행하지 않는 한 여전히 실제로 아무것도 출력하지 않습니다. 나는 자바 스크립트 (ES6 REPL)를 부를 것이다
ETHproductions

오 쏴, 크롬 콘솔 사용 방법 ...
Brian H.

1

, 라인 길이 1, 35 바이트


V
Y
"
[
`
V
Y
`
y
]
.
C
:
3
.
4
"

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

알려진 가장 짧은 Pip quine을 기반으로합니다 V Y"`V Y`.RPy". 줄 길이 1로 좁히는 데 가장 큰 어려움은 RP두 줄로 나눌 수 없습니다. 하지만이 경우에는RP (repr)은 문자열을 큰 따옴표로 묶는 것이므로 직접 할 수 있습니다.

다음은 가로 버전을 기반으로 한 설명입니다.

V Y"[`V Y`y].C:3. 4"
  Y"               "  Yank this string into the variable y
V                     and eval it
                      The code that is eval'd:
    [      ]           Build a list containing:
     `V Y`              this Pattern object (used for regex, but here useful as a
                          string-like object that doesn't need double quotes)
          y             y, the whole string
               3. 4    Concatenate 3 and 4 to make 34 (since the 2-digit number won't work
                         in the vertical version)
             C:        Convert to ASCII character (: forces the precedence lower than .)
            .          Concatenate the " to the end of each list element
                      The resulting list is printed, concatenated together, with a
                        trailing newline

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