在ROT-47中实施ROT-47…


23

挑战:以既可作为自身又可作为其ROT-47版本使用的代码实现ROT-47

得分:

您的分数是按照程序两个版本中已使用的合格ROT-47字节的百分比除以两个版本的总字节(所有字符)的百分比得出的。

使用的,ROT-47合格字节是将由ROT-47的密码是不被转换任何字符一个注释的一部分或由编译器/解释器忽略。例如,brainfuck程序中任何不+-<>[],.被认为不是已使用字节的字符,而C程序中包括其后//或内部或内部的任何字符/* */都不会被视为已使用字节。APL中的所有特殊符号均不被视为已使用,空白程序中的所有字符均不被使用(对不起)。

程序将以最多的票数打破联系。如果仍然平局,则以最短的程序为准。

评分示例:

C:62/64 = 96.875%

注意该程序中有一个空格。显然,该程序也不是有效条目,因为它甚至没有编译,但我想展示评分的工作原理。

main(){printf("Hello World!");}

4
用什么语言>2:?WXLAC:?E7WQw6==@ (@C=5PQXjN编译?
Hosch250 2014年

@ hosch250大声笑,这只是一个愚蠢的例子
durron597 2014年

1
“符合ROT-47资格”是指“ ASCII范围是33到126”?即,如果我的C程序具有空格,换行符或制表符,那么这些是否算作ROT-47合格?为了使程序能够以多种语言运行,某些空格是必不可少的事实-那些空格不算作已使用,因为它们不符合R47标准,即使没有它们,程序也会中断?
Jonathan Van Matre 2014年

@JonathanVanMatre空格,换行符或制表符不计在内,因为我认为评分会太复杂;而且我不希望Whitespace能够获得100%的评分,因为那样做将会失败。
durron597 2014年

2
:为了大家谁是反对我的疯狂的计分规则,请评论/答案在这里meta.codegolf.stackexchange.com/questions/1167/...
durron597

Answers:


28

Ruby,100%(74个字符)

在STDIN上输入,在STDOUT上输出。

Vj=s=gets;puts(s.tr'!-~','P-~!-O');Vj;'lDl86EDjAFEDWD]ECVP\OV[V!\OP\~VXj;'

第二行是第一行ROT-47'd。因此,当对整个程序进行ROT-47处理时,它将变为:

';lDl86EDjAFEDWD]ECVP\OV[V!\OP\~VXj';jV=s=gets;puts(s.tr'!-~','P-~!-O');jV

我在这里的策略基于以下事实:

  • V'ROT-47

  • j;ROT-47

  • 因此,Vj=...Vj;变成';l...';,这基本上是无操作的

    • 现在,您可以创建可以正常执行任何操作的任意代码,而在ROT-47运行时则不执行任何操作。这是因为它Vj=...Vj;可以支持您运行任何代码Vj=0;{INSERT ANY CODE};Vj;,而这将'...';在ROT-47完成后变成。您只需要注意不要V在该代码中使用,因为那样会破坏它。
  • 可以反向使用类似的逻辑来生成后半部分(jV而不是Vj


好的,您是对的,我从未指定过,也不会追溯。但是,空格仍不算作合格字符;我认为应该是136/140。
durron597 2014年

1
@ durron597固定; 没有更多的空间。
门把手

当红宝石不需要行以分号结尾:)
durron597

16

C-54.6%

Y;BW;XL;jNj;AW(){XL^Y;};main(int i,char**v){char*x=v[1];while(*x){if(*x>32&&*x<128)*x=(*x+15)%94+32;putchar(*x++);}}//Y^Nj>2:?W:?E :[492CYYGXL492CYIlG,`.jH9:=6WYIXL:7WYImbaUUYIk`agXYIlWYIZ`dXThcZbajAFE492CWYIZZXjNN

当ROT-47翻译时,我们得到

*jq(j){j;};jp(WXL){/*jNj>2:?W:?E :[492CYYGXL492CYIlG,`.jH9:=6WYIXL:7WYImbaUUYIk`agXYIlWYIZ`dXThcZbajAFE492CWYIZZXjNN^^*/};main(int i,char**v){char*x=v[1];while(*x){if(*x>32&&*x<128)*x=(*x+15)%94+32;putchar(*x++);}}

这两个程序都进行编译,然后ROT-47转换第一个参数:

$ ./a "hello world"
96==@ H@C=5

我很难让它在ideone上工作。不过,看到50%以上的分数给我留下了深刻的印象!
durron597 2014年

@ durron597它在ideone上不起作用,因为它通过参数而不是stdin接受输入
mniip

1
支持对参数实现ROT-47,而不仅限于自翻译。那应该已经在规范中了。
Jonathan Van Matre 2014年

10

GolfScript,120/120字节= 100%

{:&&32>&&+254<*{7+7+94%33+}*}%LiUUbamUUZadckYLfZfZhcTbbZNYNT

或者,在ROT-47中:

LiUUbamUUZadckYLfZfZhcTbbZNYNT{:&&32>&&+254<*{7+7+94%33+}*}%

没有评论或字符串滥用。未定义的命令LiUUbamUUZadckYLfZfZhcTbbZNYNT(等于ROT-47中的其余代码)是无操作的,但它仍由解释器执行,因此我认为它算作已使用。

实际上,这在GolfScript中是一个非常容易的挑战。主要困难在于避免数字1,该数字由ROT-47映射到GolfScript命令中`。该命令.-,\[/]并且^还必须要避免的,但这是很容易在这种情况下,由于任务不需要阵列的建设。

奖金:

这是一个GolfScript period-2 quine(即,一个打印第二个程序的程序,该程序再次打印第一个程序),其中两个程序是彼此的ROT-47转换:

{`'0$~'+.{7+7+94%33+}%@!{0$@@;}*}0$~L1V_SOVZ]LfZfZhcTbbZNToPL_SoojNYN_SO

该程序将自身输出为ROT-47编码,从而生成另一个GolfScript程序:

L1V_SOVZ]LfZfZhcTbbZNToPL_SoojNYN_SO{`'0$~'+.{7+7+94%33+}%@!{0$@@;}*}0$~

依次输出自己的ROT-47编码,再次产生以前的程序。因此,该程序也是旋转的奎因


您的分母是错误的:“按两个版本的总字节数(所有字符)划分”。60/120 = 50%
Jonathan Van Matre 2014年

@JonathanVanMatre:使用了两个版本中的所有字节(=由解释程序执行),因此将为120/120 =仍为100%。
Ilmari Karonen 2014年

我不确定得分,因为我不知道golfscript。我知道,例如,A在Brainfuck中,分子将算作分子,而分母则不算。这是同一件事还是不同?
durron597 2014年

@ durron597:LiUUbamUUZadckYLfZfZhcTbbZNYNT是GolfScript 中的有效标识符,将作为命令执行。但是,它不是内置命令之一,也不是由程序分配的含义,因此默认情况下,它只是不执行任何操作。
Ilmari Karonen 2014年

6

python,96.1%(?)

根据您的定义,字符串算作已用代码吗?

V=input();print("".join([chr(33+(ord(V[i])+14)%94)for i in range(len(V))]));V
'l:?AFEWXjAC:?EWQQ];@:?W,49CWbbZW@C5WD,:.XZ`cXThcX7@C : :? C2?86W=6?WDXX.XXj'

1
回想起来,他们不应该拥有,但现在为时已晚
durron597 2014年
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.