10ピンボウリングスコア-ワールドボウリングエディション


20

ワールドボウリングの得点

多くの人が地元のボウリングセンターに行ってボウリングのゲームを数回行っており、多くの人がスコアの計算に苦労しています。ワールドボウリングは、より多くの人々をスポーツに引き付けるために、単純化されたスコアリングシステムを導入しました。このスコアリングシステムは、国際的なゲームで利用されています。

スコアリングシステムは次のように機能します(Wikipediaから)。

「現在のフレームスコアリング」[32]と呼ばれるワールドボウリングスコアリングシステムは、次のようにピンを授与します。

  • ストライク:30(ロールの結果に関係なく)
  • スペア:10プラス現在のフレームの最初のロールのピンフォール
  • オープン:現在のフレームの合計ピンフォール

10ピンボウリングに慣れていない場合は、ここで要約します。

ボウリングレーンの端には10本のピンがあり、ゴールはそれらすべてをボウリングボールで倒すことです。ボールを2回ロールして、それらをすべてノックダウンしようとします。できれば、最初のロールでそれらをすべてノックダウンしてください(ストライクとして知られています)。ストライクをした場合、そのフレームは完成しているので、ボールをもう一度転がす必要はありません。ストライキは30の価値があります。

10個すべてをノックダウンしなかった場合、もう1回ロールします。残りのピンをすべてノックダウンすると、スペアとして知られてます。スコアは10ピン+最初のロールでノックダウンされたピンの数に相当します。たとえば、7つのピンをノックダウンした場合、残りの3つをノックダウンできたので、17の価値があります。

2回目のロールの後、10個すべてをノックダウンできない場合、それはオープンフレームとして知られています。スコアは、そのフレームでノックダウンされたピンの総数に相当します。

ゲームに10個のフレームがあります。従来のボウリングスコアリングに精通している場合、ワールドボウリングスコアリングで10番目のフレームに余分なロールはありません。従来のボウリングスコアリングでは、300の完全なスコアを得るには12回連続でストライクが必要でしたが、ワールドボウリングスコアリングでは10回の連続ストライクしか必要ありません。

チャレンジ

あなたの課題は、スコアシートから値を与えられたスコアを計算することです。

スコアシートでは、ミスはダッシュ(-)、ストライクXスペアはスラッシュ(/)で示されます。これらが当てはまらない場合、ピンフォールカウントは単に数字(1-9)で示されます。ファウルとスプリットもスコアシートに記録されますが、これらについて心配する必要はありません。

入力

各フレームのスコアで構成される文字列が与えられ、合計10フレームになります。各フレームには最大2つの値があり、ストライクが発生した場合は1つの値になります。入力は、関数への文字列パラメーター、ファイル、またはSTDINから読み取ることができます。

たとえば、最初のロールで1つのピンをノックダウンしてから2をノックダウンすると、フレームは「12」のようになります。これは12(12)を意味するのではなく、1と2を意味し、合計3です。

両方のロール(ガターボール)ですべてのピンを見逃した場合、この「-」(スコア0)のように見えます。

各フレームはスペースで区切られます。

サンプル入力

-- 9- -9 X -/ 8/ 71 15 44 X

この例を分解するには、

  • フレーム1(-)-両方のロールが失敗しました。0点数
  • フレーム2(9-)-最初のロールで9をノックダウンし、2番目のロールでミスしました。スコア9
  • フレーム3(-9)-1回目はすべて逃し、2回目は9回逃しました。スコア9
  • フレーム4(X)-ストライク、10個すべてをノックダウン。スコア30
  • フレーム5(-/)-スペア、最初はすべてミス、2回目はすべてノックダウン。スコア10 + 0 = 10
  • フレーム6(8 /)-スペア、最初のロールに8ピン、2番目のロールで他の2つをノックダウン。スコア10 + 8 = 18
  • フレーム7(71)-オープンフレーム、最初のロールに7ピン、2番目のロールに1ピン。スコア7 + 1 = 8
  • フレーム8、9、10は上記と同じ例に従います。

出力

