ボウリングの試合を記録する


25

あなたの仕事は、最大 21 ロール後に10ピンボウリングのゲームで1人のプレーヤーのスコアを合計して出力することです。

ロールは、好みの入力方法で整数のシーケンスとして表されます。各整数は、そのロールでノックダウンされたピンの数に対応しています。

得点

ラウンドの後、そのラウンドでノックダウンされたピンの数が最終スコアにカウントされます。プレイヤーがラウンドの最初のロールで10個のピンをすべて倒した場合、これはストライクであり、ラウンドは終了します。それ以外の場合、ラウンドはもう1回ロールされます。ラウンドの2番目のロールが残りのすべてのピンをノックダウンした場合、これはスペアです。

ストライクごとに、次の2回のロールでノックダウンされたピンの合計に等しいボーナスがあります。各スペアには、次のロールでノックダウンされたピンの数に等しいボーナスがあります。

10回目および最終ラウンドでは、プレーヤーに追加のロールが許可される場合があります。ストライクの場合、プレーヤーはストライクボーナスを補うためにさらに2つのロールを取得します。予備の場合、プレーヤーはもう1つのロールを取得します。

Input: 4 3 8 2 7 1 10 7 3 0 10 2 2 10 10 5 4
Output: 131

Input: 10 10 9 1 7 3 2 7 10 1 9 10 7 1 10 10 10
Output: 183

ルール

  • 入力が有効であると想定される場合があります。
  • Megoのコメントに従って、現在の標準を満たすために入出力メソッドの要件を緩和しました。
  • チャレンジより新しい言語での回答が許可されています
  • 最短のコードが勝ちます!

ボーナスがスタックしないことを正しく覚えていますか?
タイタス

@Titus私は正確にあなたが何を意味するかないんだけど、いや、ボーナスはあなたが2次でノックダウンされているピンの数を追加ストライキのために、すなわち、「スタック」ないロールにかかわらず、彼らはストライキであるかどうかの、か否か。したがって、1回のストライクの最大スコアは30ポイントであり、ゲーム全体の最大スコアは300です
。– daniero

別個のコマンドライン引数はspace separated integers
タイタス

1
@タイタス確かに。これは古い投稿です-受け入れ可能な入力方法に関する今日のコンセンサスは、この時点では確立されていません。実際、チャレンジのルールをさかのぼって変更するのは好きではありませんが、今日の標準がこれに適用されない理由はわかりません(関数パラメーターなどを含む)。
ダニエル

1
@daniero通常のアドバイスは、挑戦を劇的に変えない限り、現代の標準に合うようにルールを緩めることは受け入れられるということです。
Mego

回答:


6

GolfScript、50 41文字

~0]-1%~0{\.9>{+1$3$}{@+.9>3$*}if++}10*p];

GolfScriptでの別の試み(オンラインで実行)。

コードの説明は次のとおりです。このソリューションでは、問題のスタックの性質を利用します(次々にロールを消費します)ので、入力を逆にする必要があります。

~0          # Take the input and evaluate to single numbers on the stack. Add zero.
]-1%~       # Reverse the stack (make array, reverse array, dump array)

0           # Start with a sum of zero
{           # Perform this block 10 times (once for each round)
  \         #   Take the next roll
  .9>{      #   If it is a strike
    +       #     Add the value of the roll to the sum
    1$3$    #     and duplicate top two members of the stack (i.e. next two rolls).
  }{        #   ... else ...
    @+      #     Take the next roll and add with first roll in round.
    .9>     #     Does this sum show a spare?
    3$*     #     Get next roll (potential bonus) and multiply with yes/no.
            #     Since we pushed an additional 0 in the beginning 
            #     there is a spare roll even for the last round.
  }if       #   endif
  ++        #   Add top three stack entries together
            #   (i.e. sum+2 bonus rolls for strike, sum+rolls+bonus else)
}10*        # Loop ten times

p];         # Sum is top of stack. Print sum and discard any leftover rolls.

前のバージョン:

