3
高温辐射固化剂
背景 在这个站点上,我们偶尔会遇到一些问题,要求对程序进行“辐射加固”。这意味着程序必须能够删除一个或多个字节,无论删除哪个字节。 对于在编程挑战中经常遇到的任务很常见,很自然地想要制作一种特别适合这些挑战的语言。鉴于自然的方法是添加一些元数据,以使反向破坏成为可能,因此,实际上并不是真正需要设计的语言,而是一种编码。这个想法是将每个输入转换为一个字节序列,这样即使对序列稍加照射,也可以提取原始输入。 任务 编写两个程序或函数,E(编码器)和D(解码器),使得: E接受两个参数,一个八位字节序列(在本规范中称为“ 输入 ”)和一个非负整数“ radiation ”,并输出一个八位字节序列“ encoding ”。 D接受一个参数,即八位字节序列(“ encdng ”),并输出八位字节序列“ reconstruction ”; 如果同时运行E和D(使用encdng,则D的输入,通过从编码中删除不超过辐射元素(不一定连续)来选择),那么无论删除了哪些字符以形成encdng,重构都将等于输入。 澄清说明 如果您提交的功能,你不必叫他们E和D; 您可以选择最适合您的语言的名称。 “八位位组”基本上是0到255之间的整数,您可以将其编码为整数,字符或任何适合您的语言的字符。 E和D必须完全是确定性的(即给它们相同的输入将始终产生相同的输出,其中“输入”定义为E的输入和辐射,或D的编码)。特别是,E可能不会通过边信道将信息传达给D。 删除是通过删除序列的一个元素来完成的。可以考虑在编辑器中打开序列,将光标置于任意点,然后按Backspace键。如果一个元素出现多次,则可能只删除该元素的一个副本(即,同一八位位组的其他实例将不受影响)。 尽管仅根据相当短的输入量来计算分数,但是您的程序在理论上必须对任何输入量和辐射都有效。特别是,无论input中出现哪个八位字节,它都必须起作用。(很抱歉,希望使用他们知道的不可打印字符的能力不会出现在输入中,但是我需要确保输入不可压缩,以便挑战在于辐射硬化而不是压缩。) 您可以提交定义两个功能的一个文件。两个文件,每个文件都定义一个功能或都是完整程序;或三个文件,其中两个分别实现D和E(通过完整程序或通过定义函数),第三个文件是D和E通用的头文件或库。无论使用哪种提交形式,则您的编程语言实现必须能够理解两个程序而无需文件位置等其他参数(否则,按照我们的标准规则,您必须以不寻常的方式调用实现以支付字节罚款)。 胜利条件 对于每个长度和辐射,令f(长度,辐射)为编码 s 的总长度,其对应于具有长度length的所有输入以及给定的辐射。(也就是说,f(长度,辐射)= 输入总和的长度为长度 length(E(输入,辐射))。)然后令g(长度,辐射)等于f(长度,辐射)÷256 长度。换句话说,对于给定的输入长度和给定的辐射硬化要求,g是编码输出的平均长度。(理论上,您可以通过蛮力计算出来,但是以这种方式计算出您的分数可能会花费很长的时间。我希望大多数提交者能够对他们的分数做出数学上的论证。不确定,发布一个近似分数,如果另一个条目发布了相似的分数,您或其他人可以更深入地计算它。) 您的分数等于0到9(含)范围内的所有辐射的g(长度,辐射)的总和,0到99(含)范围内的所有长度的总和,加上(主要是避免硬编码,或者如果有人发现了数学上完美的编码;否则,这可能是一个最小的因素)提交给挑战的字节总数(加上对要求异常解释器标志或特定文件名之类的标准惩罚)。获胜者是得分最低的作品(被第一次提交的作品打破)。