出力は、10個すべてのフレームのスコアの合計を含む値になります。サンプル入力を使用すると、出力は128になります。出力は文字列または数値タイプの場合があります。関数の戻り値か、STDOUTに書き込まれます。

ルール

  • 入力は常に有効であると仮定します。たとえば、無効なフレームは「/ 8」、「XX」、「123」、「0」などです。
  • スプリットやファウルについて心配する必要はありません。
  • コードは、完全なプログラムでも、文字列を取り込んでスコアを返す関数でもかまいません。
  • コードで例外をスローしないでください。
  • これはコードゴルフです。バイト数が最も少ない答えが勝ちです。
  • インクルードまたはインポートを使用する言語は、コードの一部としてインポートステートメントを含め、バイトカウントにカウントする必要があります。

テストケース

"-- 9- -9 X -/ 8/ 71 15 44 X" -> 128
"-- -1 2- 12 22 5- 42 61 8- 72" -> 45
"X X X 1/ 2/ 3/ 4/ 5/ -- 9/" -> 174
"X X X X X X X X X X" -> 300
"-- -- -- -- -- -- -- -- -- --" -> 0

21
これがコードボウリングチャレンジではないことに失望している
ジョーキング

13
あなたの最初の予備の例では、スコアが13になると言うが、私は17ことになっていると思います
ジョー。

@ジョー。良いキャッチ。そのエラーを修正するために質問を更新しました。
マコトサン

@JoKingタイトルを初めて見たとき、これは10のサブチャレンジで構成されるコードボウリングチャレンジだと思っていました。
ウェイジュン周

1
私がこれまで見た中で文書化され、書かれた最高の課題の一つ
ジョシュア

回答:



7

JavaScript、43バイト

f=([c,...s])=>c?({'/':10,X:30}[c]|c)+f(s):0

使い方

各文字をそのポイントに変換します。

  • 30ポイント相当の「X」
  • 「/」10ポイント相当
  • '1' .. '9'相当1 .. 9ポイント
  • 0ポイントの価値がある他のキャラクター

次に、すべてのポイントを合計します。

変換する

ビット単位のOR演算子|は、演算の前にオペランドをInt32に変換します。Int32に変換する場合、値は最初に数値(64ビット浮動小数点数)形式に変換してから、Int32にトランクします(または無効な場合は0に変換します)。

  • ToInt32({'/':10,X:30}[c]) 次のように読むことができます:
    • c == '/'の場合:結果は10です。
    • c == 'X'の場合:結果は30です。
    • それ以外の場合:結果はToInt32(undefined)-> ToInt32(NaN)-> 0;
  • ToInt32(c) になり得る:
    • if c == '1' ... '9':結果は1 .. 9;
    • c == '':Number(c)が0の場合、結果は0です。
    • それ以外の場合:Number(c)is NaN、結果は0。
  • オペランドの1つが0になるため、ビット単位またはここは「追加」と同じです。

  • [c,...s] = sさせてc = s[0]、そしてs = s.slice(1);
    • sが空の文字列の場合、cは未定義です。
    • それ以外の場合、cはsの最初の文字
  • undefinedは偽であり、空でない文字列(スペースを含む)は真実です

1
コードを説明できますか?本当によさそうです
ルイスフェリペデジェススムニョス

@LuisfelipeDejesusMunozいくつか追加しました。
tsh



3

Java 8、64 59 46バイト

s->s.map(c->c<46?0:c<48?10:c>87?30:c-48).sum()

@Neilのおかげで-5バイト。@OlivierGrégoireの
おかげで-13バイト。

説明:

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

s->               // Method with an IntStream parameter and integer return-type
  s.map(c->       //  Loop over the characters
          c<46?   //   If the character is a space or '-':
           0      //    Count it as 0
          :c<48?  //   Else-if it's a '/':
           10     //    Count it as 10
          :c>87?  //   Else-if it's an 'X':
           30     //    Count it as 30
          :       //   Else (it's a digit):
           c-48   //    Count it as the value of the digit
       ).sum()    //   And sum everything

1
("123456789//"+1e6+1e6+"X")5バイト節約できるようです。
ニール

これは、フィラー文字列を作成する巧妙な手法です。
マコトサン


