7, 4 байта ASCII
r:#,_ #;'D2/'<,,@;"
Попробуйте онлайн!
Я знаю, что 7 обычно не кодируется в ASCII, но на этот раз это более удобная кодировка, так что при каждом запуске мы добавляем 1 байт, а не 3 бита.
Я также не уверен, считается ли это мошенничеством или нет. (Обычно неясно, является ли 7-куайновый обман или нет, поскольку он находится на границе во многих отношениях.) Вы можете привести веский аргумент в пользу того, что DECLARE @ VARCHAR(MAX)='DECLARE @ VARCHAR(MAX)=*SET @=TRIM(REPLACE(@,0x2a,CHAR(39)+@+CHAR(32)+CHAR(39)))PRINT @'SET @=TRIM(REPLACE(@,0x2a,CHAR(39)+@+CHAR(32)+CHAR(39)))PRINT @
encodes the echo|set/p"=q">q©/b/y %0+q %0
::
, но в целом неясно, откуда «возьмутся» полученные символы в 7, потому что в нем так много довольно причудливых неявных поведений.
Эта программа печатает себя с помощью <cfset u=Chr(34)><cfset q="<cfset u=Chr(34)><cfset q=%s%s%s><cfoutput>%screateObject(%sjava%s,%sjava.lang.String%s).format(q,[u,q,u,Chr(35),u,u,u,u,Chr(35)])%s</cfoutput>
"><cfoutput>#createObject("java","java.lang.String").format(q,[u,q,u,Chr(35),u,u,u,u,Chr(35)])#</cfoutput>
appended, and will do so even if you append a number of “⁾;⁶;ØV” ṘV
к этому. Вот прокомментированная трассировка отладки var s="var s={0}{1}{0}+8;Write(s.Trim('8'),(char)34,s);"+8;Write(s.Trim('8'),(char)34,s);
:
H
(нет H
left in the program, so H
немедленно выйдет из программы в качестве побочного эффекта, а это означает, что окончательный результат ":r2ssH
s never run).
Основная путаница в том, откуда берутся все символы, заключается в том, что большинство команд в 7 просто создают данные при запуске, а затем "34s+cTZL "34s+cTZL
"34s+cTZL " String literal
34s+ Prepend a double quote, Now the string is `"34s+cTZL `
cT Copy and trim trailing spaces
Z Put a 0 under the top of stack
Stack now (from top to bottom): `["34s+cTZL,0,"34s+cTZL ]`
L Collect all elements on stack, from bottom to top
Implicit output, 0 is converted to space.
attempts to reconstruct a sequence of commands that would produce the given fragment of data; this often ends up close to, but not identical to, the original. (For quining purposes, you normally write a 7 program in such a way that the result will be almost the same, normally differing in leading or trailing "34s+cTZL "34s+cTZL
с.) Так, например, "34s+cTZL"34s+cTZL
in the data becomes f\ @ #. Sets f to a function that does the following:
(-> ol) [ #. Output each:
"f\ "; #. String for declaration of f
f; #. Formatted representation of f's function
";f1"; #. String for call of f
#0 #. Argument passed into f
];f1 #. Call f with 1 as the argument
, это самый простой способ добавить f\ @(-> ol) ["f\ ";f;";f1";#0];f1
f\ @(-> ol) ["f\ ";f;";f1";#0];f11
f\ @(-> ol) ["f\ ";f;";f1";#0];f111
...
to the current data string. We originally produced it with f\ @(-> ol) ["f\ ";f;";f1";#0];f1
, другая (но похожая) последовательность символов, разрушительно удаляющая один из #
markers the data started with. (I guess perhaps the best argument that this isn't a literal-only quine is that the output is different from the input!)