锡兰,1431,764,697,571,547,538,501,493,467,451
shared void p(){print(sum{0,if(exists a=process.arguments[0])if(a!="test")for(c in a)for(b in 0..7)if(c.hash.get(b))1});}
这是原始的,没有意义的:
Integer footprintCharacter(Integer b) {
return sum({0, for(i in 0..7) if(b.get(i)) 1 });
}
Integer footPrintString(String s) {
if(s == "test") {return 0;}
return sum({0, for(c in s) footprintCharacter(c.integer)});
}
shared void footprint() {
if(exists s = process.arguments[0]) {
print(footPrintString(s));
} else {
print("This program needs at least one parameter!");
}
}
这从命令行参数中获取参数... process.arguments是一个字符串序列(可能为空),因此在使用其中一个字符串之前,我们需要检查其是否确实存在。在另一种情况下,我们输出一条错误消息(问题不是必需的,在下一版本中将被丢弃)。
锡兰sum
函数接受需要满足某种类型的元素的非空 Iterable Summable
,即具有plus
像Integer这样的方法。(它不适用于空序列,因为每个Summable类型都有自己的零,并且运行时没有机会知道是哪一个。)
字符串的元素或整数的一位不是不可空的迭代。因此,我们在这里使用的功能是通过指定一些元素,然后是“理解”(将被评估为零个或多个元素)来构建可迭代的。因此,在字符情况下,我们要添加一个(但仅在设置了相应的位时),在字符串情况下,我们要添加字符的结果。(仅当接收函数实际对其进行迭代时才评估该理解,而不是在构建Iterable时进行评估。)
让我们看看如何缩小这一范围。首先,每个函数仅在一个位置调用,因此我们可以内联它们。另外,如上所述,摆脱错误消息。(764个足迹点。)
shared void footprint() {
if (exists s = process.arguments[0]) {
if (s == "test") {
print(0);
} else {
print(sum({ 0, for (c in s) sum({ 0, for (i in 0..7) if (c.integer.get(i)) 1 }) }));
}
}
}
实际上sum
,我们不需要内部嵌套,我们可以对此大加理解。(这为我们节省了37个足迹点sum({0,})
,而空格则节省了更多,总之会消除。)这是697:
shared void footprint() {
if (exists s = process.arguments[0]) {
if (s == "test") {
print(0);
} else {
print(sum({ 0, for (c in s) for (i in 0..7) if (c.integer.get(i)) 1 }));
}
}
}
我们可以对特殊的"test"
大小写字符串应用类似的原理:在这种情况下,结果为0(即,总和没有任何贡献),我们可以将其作为求和的一部分(但必须将条件求反) 。这主要为我们节省了print(0);
,一些花括号和一堆缩进空间,最大占用空间为571:
shared void footprint() {
if (exists s = process.arguments[0]) {
print(sum({ 0, if (s != "test") for (c in s) for (i in 0..7) if (c.integer.get(i)) 1 }));
}
}
我们对第一个进行相同的操作if
,其副作用是现在不给出任何参数也将输出0
而不是不执行任何操作。(至少我以为这会在这里发生,相反它似乎挂着一个永恒的循环?奇怪。)
shared void footprint() {
print(sum({ 0, if (exists s = process.arguments[0]) if (s != "test") for (c in s) for (i in 0..7) if (c.integer.get(i)) 1 }));
}
我们其实可以省略()
的sum
功能在这里,使用替代函数调用的语法,它使用{...}
的不是()
,并会在内涵补进可迭代的参数。这具有足迹538:
shared void footprint() {
print(sum{ 0, if (exists s = process.arguments[0]) if (s != "test") for (c in s) for (i in 0..7) if (c.integer.get(i)) 1 });
}
footprint
用p
(3)代替函数名称(40)可以节省37点,使我们达到501。(锡兰函数名称必须以小写字母开头,因此在这里不能少于3分。)
shared void p() {
print(sum{ 0, if (exists s = process.arguments[0]) if (s != "test") for (c in s) for (i in 0..7) if (c.integer.get(i)) 1 });
}
变量名称s
(5)和c
(4),i
(4)也不是最佳的。让我们用a
(参数),d
(数字?)和b
(位索引)代替它们。占地面积493:
shared void p() {
print(sum{ 0, if (exists a = process.arguments[0]) if (a != "test") for (c in a) for (b in 0..7) if (c.integer.get(b)) 1 });
}
我看不到任何剩余的非空白优化,因此让我们删除不需要的空白(每个空格1点,两个换行符每个2点):
shared void p(){print(sum{0,if(exists a=process.arguments[0])if(a!="test")for(c in a)for(b in 0..7)if(c.integer.get(b))1});}
浏览API时,我发现Character.hash实际上返回与其integer
属性相同的值。但是它只有14分而不是30分,所以我们降至451!
shared void p(){print(sum{0,if(exists a=process.arguments[0])if(a!="test")for(c in a)for(b in 0..7)if(c.hash.get(b))1});}