3

F#、106103バイト

let s c=Seq.sumBy(fun x->if x=' '||x='-'then 0 elif x='X'then 30 elif x='/'then 10 else int(string x))c

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

この初心者向けのパズルは、「初心者向けの関数型プログラミング」ガイドにとって大きな疑問になると思います。そして、私は知っておくべきです!

-3、Kevin Cruijssen、「」と「then」の間の空白を削除できることを発見しました。ありがとう!

文字列インデックスを使用する再帰的なStaxソリューションは非常に優れています。F#に移植すると、77バイトで取得できます

let s c=Seq.sumBy(fun x->"123456789/???????????????????X".IndexOf(char x)+1)c

これをオンラインで試してください!


1
F#はよくわかりませんが'、-3バイト後にスペースを削除できるようです。
ケビンクルーッセン

私もそうではないです!しかし、あなたは正しい、よく見抜かれている!ありがとう!
Ciaran_McCarthy

2
@Ciaran_McCarthy:私のソリューションも含めたいなら、コピーしても構いません。ここの人々は一般的にこの種のことについてかなりオープンです。たとえそれが正式に競争であったとしても、それはすべての最小のコードを見つけるための協力的な努力です。
再帰的

1
再帰ありがとう。それは非常に素晴らしい解決策であり、異なる言語でどのように見えるかを見るのが面白いので、それを含めます。
Ciaran_McCarthy

2

ゼリー、17 バイト

ḟ⁾ -“X0/⁵”yV€o30S

文字のリストを受け入れ、整数を返すモナドリンク

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

どうやって?

ḟ⁾ -“X0/⁵”yV€o30S - Link: list of characters
 ⁾ -              - literal list of characters [' ','-']
ḟ                 - filter discard
    “X0/⁵”        - literal list of characters ['X','0','/','⁵']
          y       - translate (change 'X's to '0's and '/'s to '⁵'s)
           V€     - evaluate €ach character as Jelly code (the '⁵'s become 10s)
             o30  - logical OR with 30 (change all instances of 0 to 30)
                S - sum

また17時:

”/ẋ20ØD;;”XḊiЀ⁸S

やってみて



2

網膜、17バイト

X
///
/
55
\d
*
_

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

私は、最新のRetinaの変更についてまったく最新ではありません。機会があればもっと調べて、ゴルフをするための新しいトリックがあるかどうかを確認します。このコードは、すべてのストライクを3つのスペアに、すべてのスペアを10ポイントに、そしてすべてのポイントを対応する数のアンダースコアに変えます。次に、アンダースコアの数をカウントします。


2

Perl 5の -pF30の 27バイト

Xcaliのおかげで-3バイト

#!/usr/bin/perl -pF
$\+=m%/%+3*/X/.0+$_ for@F}{

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


あなたは使用して、2つのバイトをカットすることができます/X/代わりにy/X//使用することによってより多くのものをし、m%/%代わりにy%/%%オンラインそれをお試しください!
Xcali

@Xcali Ah、もちろん。古典的なゴルフ近視眼、私はまだy///ループの外でそれらをやったときからという点で考えていました。ありがとう
トンホスペル

1

05AB1E、14バイト

þ`I…/aXS¢ƶT*`O

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

説明

þ`              # Push the digits of the input on the stack (removes everyting that isn't a digit)
  I…/aXS        # Push the input and the array "/","a","X" on the stack
        ¢       # Index of each element in the input ...
         ƶT*    # ... multiplied by its index (a could be anything that can't be found in the input), multiplied by 10.
            `O  # Sum the stack, implicit display

1

J、33バイト

1#.31|('-123456789',20 1#'/X')i.]

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

説明:

] 入力

('-123456789',20 1#'/X')文字列に20 /と1 Xを追加します-123456789

i. 上記の文字列で入力のインデックスを見つけます

31|31を法として-スペースを取り除くために-それらは文字列に見つからないため、i.31を返します

1#. インデックスの合計を見つける


JとRedは完全に異なる2つの言語であるため、同じことを行う場合でも、2つの別々の回答を投稿する方が適切です。赤い回答からこのJ回答へのリンクを追加して、それがJ回答のポートであることを示すことができます。
ケビンクルーッセン

@Kevin Cruijssen-わかりました、ありがとう-やります。それらを一緒に投稿する理由は、明らかに赤のソリューションは非競争的であるためです(読みやすいが:))
ガレンイワノフ


