写一个聚喹


33

聚喹啉既是奎宁又是多色。1您将写一个至少在两种不同语言中有效的藜。这是代码高尔夫球,因此最短的答案(以字节为单位)获胜。

1我弥补了。确切地说,Geobits做到了。显然,他也不是第一个

规则

仅接受真正的奎因。也就是说,您需要将整个源代码原样打印到STDOUT,而无需

  • 直接或间接阅读您的源代码。
  • 依靠REPL环境,该环境仅评估并打印您提供给它的每个表达式。
  • 依靠在某些情况下仅能打印出源代码的语言功能。
  • 使用错误消息或STDERR编写全部或部分的藜。(您可以将内容写到STDERR或产生警告/非致命错误,只要STDOUT是有效的Quine,并且错误消息不属于其中即可。)

此外,您的代码必须包含字符串文字。

多语规则

所使用的两种语言必须明显不同。特别是:

  • 它们不能是同一语言的不同版本(例如,Python 2与Python 3)。
  • 它们不能是同一语言的不同方言(例如Pascal与Delphi)。
  • 一种语言可能不是另一种语言的子集(例如C与C ++)。

4
“您的代码必须包含字符串文字”即使在没有字符串文字的语言中,例如Br​​ainfuck?
彼得·奥尔森

@PeterOlson该规则的目的是避免高尔夫球特定语言(例如this)中的一些漏洞。由于我无法预料到删除或削弱规则会导致什么(并且除非绝对必要,否则我不喜欢更改规则),很抱歉,但是BF提交对于此目的无效挑战。如果有什么安慰的话,BF提交无论如何都可能没有竞争力。;)
Martin Ender 2014年

1
“他也不是第一个”链接到哪里?
暴民埃里克(Erik the Outgolfer)'17年

2
C并不是C ++的真正子集。
MD XF

两种不同的基于Brainf ** k的语言是否算作同一语言,例如Br​​ainf ** k和MOO?
MD XF'17年

Answers:


14

CJam / GolfScript,34个字节

