保龄球

作者:Eric Hodges

在保龄球比赛中,参赛者将获得一场 10 局保龄球比赛的记分卡,并被要求计算分数。

保龄球比赛是将球滚下球道,并试图击倒排列成三角形的 10 个球瓶。保龄球手有两次机会做到这一点。如果在第一次投球时击倒了所有 10 个球瓶,则称为“全中”。全中在记分卡上用 X 表示。如果保龄球手在第一次投球时击倒了一些球瓶,并在第二次投球时击倒了剩余的球瓶,则称为“补中”。补中在记分卡上用 / 表示。

如果保龄球手两次投球都没有击倒所有球瓶,他或她将获得一个分数,表示击倒的球瓶数量。例如,如果他在第一次投球时击倒了 4 个球瓶,在第二次投球时击倒了 3 个球瓶,那么他的得分就是 7 分。

补中的计算方法是,将击倒所有球瓶的 10 分加上下一次投球的得分。例如,如果他击倒了 8 个球瓶,然后是 2 个球瓶,那就是补中。在下一局(“一局”是指下一次尝试击倒 10 个球瓶)中,保龄球手的第一次投球击倒了 4 个球瓶。这意味着,对于他获得补中的一局,保龄球手将获得 14 分。在保龄球记分卡上,这看起来像这样

这意味着,为了计算补中局的总分,您必须等到下一局的第一个球被投出。全中也是类似的,只是您可以计算接下来的两次投球,而不是下一次投球。因此,如果保龄球手在第 1 局获得全中,他将获得 10 分的全中分数,但他还将获得接下来两次投球的得分。如果接下来的两次投球分别击倒了 6 个和 3 个球瓶,那么第 1 局的总分为 19 分(10 + 6 + 3),第 2 局的得分为 9 分(6 + 3)。这样一来,前两局的总分为 28 分,如下所示

您在本次比赛中的挑战是根据这组 10 局比赛计算分数

在您开始之前,我们将给您一点提示。不仅仅是一个提示,我们还将为您提供脚本的起点。可能还有其他方法可以做到这一点,但您将使用数组。为什么?因为我们将为您提供数组

@arrFrames = (2,5,7,"/",8,1,"X",9,"/",5,3,7,0,4,5,"X",2,0)

为什么我们要给您数组?因为当我们测试本次比赛的条目时,我们将用另一个数组替换这个数组。这意味着您的脚本需要能够处理任何 10 局保龄球分数,而不仅仅是我们在这里向您展示的这个分数。

注意:如果您想知道在最后一局出现全中或补中会发生什么,在真实的保龄球比赛中,您将在最后获得第三次投球的机会。在本次比赛中,我们不会考虑这一点。本次比赛的最后一局包含两个数字,最后两局没有补中或全中。我们放入任何数组来测试脚本也将以两个数字结束,最后两局没有补中或全中。换句话说,您不需要考虑最后一局的补中或全中。页面顶部

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

解决方案

http://web.archive.org/web/20081210124632/http://www.microsoft.com/technet/scriptcenter/funzone/games/solutions08/bpssol10.mspx

源代码:event010-eric256.pl

use v6;

my @frames = <2 5 7 / 8 1 X 9 / 5 3 7 0 4 5 X 2 0>;
my @pins;

my $score = 0;

sub score ($ball) {
    return 10  if  $ball eq 'X';
    return $ball;
};

while (@frames) {
    my $frame = @frames.shift;
    last unless defined $frame;
    say "checking $frame";
    given $frame {
        when '/' {
            $score += 10 + score(@frames[1]);
        }
        when 'X' {
            if @frames[1,2] ~~ *, '/' {
                $score += 20;
            }
            else {
                $score += 10 + score(@frames[1]) + score(@frames[2]);
            }
        }
        when '0'..'9' {
            if @frames.elems > 1 {
                $score += $frame unless defined @frames[1] eq '/';
            }
            else {
                $score += $frame;
            }
        }
    }

}
say "$score";