1

ゼリー、12バイト

⁾/X,“½œ‘y|0S

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

使い方

⁾/X,“½œ‘y|0S  Main link. Argument: s (string)

⁾/X,“½œ‘      Literal; yield [['/', 'X'], [10, 30]].
        y     Transliterate; replace '/' with 10, 'X' with 30.
         |0   Bitwise OR with 0. Bitwise operators attempt to cast to int, mapping 
              '0', ..., '9' to 0, ..., 9. All other characters map to 0.
           S  Take the sum.


1

Kotlin、50バイト

x->x.sumBy{"123456789/_${Math.E}_X".indexOf(it)+1}

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

あなた自身の質問に答えることは規則に反しないことを願っていますが、私は楽しみに参加したいと思いました。

Math.E値を生成します2.718281828459045。Xを30の位置にプッシュするためのフィラー文字列を作成するために使用しています。

indexOf文字列「12345 ...」内の文字の位置(0から始まる)を取得します。見つからない場合は、-1を返します。これらを0にするために1を追加します。これにより、0ベースの位置が文字列の値になります。


1

PHP、119 109バイト

@KevinCruijssenのおかげで-10バイト

<?foreach(explode(" ",$argv[1])as$f){[$a,$b]=str_split($f);$n+=$f==X?30:(int)$a+($b=='/'?10:(int)$b);}echo$n;

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


あなたは変更することができます($b=='/'?10+(int)$a:((int)$a+(int)$b))(int)$a+($b=='/'?10:(int)$b)-10バイトのために。
ケビンクルーッセン

@KevinCruijssenありがとう、よさそう!しかし、他の答えを見ると、私はこれについて間違っている/長い道のりを進んでいるように見えます。:)
ジョー。

0

、23バイト

IΣEχΣES⎇№-/Xλ×χ⌕-//XλIλ

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

  Eχ                    Map over 10 frames
      S                 Input the frame
     E                  Map over the characters
            λ           Current character
        №-/X            Search the literal string `-/X`
                    λ   Current character
               ⌕-//X    Find position in literal string `-//X`
             ×χ         Multiply by predefined variable 10
                      λ Current character
                     I  Cast to integer
       ⎇                Ternary
    Σ                   Sum for each frame
 Σ                      Sum over frames
I                       Cast to string for implicit print




0

SNOBOL4(CSNOBOL4)169 151 147バイト

	F =INPUT ' '
R	F '-' =0	:S(R)
T	F 'X' ='_'	:S(T)
S	F LEN(1) . X ARB . Y ' ' REM . F	:F(O)
	X '_' =30
	Y '/' =10
	S =S + X + Y	:(S)
O	OUTPUT =S
END

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

	F =INPUT ' '					;* read input and append a space
R	F '-' =0	:S(R)				;* replace - with 0
T	F 'X' ='_'	:S(T)				;* replace X with _
S	F LEN(1) . X ARB . Y ' ' REM . F	:F(O)	;* set first character to x, remainder up to ' ' to y, and remainder to F
	X '_' =20					;* replace _ in x with 20
	Y '/' =10					;* replace / in y with 10
	S =S + X + Y	:(S)				;* else X and Y are their values so we can sum them
O	OUTPUT =S					;* output the sum
END

0

Clojure、70バイト

#(reduce(fn[s i](+ s(case i\- 0\/ 10\X 30\space 0(bigint(str i)))))0%)

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

ときにreduce思っているだろう-文字列を超えるINGの、それぞれの文字は、実際に文字に変換されます。しかし、これは意地悪で、私は書く必要が\spaceあり、それは想像以上に痛い。また、charから実際の数値を作成する場合、bigintおよびの組み合わせstr唯一使用可能な組み合わせであると思われます。

さて、これらのすべての苦労は別として:自然なスコアを返す匿名関数。


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