{"__X.0#@@?LL
;~"N}__X.0#@@?LL
;~

字节数包含一个尾随的换行符,因为如果没有它,该程序将不会成为问题。

尽管CJam和GolfScript 在某些方面非常相似,但仍存在许多差异。为了使它成为“诚实的”聚喹啉,我决定尽可能地依赖差异。除了块和字符串语法(这两种语言与其他语言共享)外,两种语言的代码都无法完全相同。

在线GolfScript解释器存在错误;该程序仅适用于官方口译员。

运行示例

$ cat polyquine
{"__X.0#@@?LL
;~"N}__X.0#@@?LL
;~
$ md5sum polyquine <(cjam polyquine) <(golfscript polyquine)
e2f1f3cd68abbbceec58080513f98d9a  polyquine
e2f1f3cd68abbbceec58080513f98d9a  /dev/fd/63
e2f1f3cd68abbbceec58080513f98d9a  /dev/fd/62

工作原理(CJam)

" Push that block.                                                                        ";

{"__X.0#@@?LL
;~"N}

" Push two copies of the block, 1 (computed as 1**0) and rotate the block copies on top.  ";

__X.0#@@

" If 1 is truthy (oh, the uncertainty), execute the first copy; else, execute the second.
  Evaluating the block pushes the string it contains; N pushes a linefeed.                ";

?

" Push two empty arrays.                                                                  ";

LL

" Discard one empty array and dump the second.                                            ";

;~

" (implicit) Print all items on the stack.                                                ";

运作方式(GolfScript)

# Push that block.

{"__X.0#@@?LL
;~"N}

# Push a copy of the block; _ and X are noops, # initiates an inline comment.

__X.0#@@?LL

# Discard the 0 and execute the copy of the block.
# Evaluating the block pushes the string it contains; N is a noop.

;~

# (implicit) Print all items on the stack, followed by a linefeed.

CJam / GolfScript,12个字节

{"0$~"N}0$~

荒谬的解决方案,尽可能避免了语言的差异。

在线尝试:

工作原理(CJam)

 "0$~"       " Push that string.                                                          ";
      N      " Push a linefeed.                                                           ";
{      }0$~  " Push a copy of the block and execute it.                                   ";
             " (implicit) Print the stack.                                                ";

运作方式(GolfScript)

 "0$~"       # Push that string.
      N      # Undefined token (noop).
{      }0$~  # Push a copy of the block and execute it.
             # (implicit) Print the stack, followed by a linefeed.

14

C#/ Java,746字节

我使用Java中的chars可以写为相同的unicode序列的属性。如果我们有AC#编译器B指令和Java指令,则可以使用以下代码片段:

//\u000A\u002F\u002A
A//\u002A\u002FB

C#将通过以下方式对其进行“识别”:

//\u000A\u002F\u002A
A//\u002A\u002FB

并通过Java通过以下方式进行:

//
/*
A//*/B

因为\u000A是换行,\u002F/\u002A*在Java中。

因此,最终的多色喹啉是:

//\u000A\u002F\u002A
using System;//\u002A\u002F
class Program{public static void//\u000A\u002F\u002A
Main//\u002A\u002Fmain
(String[]z){String s="//@#'^using System;//'#^class Program{public static void//@#'^Main//'#main^(String[]z){String s=!$!,t=s;int[]a=new int[]{33,94,38,64,35,39,36};String[]b=new String[]{!&!!,!&n!,!&&!,!&@!,!&#!,!&'!,s};for(int i=0;i<7;i++)t=t.//@#'^Replace//'#replace^(!!+(char)a[i],b[i]);//@#'^Console.Write//'#System.out.printf^(t);}}",t=s;int[]a=new int[]{33,94,38,64,35,39,36};String[]b=new String[]{"\"","\n","\\","\\u000A","\\u002F","\\u002A",s};for(int i=0;i<7;i++)t=t.//\u000A\u002F\u002A
Replace//\u002A\u002Freplace
(""+(char)a[i],b[i]);//\u000A\u002F\u002A
Console.Write//\u002A\u002FSystem.out.printf
(t);}}

但是,由于语言的冗长性,其大小太大。

可以在ideone.com上进行编译:C#Java


3
欢迎来到编程难题和代码高尔夫社区!
暴民埃里克(Erik the Outgolfer)

2
我知道已经快两年了,但是您可以打58字节。在线尝试Java。在线试用C#.NET。
凯文·克鲁伊森

你是说688字节吗?
伊万·科彻金

13

Python 3和JavaScript,134个字节

这是我的(最终?)尝试:

a='eval(a.split(" ")[2%-4]),1//2# q=String.fromCharCode(39);console.log("a="+q+a+q+a.slice(-8)) print(a[-12:]%a) a=%r;eval(a)';eval(a)

它可能可以打得更多一些,尤其是如果有人知道更好的方法来获取JavaScript单引号。


归结起来,程序看起来像这样:

a='a long string';eval(a)

eval()函数将评估两种语言的表达式。这样长字符串就被执行了:

eval(a.split(" ")[2%-4]),1//2# ... the rest gets commented out

这会将长字符串用空格分隔,并评估由索引的子字符串2%-4。JavaScript将运行第三个子字符串(2 % -4 == 2),而Python 运行第二个最后一个(2 % -4 == -2),因为它们的模运算符对负数的行为不同。

两种语言都将忽略字符串的其余部分。JavaScript在处停止//,而Python将其视为整数除法,在处停止#

因此,JavaScript在此处将源代码打印到控制台:

q=String.fromCharCode(39);console.log("a="+q+a+q+a.slice(-8))

还有Python:

print(a[-12:]%a)

两者都使用字符串的最后部分,它是程序的模板:

a=%r;eval(a)

+1传送至140个字节:a='print(a[78:]%a)1q=String.fromCharCode(39);console.log("a="+q+a+q+a.slice(82))1a=%r;eval(a.split(1)[0|0=="0"])';eval(a.split(1)[0|0=="0"])。在JavaScript中进行了测试,但在python中未进行测试...但是应该可以。
soktinpk

@soktinpk谢谢,但是我认为Python不会允许a.split(1)
grc 2014年

1
-8个字节:q=unescape("%27")
帕特里克·罗伯茨

8

Ruby / Perl / PHP,52

$b='$b=%c%s%c;printf$b,39,$b,39;';printf$b,39,$b,39;

Christopher Durr的Perl quine 复制的逐字记录。

这是规则滥用。Ruby和Perl绝对不是同一语言,Perl也不是Ruby的子集(例如,大多数链接的Perl quines在Ruby中不起作用)。但是,Ruby的设计使其看起来很像Perl,并且在打高尔夫球时会发生很多事情。


是否可以使它在PHP中也可以工作(或已经工作)?如果我正确阅读了该文档,则可以在命令行上使用来运行该文档,-R而无需使用脚本标签。php.net/manual/en/features.commandline.options.php
hmatt1 2014年

我不会称其为滥用规则。找到适用于两种语言的交集的奎因绝对是解决此问题的有效方法。但是,看到这不是您自己的工作,我希望您将其标记为社区Wiki。
Martin Ender 2014年

@chilemagic确实可以!
histocrat

@MartinBüttner完成了。
histocrat

6

Bash / GolfScript,73

.~0 () 
{ 
    declare "-f" @* ".~0" " () 
"+@n.;
    echo '.~0;'
}
.~0;

前3行中的每行都有尾随空格。

Bash / GolfScript,78

alias :a~a.='eval "alias :a~a."\
;set [61 39]+a[39]+n"":a;echo ":a~a."'
:a~a.

5

PHP / Perl-171

#<?PHP$s=1;$t="";
$a='%s<%cPHP$s=1;$t="";%c$a=%c%s%c;$t==$s?$t="#":$s;printf($a,$t,63,10,39,$a,39,10,63);%c#%c>';$t==$s?$t="#":$s;printf($a,$t,63,10,39,$a,39,10,63);
#?>

运行:

$ php quine.pl
$ perl quine.pl

php代码实际上正在运行(不仅仅是打印自身)。


5

Bash / Ruby,104 82

"tee`#";puts <<a*2+'a'#`" -<<'a';echo a
"tee`#";puts <<a*2+'a'#`" -<<'a';echo a
a

旧版本:

"alias" "puts=f()(tee -;echo a);f"
puts <<a *2+"a"
"alias" "puts=f()(tee -;echo a);f"
puts <<a *2+"a"
a

Bash / Ruby,128个未定义行为

"alias" 'puts=f()(a=`cat`;echo "$a
$a
a");f'
puts <<'a' *2+"a"
"alias" 'puts=f()(a=`cat`;echo "$a
$a
a");f'
puts <<'a' *2+"a"
a

哇,我什至不了解Ruby代码的工作原理:D
Martin Ender 2014年

<<aRuby中的@MartinBüttner 就像Bash一样工作,但是返回一个字符串。我以前没有写过Ruby程序。我刚刚发现具有此功能的随机语言。
jimmy23013 2014年

我也不知道它如何在bash中起作用:P
Martin Ender 2014年

@MartinBüttner称为heredoc。<<word返回用单行分隔的字符串word
jimmy23013 2014年

5

reticular / befunge-98,28字节[无竞争]

<@,+1!',k- ';';Oc'43'q@$;!0"

尝试网状! 尝试befunge 98!

;束线中s 之间的任何内容都将被忽略,并!跳入;s 之间的网状区域。因此,网状结构看到:

<@,+1!',k- ';';Oc'43'q@$;!0"
<                             move left
                           "  capture string
                          0   push zero
                        ;!    skip `;` (end program)
                       $      drop zero
                     q@       reverse TOS
                 '43'         push 34 (")
                c             convert to char
               O              output all
              ;               end program

Befunge看到:

<@,+1!',k- ';';Oc'43'q@$;!0"
<                            move left
                           " capture string
                         !0  push 1
              ;         ;    skip this
         - ';'               push 27
       ,k                    output top 27 chars
   +1!'                      push 34 (")
  ,                          output "
 @                           end program

4

Ruby / Mathematica,225个字节

这是我自己非常好的拍子(作为示例和概念证明):

s="s=%p;puts s%%s;#Print[StringReplace[s,{(f=FromCharacterCode)@{37,112}->ToString@InputForm@s,f@{37,37}->f@37}]]&@1";puts s%s;#Print[StringReplace[s,{(f=FromCharacterCode)@{37,112}->ToString@InputForm@s,f@{37,37}->f@37}]]&@1

第一部分基于这个Ruby quine,基本上是:

s="s=%p;puts s%%s;#MathematicaCode";puts s%s;#MathematicaCode

在Mathematica中,字符串分配完全相同。将puts s%s被解释为4个符号的产物:puts,字符串s%(最后REPL结果,或者Out[0]如果它是你评估第一表达式)和其他s。这当然是完全没有意义的,但是Mathematica不在乎并;抑制任何输出,因此这只是静默处理。然后#,在Mathematica继续进行的同时,将剩下的一行作为Ruby的注释。

至于Mathematica代码,其中最大的一部分是在不使用任何字符串文字的情况下模拟Ruby的格式字符串处理。FromCharacterCode@{37,112}%p并且FromCharacterCode@{37,112}%%。前者将替换为字符串本身,(在字符串中InputForm加上引号)后者则被替换为单个%。结果是Printed。最后一个问题是如何#在前端处理该问题。这是Mathematica的纯(匿名)函数第一个参数的符号。因此,我们要做的是通过追加并立即使用arguments调用该函数,使所有这些函数成为纯函数。在函数调用的前面加上“乘以”结果&111,无论该函数返回什么样的结果,Mathematica都会再次吞下它。


2

> <>和CJam,165个字节

"~~~~~~~~~~~~~~~~~~~~~~~r00gol?!v93*0.Hi
'                               <       .1*5av!?log10oar~~~r
'"`{"`"\"_~e#.21 <.2+4*96;!?log10oa"}_~e#.21 <.2+4*96;!?log10oa

对于CJam,该程序以多行字符串文字开始。使用进行转义`,然后使用标准quine打印quine代码以及尾随注释。

到> <>,​​第一个 "一个字符开始一个字符串文字,该字符串文字贯穿整个第一行,将每个字符压入堆栈。之后,删除尾随空格(由于填充了输入而创建的空格),然后对堆栈进行反转。输出堆栈中的每个字符(即整个第一行),然后向下移动到第二行。

第二行基本上做相同的事情,除了它的方向相反,因此您不需要反转堆栈。(无论如何,我还是这样做,因为我必须删除尾随空格。)

最后,它移至第三行。唯一的主要区别是您必须跳过CJam块,这是使用来完成的.。单引号捕获了整行(再次,向后),然后将其输出。


2

C / PHP,266 304 300 282 241 203 + 10个字节

//<?php
function main($a){printf($a="%c//<?php%cfunction main(%ca){printf(%ca=%c%s%c,13,10,36,36,34,%ca,34,36,10,10,10);}%c#if 0%cmain();%c#endif",13,10,36,36,34,$a,34,36,10,10,10);}
#if 0
main();
#endif

+10个字节,因为在C中进行编译需要GCC编译器标志 -Dfunction=

工作原理(在PHP中):

  • PHP解释器仅将所有内容打印<?php为HTML。//不是HTML中的注释,因此只需打印即可。
  • main被声明为带有变量的函数a
  • printf//使用标准的C / PHP quinquin方法打印回车符(以覆盖已打印的),然后打印源代码。
  • #if 0 被PHP忽略。
  • main($a)初始化一个空变量a。(以前用于error_reporting(0)忽略由引起的错误main()
  • #endif PHP也将其忽略。

工作原理(在C中):

  • //<?php 是单行注释,因此将被忽略。
  • function关键字是由于命令行编译器参数被忽略-Dfunction=
  • GCC和Clang不在乎变量是否以或包含$。(这节省了一天。)
  • printf 使用标准的C / PHP奎宁方法打印回车符(在此实例中无用),然后打印源代码。
  • #if 0直到之前都会忽略所有内容endif,因此PHP可以调用main
  • #endif 结束“忽略我”块。

2

ump / > <> / Befunge-98 28字节

"]#34[~#28&o@,k+deg0 #o#!g00

在Wumpus中尝试一下!在> <>中尝试!请在Befunge-98中尝试!

怎么运行的:

旺旺代码:

  " Start string literal
    Bounce off end of line and come back
  " End string literal
   ] Push top of stack to bottom
    #34 Push double quote
       [~ Get bottom of stack and swap it with the double quote
         #28 Push 28
            &o@ Print the top 28 items on stack and terminate program

> <>代码:

  " Start string literal
    Wrap when it reaches the end of the line
  " End string literal
   ]# Clear stack and reflect
  " Wrapping string literal again, but backwards
                     g00 Get the character from cell 0 (")
                 #o#! Skip into the printing loop
                      Exit with an error

Befunge-98代码:

  " Wrapping string literal
   ] Turn right
   ] Turn right again, going West
  " Wrapping string literal going West
                 !g00 Get double quote and invert it
              #o# Skip over the o instruction
           g0   Get double quote
        +de Push 27
     @,k    Print 27+1 items from the stack and terminate program.


1

C / TCL,337字节

#define set char*f= 
#define F 
#define proc main(){ 
set F "#define set char*f= 
#define F 
#define proc main(){ 
set F %c%s%c; 
proc /* {} {} 
puts -nonewline %cformat %cF 34 %cF 34 91 36 36] 
set a {*/printf(f,34,f,34,91,36,36);} 
"; 
proc /* {} {} 
puts -nonewline [format $F 34 $F 34 91 36 36] 
set a {*/printf(f,34,f,34,91,36,36);} 

1

C / Vim 4.0,1636字节

包含控制字符。

map () {}/*
map g ;data0df"f"cf"
f"cf"
f"D2kyyP;g6k2dd4x5jA"JxA","JxA","jyyPkJxA"jok;g2kdd4xkJx3jdd
map ;g O"vdldd0i# 0# 1# 2# 3# 4# 5# #0lx2lx2lx2lx2lx2lx2lx:s/##/#/g
o:s//"/gk0y2lj02lp"addk@ao:s//\\/gk0ly2lj02lp"addk@ao:s///gk04ly2lj02lp05l"vp"addk@ao:s///gk05ly2lj02lp05l"vp"vp"addk@ao:s//
/gk06ly2lj02lp05l"vp"vp"vp"addk@ao:s//
/gk02ly2lj02lp05l"vp"addk@a
unmap ()

map ;data o*/ char*g[]={"map () {}/*#2map g ;data0df#0f#0cf#0#5#3f#0cf#0#5#3f#0D2kyyP;g6k2dd4x5jA#0#3JxA#0,#0#3JxA#0,#0#3jyyPkJxA#0#3jo#3k;g2kdd4xkJx3jdd#2map ;g O#4#4#4#4#3#0vdldd0i## 0## 1## 2## 3## 4## 5## ###30lx2lx2lx2lx2lx2lx2lx:s/####/##/g#5o:s//#0/g#3k0y2lj02lp#0addk@ao:s//#1#1/g#3k0ly2lj02lp#0addk@ao:s//#4#4#3/g#3k04ly2lj02lp05l#0vp#0addk@ao:s///g#3k05ly2lj02lp05l#0vp#0vp#0addk@ao:s//#4#4#5/g#3k06ly2lj02lp05l#0vp#0vp#0vp#0addk@ao:s//#4#4#5/g#3k02ly2lj02lp05l#0vp#0addk@a#2unmap ()#2#2map ;data o*/ char*g[]={","#A#0#a#0,#0#b#0,#0#c#0#C#2","}; /*#3#2#2#0*/  print(char*s){char*t=s,c,d;while(c=*t++)if(c==35){c=*t++;if(c==35)putchar(c);else if(c==48)putchar(34);else if(c==49)putchar(92);else if(c==50)printf(#0#1n#0);else if(c==51)putchar(27);else if(c==52)putchar(22);else if(c==53)putchar(13);else if(c>64&&c<91)print(g[c-65]);else printf(g[c-97]);}else putchar(c);}  main(){print(g[1]);}"}; /*

"*/  print(char*s){char*t=s,c,d;while(c=*t++)if(c==35){c=*t++;if(c==35)putchar(c);else if(c==48)putchar(34);else if(c==49)putchar(92);else if(c==50)printf("\n");else if(c==51)putchar(27);else if(c==52)putchar(22);else if(c==53)putchar(13);else if(c>64&&c<91)print(g[c-65]);else printf(g[c-97]);}else putchar(c);}  main(){print(g[1]);}

您的Vim需要进行以下设置:

set noai
set wm=0
set nosi
set tw=0
set nogdefault

1

C / Lisp,555字节

t(setq /*;*/){}main(){char q='\"',s='\\';char*a= 
"~%t(setq /*;*/){}main(){char q='~A';char*a= 
~S;char*b=/* 
)(setq a ~S) 
(setq */ ~S;printf(b,s,q,s,s,q,a,q,q,s,s,s,q,s,s,s,s,q,q,b,q/* 
)(format t /* a /* a */);}~%";char*b=/* 
)(setq a "\\\"',s='\\\\") 
(setq */ " 
t(setq /*;*/){}main(){char q='%c%c',s='%c%c';char*a= 
%c%s%c;char*b=/* 
)(setq a %c%c%c%c%c',s='%c%c%c%c%c) 
(setq */ %c%s%c;printf(b,s,q,s,s,q,a,q,q,s,s,s,q,s,s,s,s,q,q,b,q/* 
)(format t /* a /* a */);} 
";printf(b,s,q,s,s,q,a,q,q,s,s,s,q,s,s,s,s,q,q,b,q/* 
)(format t /* a /* a */);} 

故意空白第一行。


1

Perl / Javascript(SpiderMonkey),106个字节

$_='$q=+[]?h^O:unescape("%27");print("$_="+$q+$_+$q+";eval($_)"||(q($_),"=$q$_$q;",q(eval($_))))';eval($_)

在线尝试Perl!
在线尝试JavaScript!

说明

quine数据$_以两种语言存储,然后进行evaled,这在Perl中几乎是标准过程。我在TIO上选择了SpiderMonkey,因为它具有print功能,但是可以轻松地将它移植到浏览器中,并需要+ 20个字节(添加eval("print=alert");$_s定义的开头)。

Perl 会像往常一样查看其中存储的数据$_eval对其进行处理。由于+[]是truthy在Perl,'被存储在$q通过的stringwise-XOR hO。最终的技巧是调用printJavaScript的第一部分的位置+,在Perl中,该部分将所有项目视为数字,然后加起来0,然后使用||运算符返回我们实际想要(q($_),"=$q$_$q;",q(eval($_)))的等价于的内容"\$_=$q$_$q;eval(\$_)"

在JavaScript中,+[]回报率0,所以我们把unescape("%27")存储'$q(不幸的是,atobdoesm't存在SpirderMonkey ...)。在对的调用中print,由于+是JavaScript中的串联运算符,因此第一个块将构建所需的输出,而第二个部分将||忽略。

感谢帕特里克·罗伯茨(Patrick Roberts)unescape绝招!


Perl / JavaScript(浏览器),108字节

$_='eval("q=_=>_+``;printf=console.log");printf(q`$_=%s%s%s;eval($_)`,$q=+[]?h^O:atob("Jw"),$_,$q)';eval($_)

在线尝试Perl!

$_='eval("q=_=>_+``;printf=console.log");printf(q`$_=%s%s%s;eval($_)`,$q=+[]?h^O:atob("Jw"),$_,$q)';eval($_)

说明

我们先$_用两种语言存储奎恩数据,然后再存储eval,这在Perl中是非常标准的过程。

Perl 会像往常一样查看其中存储的数据$_eval对其进行处理。该eval范围内$_执行,并没有解析,但因为它是eval,不会报错。printf然后调用,具有单引号的字符串q(),与`作为delimter,作为只使用`将导致在命令壳被执行,则对于第一次使用的$q,因为+[]是truthy在Perl,'被存储在$q通过的stringwise-XOR hO

在JavaScript中, eval$_设置了一个function qreturn其参数为a,String并别名console.logprintf,因为console.log格式字符串的方式类似于printfPerl。when printf调用会+[]返回0,因此我们调用atob解码'并存储在中$q


1

Perl 5 / 红宝石 / JavaScript(Node.js) / Bash / Python 2 / PHP,1031字节

s=1//2;_=r'''<?#/.__id__;s=+0;#';read -d '' q<<'';s=\';Q='echo s=1//2\;_=r$s$s$s\<\?\#/.__id__\;s=+0\;#$s\;read -d $s$s q\<\<$s$s\;s=\\$s\;Q=$s$Q$s\;eval\ \$Q;echo $q';eval $Q
$_='eval("0"?0?"def strtr(s,f,t);s.tr(f,t) end;class String;def chr(n);self+n.chr end;end":"$u=strtr=(s,f,t)=>[...f].reduce((s,a,i)=>s.replace(RegExp(a,`g`),t[i]),s);printf=console.log;(S=String).prototype.chr=function(n){return this+S.fromCharCode(n)}":[]&&"sub strtr{eval q(q(X)=~y/X/X/r)=~s/X/shift/ger}");printf(strtr("%s<?#/.__id__;s=+0;#j;read -d jj q<<jj;s=zj;Q=jecho s=1//2z;_=rksksksz<z?z#/.__id__z;s=+0z;#ksz;read -d ksks qz<z<ksksz;s=zzksz;Q=kskQksz;evalz zkQ;echo kqj;eval kQwk_=j%sj;eval(k_);//;#jjj;f=jjjs=1//2;_=r%%s%%s%%s;f=%%s%%s%%s;q=_[18]*3;print f%%%%(q,_,q,q,f,q)jjj;q=_[18]*3;print f%%(q,_,q,q,f,q)%s","jkwz","".chr(39).chr(36).chr(10).chr(92).chr(92)),[]&&"s=1//2;_=r".chr(39).chr(39).chr(39),$_,$u?"":"".chr(10));';eval($_);//;#''';f='''s=1//2;_=r%s%s%s;f=%s%s%s;q=_[18]*3;print f%%(q,_,q,q,f,q)''';q=_[18]*3;print f%(q,_,q,q,f,q)

在线验证!

根据我对此答案的更新,我认为我会尝试优化打印出不同排列的代码,但最终添加了Bash,反正增加了更多的字节负载。尽管这比我的初次尝试(保存了300多个字节)更加优化,但我相信它仍然可以继续使用。


替代Perl 5 / Ruby / JavaScript(Node.js) / Bash / Python 2 / PHP,1040字节

s=1//2;_=r'''<?#/.__id__;s=+0;#';read -d '' q<<'';s=\';Q='echo s=1//2\;_=r$s$s$s\<\?\#/.__id__\;s=+0\;#$s\;read -d $s$s q\<\<$s$s\;s=\\$s\;Q=$s$Q$s\;eval\ \$Q;echo $q';eval $Q
$_='$z=0?"$&".next+92 .chr+10 .chr: 0..a||eval("printf=console.log;unescape`$%27%5C%0Ak`");$q=$z[1]?$z[1]:h^O;printf("%s%s%s%s<?#/.__id__;s=+0;#%s;read -d %s%s q<<%s%s;s=%s%s;Q=%secho s=1//2%s;_=r%ss%ss%ss%s<%s?%s#/.__id__%s;s=+0%s;#%ss%s;read -d %ss%ss q%s<%s<%ss%ss%s;s=%s%s%ss%s;Q=%ss%sQ%ss%s;eval%s %s%sQ;echo %sq%s;eval %sQ%s%s_=%s%s%s;eval(%s_);//;#%s%s%s;f=%s%s%ss=1//2;_=r%%s%%s%%s;f=%%s%%s%%s;q=_[18]*3;print f%%%%(q,_,q,q,f,q)%s%s%s;q=_[18]*3;print f%%(q,_,q,q,f,q)%s",[]&&"s=1//2;_=r",$r=[]&&$q,$r,$r,$q,$q,$q,$q,$q,$b=$z[2]?$z[2]:chr(92),$q,$q,$b,$d=$z[0]?$z[0]:h^L,$d,$d,$b,$b,$b,$b,$b,$d,$b,$d,$d,$b,$b,$d,$d,$b,$b,$b,$d,$b,$d,$d,$d,$b,$b,$b,$d,$d,$q,$d,$n=$z[3]?$z[3]:chr(10),$d,$q,$_,$q,$d,$q,$q,$q,$q,$q,$q,$q,$q,$q,$z[4]?"":$n);';eval($_);//;#''';f='''s=1//2;_=r%s%s%s;f=%s%s%s;q=_[18]*3;print f%%(q,_,q,q,f,q)''';q=_[18]*3;print f%(q,_,q,q,f,q)

在线验证!

稍微接近我的原始方法,但是args的重复printf仍然很疯狂。相反,使用位置参数使其只能在Chrome中使用,并且在PHP中也很难使用,因为$s in %1$s进行插值而很难中使用,但可能会节省很多字节,也许可以结合使用两种方法...


0

C / dc,152字节

z1d//[[z1d//]P91PP93P[dx]Pq 
;main(){char*a="z1d//[[z1d//]P91PP93P[dx]Pq%c;main(){char*a=%c%s%c;printf(a,10,34,a,34);}//]dx";printf(a,10,34,a,34);}//]dx

利用评论,是的!


0

Perl 5 / Ruby / PHP / JavaScript(浏览器),153个字节

$_='$z=0?"$&".next: 0..a||eval("printf=console.log;atob`JCc`");printf("%s_=%s%s%s;eval(%s_);",$d=$z[0]?$z[0]:h^L,$q=$z[1]?$z[1]:h^O,$_,$q,$d);';eval($_);

在线尝试Perl!
在线尝试Ruby!
在线尝试PHP!

$_='$z=0?"$&".next: 0..a||eval("printf=console.log;atob`JCc`");printf("%s_=%s%s%s;eval(%s_);",$d=$z[0]?$z[0]:h^L,$q=$z[1]?$z[1]:h^O,$_,$q,$d);';eval($_);

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.