源代码变态


29

mbomb007要求我们编写一个自毁程序。这是一个有趣的挑战,但是我个人不喜欢鼓励自己的程序自残。我喜欢认为,每个程序的核心都是一只等待爆发的美丽蝴蝶。

因此,对于我的第一个Code Golf挑战,我挑战Stack Exchange将蝴蝶变身。您的程序应接受自己的代码作为输入和输出,I am a caterpillar!然后接受相同语言的另一个程序的代码(您可以在输出之间添加一个分隔符,但是我们说的是蝴蝶,所以漂亮才算重要!)。第二个程序应该输出I am a beautiful butterfly!

变形:该程序应自行修改,这就是为什么将其本身作为输入传递的原因。我不想一个无聊的嵌套程序,只不过是一个打印语句,I am a caterpillar!然后打印源代码。您必须使代码本身变形,因此,最无聊的可接受答案是将其打印出来I am a caterpillar,然后从输入中截取一个字符串(恰好是代码)并将其打印出来。当然,这是一个非常棘手的小要求,因此应将其视为“挑战的精神”。正式的要求将设置为“如果给您的程序一个与程序长度相同的随机字符串,则在I am a butterfly运行第二个程序时,打印的机会应该少于5%。”

摘要:

  • 编写一个程序,当提供自己的代码作为输入时,先打印程序,I am a caterpillar!然后打印源代码块(在它们之间是否有定界符)。
  • 编译/解释为相同语言时,第二部分源代码将输出 I am a beautiful butterfly!
  • 如果您的程序没有以其自身的源代码作为输入,而是被赋予一个随机字符串,该字符串与自身的代码不匹配,则结果必须无法编译/解释,或者必须I am a butterfly!至少打印95%的随机字符字符串(精神:您应该从输入中读取您自己的源代码,并将其拼接成蝴蝶状)。
    • 只要您坚持变形概念的精神,修改自己的代码,我对您不感到满意,但是如果您尝试玩漏洞游戏来解决输入问题,证明这一点。
  • 适用标准漏洞

我希望通过它们的美观来判断它们,但这是绝对非量化的方法,因此可以使用通常的“字节数”路由来判断

