在薄冰上滑冰

作者:Eric Hodges

在“薄冰上滑冰”比赛中,参赛者必须编写一个脚本,以确定花样滑冰比赛的获胜者。

比赛场景

如果你像脚本小子一样,你一生中最美好的愿望就是能够评判花样滑冰比赛。高级组的第二场比赛证明了愿望真的可以实现。

好吧,如果你想吹毛求疵,你实际上并没有资格评判花样滑冰比赛;评判工作已经为你做好了。相反,你要做的只是使用与国际滑冰联盟大致相似的公式来确定谁真正赢得了比赛。听起来很有趣,对吧?

为了确定获胜者,你的脚本必须使用文本文件 Skaters.txt(可以在脚本游戏参赛者包中找到)中的评分信息。文本文件中的每一行都包含比赛参赛者的信息;更具体地说,每一行都包含滑冰者的姓名,以及七位评委给出的分数。

Ken Myer,55,66,76,67,59,70,54

要计算 Ken Myer 的分数,你(或者更准确地说,你的脚本)必须执行以下操作

  • 去掉他七个分数中最高的那个(76)。

  • 去掉他七个分数中最低的那个(54)。

  • 计算剩余五个分数(55、66、67、59 和 70)的平均值。

因此,Ken Myer 的得分将是 63.4(55 + 66 + 67 + 59 + 70,全部除以 5)。

为了获得此项赛事的积分,你的脚本必须报告金牌(得分最高的滑冰者)、银牌(得分第二高的滑冰者)和铜牌(得分第三高的滑冰者)的获得者,以及他们的得分。你的最终输出应该类似于以下内容

Gold medal: Ken Myer, 63.4
Silver medal: Pilar Ackerman, 62.78
Bronze medal: Jonathan Haas, 61.8272

如果你最美好的愿望之一是成功完成这项赛事,请确保将文件 Skaters.txt 放在文件夹 C:\Scripts 中;如果你使用 C:\Scripts 以外的任何文件夹,你的脚本很可能会失败。此外,你必须在命令窗口中显示结果;不要覆盖文件 Skaters.txt。如果你覆盖了该文件,你将不会获得该赛事的任何积分。(我们也不会对你感到高兴,因为你将覆盖我们文件的副本!)

请注意,你的脚本不必包含处理平局的代码。我们已经设置了分数,以确保前三名不会出现平局。

http://web.archive.org/web/20080325083541/http://www.microsoft.com/technet/scriptcenter/funzone/games/games08/aevent2.mspx

源代码:event002-eric256.pl

use v6;

my $input-file = $*SPEC.catdir($*PROGRAM-NAME.IO.dirname, "skaters.txt");
my @lines = slurp($input-file).split("\n");

my %skaters ;
for @lines {
    next unless .chars > 0;
    my @data = .split(',');
    my $score = [+] (@data[1..7].sort)[2..6];
    %skaters{@data[0]} = $score / 5
}

my ($gold, $silver, $bronze) = %skaters.pairs.sort({$^b.value <=> $^a.value})[0,1,2];
say "Gold: {$gold.key}: {$gold.value}";
say "Silver: {$silver.key}: {$silver.value}";
say "Bronze: {$bronze.key}: {$bronze.value}";