~].1>.1>]zip{((.10<{@(0=@+@1>1$9><}*@}10*;]{+}.@**

5

パイソン、116の 110 105 103 100 99文字

z=map(int,raw_input().split())
s=0
exec('s+=sum(z[:2+(z[0]+z[1]>9)]);z=z[2-(z[0]>9):];'*10)

入力に30文字を使うのは面倒です。提案を歓迎します。

改善のためにハワードに感謝します。


に置き換え1+(z[i]!=10)2-(z[i]>9)1つの文字を保存できます。
ハワード

@Howard:素晴らしい提案。私は答えにそれを取り入れました。2文字を保存しました。
スティーブンランバルスキー

i完全に削除(0に設定)してi+=...使用する代わりにさらに2つz=z[2-(z[0]>9)::];
ハワード

@ハワード:ありがとうございます。3文字を保存しました。
スティーブンランバルスキー

I / Oの標準は一般的に柔軟性が増しているため、問題z=input()はありません(intsのリストの文字列表現を効率的に取得し、evalそれを実行します)。ただし、完全なプログラムはどこかに出力されるはずです(当時もそうだったと思います)。そのため、これはこの78バイトプログラムに
ジョナサンアラン

4

R、101バイト

なぜこの課題にぶつかったのかわかりませんが、私はそれが好きなので、とにかく答えに遅れます。

f=function(x,s=0,c=10)`if`(c&length(x),f(x[-(0:(x[1]!=10)+1)],sum(x[1:(2+(sum(x[1:2])>9))])+s,c-1),s)

オンラインでお試しください!

ゴルフをしていない:

f <- function(throws, score = 0, count = 10){
  if(count != 0 & length(throws) != 0){
    IsStrike <- throws[1] == 10
    IsStrikeOrSpare <- sum(throws[1:2]) >= 10
    f(throws[-c(1, 2 * !IsStrike)],
      score + sum(throws[c(1:(2 + IsStrikeOrSpare))]),
      count - 1)
  } else {
    return(score)
  }
}

再帰関数。かかるxスコアを保持し、入力として。sコアを初期化し、c投げられたラウンドの量を数えます。

ifステートメントは、10ラウンドがスローされるかどうか、またはx空かどうかをチェックします。その場合、スコアが返されます。それ以外の場合、関数は次のように自分自身を呼び出します。

xストライクかどうかをチェックすることにより、からスローを削除します。その場合、最初のエントリが削除され、そうでない場合は最初の2つが削除されます。(S=x[1]!=10)ストライクをチェックします。-index ()を削除します0:S。ここでS、ストライキであれば1、そうでなければ0です。次に、1つ追加します-(0:(x[1]!=10)+1)。短縮さxれたものを次の呼び出しに渡します。

スコアに関しては、これはx[1:2]通常のターンであるx[1:3]かどうか、およびストライキまたはスペアであるかどうかを調べることで見つけられます。sum(x[1:2])が10以上かどうかを確認します。ストライキの場合は、明らかにそうです。スペアの場合、これも機能します。したがって、これがTRUEの場合x[3]、合計に加算されます。これはに追加されsます。


1

CoffeeScript(234 215 170)

z=(a)->b=(Number i for i in a.split(' ').reverse());t=0;(r=b.pop();l=b.length;if(9<r)then(t+=r;t+=b[l-1]+b[l-2];)else(f=r+b.pop();t+=f;(t+=b[l-2])if 9<f))for i in[0..9];t

編集:多額の書き直し、ハワードの優れたスタックベースのアプローチを恥知らずに盗用します。配列の最後の要素を破壊せずにアクセスするために、もっと多くのものを取り除くことができると確信しています...


1

ルビー、252バイト

配列への入力を受け入れ、最初にすべての要素を追加してから、スペアとストライクボーナスを検索します

s,p,t,r=0,0,1,1
o=ARGV
o.each_with_index do |m,n|
y=m.to_i
s+=y
if r<10
p+=y
if p==10&&t==1
r,p=(r+1),0
s+=o[n+1].to_i+o[n+2].to_i
elsif p<10&&t==1
t=2
elsif p<10&&t==2
t,p,r=1,0,(r+1)
elsif p==10&&t==2
t,p,r=1,0,(r+1)
s+=o[n+1].to_i
end end end
puts s

1

PHP、82バイト

for($a=$argv;$r++<10;$i+=$p<10)$s+=(9<$q=$a[++$i+1]+$p=$a[$i])*$a[$i+2]+$q;echo$s;

コマンドライン引数から入力を受け取ります。オンラインで実行する-nr、オンラインでテストします

壊す

for($a=$argv;       # import arguments
    $r++<10;        # loop through rounds
    $i+=$p<10)          # 6. if no strike, increment throw count again
    $s+=(9<
        $q=$a[++$i+1]+  # 1. increment throw count  2. $q=second throw plus
        $p=$a[$i]       # 3. $p=first throw
        )*$a[$i+2]      # 4. if $q>9 (strike or spare), add third throw to sum
    +$q;                # 5. add first and second throw to sum
echo$s;             # print sum


1

ゼリー 36  35 バイト

+\µi©⁵+Ị$ḂḤị;®×Ị¤¡-
;0Ç3ƤFṣ-m€2Fḣ⁵S

整数のリストを受け入れ、整数を返す単項リンク。

オンラインでお試しください!

どうやって?

3つのボウルの重複する各実行のスコアを、フレームの先頭から開始したものとして計算し、オプションでストライク識別子(-1)を追加し、この結果のリストをフラット化し、ストライク識別子で分割し、1秒ごとの結果を破棄します各チャンク(実際にはフレームの開始から開始されなかった実行のスコアを削除します)。

最後のフレームに対応するために、最初にゼロが入力に追加され(3方向のスライスにより最後から2番目のボウルでフレームが開始できるように)、結果のスコアは最初の10に切り捨てられます(現在の偽の可能性がある11番目のフレーム)を合計する前に。

+\µi©⁵+Ị$ḂḤị;®×Ị¤¡- - Link 1, threeBowlEvaluate: list, bowlScores
                    -               e.g. [0,4,6]   [9,1,10]   [0,4,4]  [10,7,9]
 \                  - cumulative reduce with:
+                   -   addition         [0,4,10]  [9,10,20]  [0,4,8]  [10,17,26]
  µ                 - monadic chain separation, call that "left"
     ⁵              - literal ten        10        10         10       10
   i                - first index in left 3         2 (spare)  0        1 (strike)
    ©               - (copy to register for later reuse)
        $           - last two links as a monad (f(x)):
       Ị            -   abs(x) <= 1       0         0          1        1
      +             -   add x             3         2          1        2
         Ḃ          - modulo by 2         1         0          1        0
          Ḥ         - double              2         0          2        0
           ị        - index into left (both 1-indexed and modular)
                    -            ...      4        20          4       26
                  - - literal -1         -1        -1         -1       -1
                 ¡  - repeat:
            ;       - ...action: concatenate
                ¤   - ...number of times: nilad followed by link(s) as a nilad:
             ®      -   z from register   3         2          0        1
               Ị    -   abs(z) <= 1       0         0          1        1
              ×     -   multiply          0         0          0        1 (strike)
                    - ...yielding:        4         20         4        [26,-1]

;0Ç3ƤFṣ-m€2Fḣ⁵S - Main link: list bowlValues
                -                    e.g. [4,3,8,2,7,1,10,7,3,0,10,2,2,10,10,5,4]
 0              - literal zero            0
;               - concatenate             [4,3,8,2,7,1,10,7,3,0,10,2,2,10,10,5,4,0]
   3Ƥ           - for infixes of length 3:
  Ç             -   last link (1) as a monad
                -                         [7,11,17,9,8,11,[20,-1],10,3,12,[14,-1],4,12,[25,-1],[19,-1],9]
     F          - flatten                 [7,11,17,9,8,11,20,-1,10,3,12,14,-1,4,12,25,-1,19,-1,9]
       -        - literal -1              -1
      ṣ         - split at                [[7,11,17,9,8,11,20],[10,3,12,14],[4,12,25],[19],[9]]
          2     - literal two             2
        m€      - modulo slice for €ach   [[7,17,8,20],[10,12],[4,25],[19],[9]]
           F    - flatten                 [7,17,8,20,10,12,4,25,19,9]
             ⁵  - literal ten             10
            ḣ   - head to index           [7,17,8,20,10,12,4,25,19,9] (no effect this time)
              S - sum                     131

0

Perl、140?

最初の試み:

#!/usr/bin/perl
# usage: ./bowling.pl [list of scores]

@A=@ARGV;{last if(9<$n++);$a=shift@A;$S+=$a;($S+=$A[0]+$A[1])&redo if($a==10);$b=shift@A;$S+=$b;($S+=$A[0])&redo if(10==$a+$b);redo}print$S

悲しいことに、失敗する特定のケースがあります。後で来てやり直します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.