利用“自由空白”


20

假设一个代码高尔夫挑战在程序长度中不计空格。通过将您的脚本编码为空白来欺骗该系统,并查找可解码并执行嵌入式空白的脚本。

我对JBernardoMeta Golf Challenge的解决方案是将Sage(或Python)代码编码为空白,然后将解码器作为高尔夫球。

s = ' '
for c in '<lots of whitespace>'.split(s):
    s+=chr(len(c))
exec s

编码是采用脚本,在换行符前添加前缀,对于c脚本中的每个字符,均使用输出ord(c)选项卡,后跟空格。由于我使用的是Python,并且必须以空格开头,因此必须在换行符前加一个换行符s

计分

完整的解决方案包含对您使用的编码的描述(如果比较复杂,请提供脚本),以及“解码并执行”脚本。您的分数是“解码并执行”脚本中非空格字符的数量。

禁止使用空格(语言)

而且,任何具有完整运算符集且仅使用空格字符的语言都是不允许的:我将接受最低的非零分数。

Answers:


8

Golfscript,12个字符

'10个字符开头的字符串由定界:

n/{,}%''+~

每一行都被解码成一个字符,其ASCII(实际上可能是Unicode)值就是该行的长度。

不幸的是,如果我尝试粘贴“ Hello World”示例,则Markdown会删除多余的空格,即使是在一个<pre>块中也是如此。


2
由于程序开始处的空格始终无法运行,因此.n/{,}%+~也可以正常使用。
丹尼斯

9

CPAN,16

use Acme::Bleach;

CPAN拥有了一切。或者至少是正确的模块。


我称其为作弊,这是一整套运算符,只不过是空白
棘手怪胎

5
这不是骗子。它很便宜,但是可以接受。
2011年

1
该程序不执行任何操作。那里没有WS。OO !!!! 请使用在此有用的程序将其重新发布。继续使用Acme :: Bleach,但要充分利用它。
Thomas Eding

1
@trinithis:这里没有其他程序。为什么要特别选择一个?
JB

我注意到了它,它的突出作用是它看起来像是导入。
Thomas Eding

3

Perl,29岁

$_="";s/     */chr length $&/ge;eval

在里面 s///是一个制表符,然后是一个空格。编码是带空格的超基本编码,在制表符之前。

在命令行上尝试以下操作:

$ tr ST ' \t' <<< '$_="TSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS"; s/TS*/chr length $&/ge; eval' | perl

编辑:嗯,大声笑,我找不到复制/粘贴制表符/空格组合的正确方法。相信我,它可以在家工作:) 更新:在那里,用tr


您可以放上标签,\t我们相信它可以与空白一起使用...
2011年

@boothby:哦,比这更好的是,我可以\t通过shell 进行解释,并且实际上可以使该死的东西正常工作。在几个小时内完成。
JB

3

的JavaScript

更换 \t为选项卡以获得发布的字符数。

标准(64个字符)

eval(eval("'<code here>'".replace(/\t */g,function(s){return"\\"+s.length})))

箭头功能(49个字符)

eval(eval("'<code here>'".replace(/\t */g,(s)=>"\\"+s.length)))

两者的编码器程序

for(var i = 0, si = prompt("Enter the code."), so = ""; i < si.length; ++i) so += '\t' + Array(+si.charCodeAt(i).toString(8)).join(' '); prompt("Here is the result.", so);

替换(s)=>...为箭头功能以s=>...保存两个字节
andrewarchi

在任何两个字符之间保持空格,最坏的情况是使用jsfuck使其正常工作(最好使用" t " [ 1 ]其表示“ t”)
l4m2

44Beval("".replace(/ +/g,s=>' []+!()'[s.length]))
l4m2

2

Yabasic(88个字符)

a$ = "<code here>"
for a = 1 to len(a$)
    if mid$(a$, a) < " " then b = b + 1
    else b$ = b$ + chr$(b) : b = 0
    endif
next
compile(b$)
a()

使用与C解决方案相同的编码器程序,但不要删除第一个字符。您的原始代码必须采用子例程的形式a(),例如:

sub a():?"hello, world":end sub

2

C(99个字符)

main(c, p)
{
    char *s = "<code here>";
    for (p = popen("cc -xc -oa -", "w"); *s;)
        *s++ - 9 ? c -= putc(c, p) : ++c;
    execl("a", pclose(p));
}

仅在GCC上进行过测试(也许仅与GCC一起使用)。

相应的编码器程序(手动从其输出中删除第一个字符):

#include <stdio.h>

int main()
{
    int c;
    while ((c = getchar()) != EOF) {
        while (c--) putchar(9);
        putchar(32);
    }
    return 0;
}

1

D(101个字元)

import std.algorithm;mixin((){char[]r;foreach(c;splitter("<lots of whitspace>"," "))r~=cast(char)c.length;return r;}());

与问题中的编码相同(无需换行)


2
关键是空白是自由的。我数了98个字符。随意编写可读代码!
2011年

1

Bash(仅内置,44个字符)

IFS=
eval `while read a
do printf '\'${#a}
done<<a
<code here>
a`

对应的编码器脚本:

od -b | cut -b9- | tr ' ' '\n' | while read a
do
    for (( b = 0; b < $((10#$a)); ++b ))
    do
        echo -n ' '
    done
    echo
done

非常好。我认为自己有点像Bash黑客,因此我不得不man花点时间来解决这个问题。
2011年

1

K5,12个字节

.`c$-':&9=" "

执行(.`c$-':索引值()组成的字符串,该值由各对索引(&)之间的差给出,其中()输入为制表符(9=" ")。

输入是由制表符和非制表符组成的字符串,并且字符值以每个制表符之间的非制表符(空格或换行符)数编码。编码器示例:

" ",/{(x#" "),"\t"}'-1+

执行以(" ",/)x空格(x#" ")和制表符(,"\t")开头的运行连接,其中X是({...}')的每个减去输入字符串的字符值(-1+)。

实际上:

  enc: " ",/{(x#" "),"\t"}'-1+
  dec: .`c$-':&9=

  enc "2+3"
"                                                  \t                                          \t                                                  \t"
  dec enc "2+3"
5

0

Ruby,43岁

非常简单,编码是每行放置x个空格,其中x是char的ascii值,解码是相反的。

以下脚本只是一元到ASCII的转换器,即使空格以外的其他空间都是空闲的,它也可以工作:

eval("".split("\n").map{|x|x.length.chr}.join)

只需将空字符串替换为您满意的程序即可。

具有更可重用格式的东西:

from_space = lambda {|text| text.split("\n").map{|x| x.length.chr}.join}
to_space = lambda {|text| text.chars.map{|x| " " * x.ord}.join("\n")}

p from_space [ to_space [ "abc" ] ] #=> "abc"
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.