保龄球
作者: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 局保龄球分数,而不仅仅是我们在这里向您展示的这个分数。
注意:如果您想知道在最后一局出现全中或补中会发生什么,在真实的保龄球比赛中,您将在最后获得第三次投球的机会。在本次比赛中,我们不会考虑这一点。本次比赛的最后一局包含两个数字,最后两局没有补中或全中。我们放入任何数组来测试脚本也将以两个数字结束,最后两局没有补中或全中。换句话说,您不需要考虑最后一局的补中或全中。页面顶部
解决方案
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";