奖励:-20%-选择与程序的前3个字母不匹配的任何3个字母字符串。如果运行卡特彼勒程序,但修改输入,以便将前3个字符更改为指定的字符,请打印I am Batman!。永远是蝙蝠侠。(相同的随机字符串规则也适用于此……变态!

简单示例(python):

"""
    print "I am a beautiful butterfly!"
    #print "I am Batman!"
"""
import sys
code = sys.stdin.read()
if code.startswith("YYZ"):
   # swap the comments between the print statements
   code = code.replace("#print", "_a").replace("print", "#print").replace("_a", "print")
code = [3:] # remove """ or XYZ
code = code.split('"""')[0]
print "I am a caterpillar!"
print code

注意:我很想看到ascii艺术程序,它第一次看起来像毛毛虫,而在下一阶段变成了ascii蝴蝶,但这比挑战需要的要先进得多。
Cort Ammon-恢复莫妮卡2015年

如果一个程序有多个文件,我们该怎么办?
TheNumberOne

@TheNumberOne我很好奇您在那里计划了什么!我不知道是否要立即取消规则,而看不到后果,但是在我看来,如果您要接受多部分文件作为输入(而不是单个文件的内容),然后您将输出多部分输出(而不是单个输出),并且在文件之间使用半合理的deliniator,我认为这应该是一个合理的解决方案。如果这对您不起作用,我可能需要更多了解您提出的解决方案以更好地制定规则。
Cort Ammon-恢复莫妮卡2015年

@TheNumberOne并感谢您输入错误。那错别字显然不是一只美丽的蝴蝶!
Cort Ammon-恢复莫妮卡2015年

Answers:


63

Befunge-98,602字节

                                        "^@<"v@@
                                     "'I'"00v>00g::
                                   "@v"0v@@@>g::a">#"
                                 "a">v@@>      0g::'"1>                                 /
                             ":\"'"v@>            'm'"00g:a                       >"@v$"
 "lufituaeb"'"'v00ga"@v\"'":'b\00v@>                :'a\":*84>"00ga"\>@@@@_,#:>"00g:a'<'"
"et"'"'va'v'":'l\00g5k:'""y!">>v@>                    g::'''""ut"'"'>a'<'""fr"'"00g3k:'">
 "ma"00g>'I~48*-~48*-+#@_>:#,_@>                        '"aa"---"aa"!rallipretac"00g:'a\

在PyFunge中测试。

当使用不是以2个空格开头的字符串(随机时,概率远超过95%)运行时,不会输出任何内容。这并非OP所要寻找的,但符合规范。

传递以2个空格开头的字符串(如其自身)时,将输出以下内容:

I am a caterpillar!

---

"!y"       "l"v
v"te"     "rf"<
>"tu"'   "b"\v@
 v"beautiful"<
  >:#,_@@@@>\
 >48*:"a"\:$v@
  "ma"   v@#>
   'I'   <@^

其下部依次输出:

I am a beautiful butterfly!

2
哇。这真太了不起了。
意大利面条

3
我知道有人会像您一样遵循规则。我很高兴能从中发现美好的事物=)
Cort Ammon-恢复莫妮卡2015年

毛毛虫和蝴蝶看起来都像卡在矩阵中。美丽!
Erno 2015年

我在哪里可以运行?
user1514631 2015年

3
我永远不会理解您在Code Golf的好人如何创造出如此美丽的怪兽。
克里斯·西里菲斯

19

PHP,74字节

<?=~¶ßž’ßžß,$s="caterpillar!",strtr($argv[1],[$s=>~šžŠ‹–™Š“ߊ‹‹š™“†Þ]);
  • <?=等效于<?php echo并且可以采用多个逗号分隔的值来输出
  • ¶ßž’ßžßšžŠ‹–™Š“ߊ‹‹š™“†Þ在PHP中是有效的常量名称,但由于常量不存在,因此被视为字符串文字。~将它们反转为"I am a ""beautiful butterfly!"(每个字节用一个引号保存一次)
  • strtr代替“毛毛虫!” 与“一只美丽的蝴蝶!” 在争论中

2
愿意提供解释吗?
Timwi

@Timwi没问题,添加了解释
Fabian Schmengler 2015年

我完全希望有人用ROT13之类的代码来编码“美丽的蝴蝶”,但是用Kaylee的话说,将其与PHP的字符串文字技术相匹配的想法是闪亮的!
Cort Ammon-恢复莫妮卡

7

Pyth,50 46字节

"I am a caterpillar!"+<z8"beautiful butterfly!

说明

"I am a caterpillar!"        print "I am a caterpillar!"
 z<8                         first 8 chars of input
+   "beautiful butterfly!    add "beautiful butterfly!" to that and print

产生的源代码是

"I am a beautiful butterfly!

基本上是打印文本。


6

Perl 6中,60 56个字节

say "I am a caterpillar!"; s/\S+\!/beautiful butterfly!/

需要-p才能正常运行;我已经在字节数中说明了这一点。可悲的是,Perl 6的缺点之一是语法现在更加严格...


毛毛虫在变态期间很脆弱。这就是为什么他们喜欢将自己包裹在茧变量:$a=caterpillar;say"I am a $a!";s/$a/beautiful butterfly/(我假设是Perl 6允许与如Perl 5裸字no strict 'subs',并s///在LHS内插变量。)
ThisSuitIsBlackNot

嗯,真有趣。我尝试了一下,由于某种原因,当我做wc时,它给了我相同数量的字节。但是再次输入时,它给了我更少的字节。奇怪。
意大利面条

哦,等等,没关系,我记得我为什么没有这样做。当运行新代码时,由于beautiful和butterfly之间的空间而引发错误。
意大利面条

啊,我从没用过Perl 6,所以在那里帮不上忙。我真的只是想借口做个俏皮话。)say"I am a caterpillar!";s/\S+!/beautiful butterfly!/较短并且将在Perl 6.肯定工作
ThisSuitIsBlackNot

1
@ThisSuitIsBlackNot确实适合挑战。这些规则只是为了确保您真正阅读和修改您的代码。最后,真正的精神是试图让代码中心的美丽蝴蝶摆脱困境。美丽,当然是情人眼中的。我们每个人都会找到不同的解决方案,它们或多或少都比其他解决方案好看。至于PERL中的解决方案,那么...让我们说PERL有其独特的美丽定义,它恰好适合其目的;-)
Cort Ammon-恢复莫妮卡2015年

4

视网膜,53字节

caterpillar
beautiful butterfly
^
I am a caterpillar!

打印输出:

I am a caterpillar!beautiful butterfly
beautiful butterfly
^
I am a beautiful butterfly!

请注意,在I am a caterpillar! 和新程序之间没有分隔符。新程序期望没有输入。


3

bash/ awk/ cksum- 179.2 169.6 168字节

awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'

演示:

$ awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'<<'E'
> awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'
> E
I am a caterpillar!
echo|awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."10"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'
$ echo|awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."10"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'
I am a beautiful butterfly!

# Batman!
$ awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'<<'E'
> xyzawk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'
> E
I am Batman!

# Invalid input
$ awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'<<'E'
> awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0{'
> E

我希望20%适用于以开头的任何字符串xyz,否则原始计数为224 212 210字节(固定"I am Batman!"部分)。

变换完成:替换文字的仅发生!NF10,使" butterfly"还使用打印的printf

cksum对源代码的一部分(即其余部分)执行简单操作,因此也需要它。

警告:第一个输入必须以结尾'只是警告,不要压制错误的输入...

预计没有第二个输入。


1
WHOA。我在等那个awk人,仅此而已。太酷了。
jrg

@jrg感谢您的鼓励。:)
hjk 2015年

1

Python-184字节-20%的奖励= 147.2

""""""
import sys;c=sys.stdin.read();print"I am a caterpillar!";x=c[3:] if"\'''"!=c[:3] else c
print x+c[:3]
""";print"I am a beautiful butterfly!" """
''';print"I am Batman";'''

要进行打印I am batman,请在输入中将前三个双引号替换为单引号。(第一行是'''"""

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.