Điểm bowling mười chân - Phiên bản Bowling thế giới


20

Thế giới Bowling ghi bàn

Nhiều người đã đến trung tâm bowling địa phương của họ để chơi một vài trò chơi bowling, và nhiều người tiếp tục đấu tranh để tính điểm của họ. World Bowling đã giới thiệu một hệ thống tính điểm đơn giản hóa để thu hút nhiều người hơn đến với môn thể thao này. Hệ thống tính điểm này được sử dụng trong các trò chơi quốc tế.

Hệ thống tính điểm hoạt động như thế này (từ Wikipedia ):

Hệ thống tính điểm Bowling thế giới được mô tả là "tính điểm khung hình hiện tại" [32] Ghim chốt theo sau như sau:

  • đình công: 30 (bất kể kết quả của cuộn tiếp theo)
  • dự phòng: 10 điểm rơi trên cuộn đầu tiên của khung hiện tại
  • mở: tổng số pinfall cho khung hiện tại

Nếu bạn không quen thuộc với bowling mười chân, đây là một bản tóm tắt.

Có 10 chân ở cuối một đường bowling trong đó mục tiêu là hạ gục tất cả bọn chúng bằng một quả bóng bowling. Bạn nhận được 2 cuộn bóng để cố gắng hạ gục tất cả, tốt nhất là hạ tất cả chúng xuống với cuộn đầu tiên (được gọi là một cú đánh ). Nếu bạn nhận được một cú đánh, thì khung hình đó đã hoàn thành và bạn không cần phải lăn bóng lần thứ hai. Một cuộc đình công có giá trị 30.

Nếu bạn không hạ gục tất cả mười, bạn sẽ có thêm một cuộn. Nếu bạn hạ gục tất cả các chân còn lại, đó được gọi là phụ tùng . Điểm số đáng giá 10 chân + số lượng chân bị hạ gục ở lần lăn đầu tiên. Ví dụ: nếu tôi hạ gục 7 chân, sau đó tìm cách hạ gục 3 chân còn lại, thì đó sẽ là giá trị 17.

Nếu sau cuộn thứ hai của bạn, bạn không thể hạ gục cả mười, thì đó được gọi là khung mở . Điểm số xứng đáng với tổng số chân bị đánh sập cho khung hình đó.

10 khung hình trong một trò chơi . Nếu bạn đã quen thuộc với cách chơi bowling truyền thống, bạn sẽ không có thêm một vòng quay nào trong khung thứ 10 với Ghi điểm Bowling thế giới. Trong cách tính điểm bowling truyền thống, phải mất 12 lần tấn công liên tiếp để có được số điểm hoàn hảo là 300, trong khi đó, việc ghi điểm trong World Bowling chỉ cần 10 lần tấn công liên tiếp.

Thử thách

Thử thách của bạn là tính toán các giá trị đã cho từ một bảng điểm.

Trên bảng điểm, một sai sót được biểu thị bằng dấu gạch ngang ( - ), một cú đánh bằng X và một phụ tùng có dấu gạch chéo ( / ). Nếu những điều này không áp dụng, thì số đếm pinfall chỉ được biểu thị bằng một số (1-9). Lỗi và chia tách cũng được ghi vào bảng điểm nhưng bạn không cần phải lo lắng về những điều này.

Đầu vào

Bạn sẽ được cung cấp một chuỗi bao gồm điểm số cho mỗi khung hình và sẽ có tổng cộng mười khung hình. Mỗi khung sẽ có tối đa hai giá trị hoặc tối thiểu 1 giá trị nếu có một cuộc đình công. Đầu vào của bạn có thể là tham số chuỗi cho một hàm, đọc từ tệp hoặc từ STDIN.

Ví dụ: nếu tôi hạ gục 1 pin trên cuộn đầu tiên của tôi, sau đó hạ xuống 2, khung hình sẽ trông giống như "12". Điều này không có nghĩa là 12 (mười hai), mà có nghĩa là 1 và 2, với tổng số 3.

Nếu tôi bỏ lỡ mọi pin với cả hai cuộn (bóng máng xối), nó sẽ trông như thế này "-" (điểm 0).

Mỗi khung sẽ được phân tách bằng một khoảng trắng.

Đầu vào mẫu

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

Để phá vỡ ví dụ này,

  • Khung 1 (-) - cả hai cuộn bị bỏ lỡ. đạt 0 điểm
  • Khung 2 (9-) - hạ gục 9 ở cuộn thứ nhất, bị trượt ở cuộn thứ hai. Điểm 9
  • Khung 3 (-9) - Bỏ lỡ tất cả ở lần đầu tiên, nhận được 9 vào lần thứ hai. Điểm 9
  • Khung 4 (X) - Tấn công, hạ gục cả mười. Điểm 30
  • Khung 5 (- /) - Dự phòng, bỏ lỡ tất cả ở lần đầu tiên, hạ gục tất cả với cuộn thứ 2. Điểm 10 + 0 = 10
  • Khung 6 (8 /) - Dự phòng, 8 chân trên cuộn thứ nhất, hạ gục 2 cái còn lại với cuộn thứ 2. Điểm 10 + 8 = 18
  • Khung 7 (71) - khung mở, 7 chân ở cuộn thứ nhất, 1 chân trên cuộn thứ hai. Điểm 7 + 1 = 8
  • Khung 8,9,10 theo các ví dụ tương tự như trên.

Đầu ra

Đầu ra đơn giản sẽ là một giá trị có tổng điểm từ tất cả 10 khung. Sử dụng đầu vào mẫu, đầu ra sẽ là 128. Đầu ra của bạn có thể là một chuỗi hoặc một kiểu số. Nó có thể là giá trị trả về của hàm hoặc được ghi vào STDOUT.

Quy tắc

  • Giả sử rằng đầu vào sẽ luôn hợp lệ. Ví dụ: khung không hợp lệ sẽ là "/ 8", "XX", "123", "0", v.v.
  • Bạn không cần phải lo lắng về việc chia tách hoặc phạm lỗi.
  • Mã của bạn có thể là một chương trình đầy đủ hoặc một hàm lấy một chuỗi và trả về điểm số.
  • Mã của bạn không được ném bất kỳ trường hợp ngoại lệ.
  • Đây là mã golf, câu trả lời có số byte ít nhất sẽ thắng.
  • Các ngôn ngữ sử dụng bao gồm hoặc nhập phải bao gồm các câu lệnh nhập như một phần của mã của chúng và được tính vào số byte.

Các trường hợp thử nghiệm

"-- 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
Tôi thất vọng vì đây không phải là một thử thách chơi bowling
Jo King

13
Ví dụ phụ tùng đầu tiên của bạn nói rằng điểm số sẽ là 13, nhưng tôi nghĩ nó được cho là 17.
Jo.

@Jo. Nắm bắt tốt. Tôi đã cập nhật câu hỏi để sửa lỗi đó.
Makotosan

@JoKing Tôi đã nghĩ rằng đây là một thử thách chơi bowling gồm 10 tiểu thư khi lần đầu tiên tôi nhìn thấy tiêu đề.
Weijun Zhou

1
Một trong những thách thức tài liệu và văn bản tốt nhất mà tôi đã thấy.
Joshua

Câu trả lời:


7

05AB1E , 12 11 byte

S'/T:'X30:O

Hãy thử trực tuyến!

Giải trình

S             # Split the string into a list of characters
 '/T:         # Replace '/' with 10
     'X30:    # Replace 'X' with 30
          O   # Sum up the array (ignoring non-number elements)

7

JavaScript, 43 byte

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

Làm thế nào nó hoạt động

Chúng tôi chuyển đổi từng nhân vật theo quan điểm của nó:

  • 'X' trị giá 30 điểm
  • '/' trị giá 10 điểm
  • '1' .. '9' trị giá 1 .. 9 điểm
  • các nhân vật khác trị giá 0 điểm

Sau đó tổng hợp tất cả các điểm.

Đổi

Toán tử Bitwise OR| chuyển đổi toán hạng của nó thành Int32 trước khi hoạt động. Khi chuyển đổi sang Int32, trước tiên giá trị chuyển đổi sang định dạng Số (số float 64 bit), sau đó trung kế thành Int32 (hoặc chuyển đổi thành 0 nếu không hợp lệ).

  • ToInt32({'/':10,X:30}[c]) có thể được đọc là:
    • if c == '/': kết quả là 10;
    • if c == 'X': kết quả là 30;
    • mặt khác: kết quả là ToInt32(undefined)-> ToInt32(NaN)-> 0;
  • ToInt32(c) có thể là:
    • if c == '1' ... '9': kết quả là 1 .. 9;
    • nếu c == '': Number(c)là 0, kết quả là 0;
    • mặt khác: Number(c)NaN, kết quả là 0;
  • Bitwise hoặc ở đây giống như "add", vì một trong các toán hạng của nó sẽ là 0

Tổng

  • [c,...s] = shãy để c = s[0], và s = s.slice(1);
    • nếu s là chuỗi rỗng, c không xác định ;
    • mặt khác, c là chữ cái đầu tiên của s
  • không xác định là sai, chuỗi không trống (bao gồm cả không gian) là trung thực

1
Bạn có thể giải thích mã của bạn? trông thực sự tốt
Luis felipe De jesus Munoz

@LuisfelipeDejesusMunoz Chỉ cần thêm một số.
tsh

5

Stax , 13 byte

─*âⁿ┴8òt↨HÉ÷8

Chạy và gỡ lỗi nó

Giải nén, không được chỉnh sửa và nhận xét như vậy.

F               for each character in input, execute...
 9R$'/20*+'X+   build the string "123456789////////////////////X"
 I              get the index of the current character in string
 ^+             increment and add to running total
                (index is -1 when no match; space and dash are 0 score)

Chạy cái này



3

Java 8, 64 59 46 byte

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

-5 byte nhờ @Neil .
-13 byte nhờ @ OlivierGrégoire .

Giải trình:

Hãy thử trực tuyến.

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")dường như tiết kiệm 5 byte.
Neil

Đó là một kỹ thuật thông minh để tạo ra một số chuỗi phụ.
Makotosan


3

F #, 106 103 byte

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

Hãy thử trực tuyến!

Tôi nghĩ rằng câu đố này (không có môn đánh gôn) sẽ là một câu hỏi hay cho hướng dẫn "Lập trình chức năng cho người mới bắt đầu". Và tôi nên biết!

-3 từ Kevin Cruijssen, vì đã phát hiện ra rằng khoảng trắng giữa 'và "then" có thể bị xóa. Cảm ơn!

giải pháp Stax của đệ quy sử dụng các chỉ mục chuỗi là rất rất tốt. Nếu bạn chuyển nó sang F #, bạn có thể lấy nó với 77 byte :

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

Hãy thử trực tuyến này!


1
Tôi không biết rõ về F #, nhưng có vẻ như bạn có thể bỏ khoảng trắng sau '-3 byte.
Kevin Cruijssen

Tôi cũng không! Nhưng bạn nói đúng, phát hiện tốt! Cảm ơn!
Ciaran_McCarthy

2
@Ciaran_McCarthy: Tôi không phiền nếu bạn sao chép giải pháp của tôi nếu bạn cũng muốn đưa nó vào. Mọi người ở đây thường khá cởi mở về loại điều này. Đó là một nỗ lực hợp tác để tìm tất cả các mã nhỏ nhất, ngay cả khi nó chính thức là một cuộc cạnh tranh.
đệ quy

1
Cảm ơn đệ quy. Tôi sẽ bao gồm nó sau đó, bởi vì đó là một giải pháp rất hay và thật thú vị khi xem nó trông như thế nào trong các ngôn ngữ khác nhau.
Ciaran_McCarthy

2

Thạch , 17 byte

ḟ⁾ -“X0/⁵”yV€o30S

Một liên kết đơn âm chấp nhận danh sách các ký tự và trả về một số nguyên

Hãy thử trực tuyến!

Làm sao?

ḟ⁾ -“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

Cũng tại 17:

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

Hãy thử nó



2

Võng mạc , 17 byte

X
///
/
55
\d
*
_

Hãy thử trực tuyến!

Tôi không hoàn toàn cập nhật về những thay đổi Retina mới nhất. Tôi sẽ tìm hiểu thêm về họ khi tôi có cơ hội và xem liệu có bất kỳ thủ thuật mới nào để đánh gôn này không. Mã biến tất cả các cuộc đình công thành ba phụ tùng, tất cả các phụ tùng thành mười điểm, sau đó tất cả các điểm đến số lượng dấu gạch dưới tương ứng. Sau đó, nó đếm số lượng dấu gạch dưới.


2

Perl 5 -pF , 30 27 byte

-3 byte nhờ Xcali

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

Hãy thử trực tuyến!


Bạn có thể cắt hai byte bằng cách sử dụng /X/thay vì y/X//và một byte nữa bằng cách sử dụng m%/%thay vì y%/%%: Dùng thử trực tuyến!
Xcali

@Xcali À, dĩ nhiên rồi. Cận thị golf cổ điển, tôi vẫn đang suy nghĩ về việc y///từ khi tôi thực hiện chúng bên ngoài một vòng lặp. Cảm ơn
TonMedel 26/03/18

1

05AB1E , 14 byte

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

Hãy thử trực tuyến!

Giải trình

þ`              # 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 byte

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

Hãy thử trực tuyến!

Giải trình:

] đầu vào

('-123456789',20 1#'/X')nối 20 /và một Xvào chuỗi-123456789

i. tìm các chỉ số của đầu vào trong chuỗi trên

31|modulo 31 - để thoát khỏi khoảng trắng - chúng không được tìm thấy trong chuỗi, vì vậy i.trả về 31 cho chúng

1#. tìm tổng của các chỉ số


Vì J và Red là hai ngôn ngữ hoàn toàn khác nhau, tốt hơn nên đăng hai câu trả lời riêng biệt, mặc dù chúng có thể làm như vậy. Bạn có thể thêm một liên kết từ câu trả lời Đỏ cho câu trả lời J này, nói rằng đó là một cổng của câu trả lời J của bạn.
Kevin Cruijssen

@Kevin Cruijssen - Ok, cảm ơn - Tôi sẽ làm điều đó. Lý do để đăng chúng cùng nhau là vì rõ ràng giải pháp Đỏ là không cạnh tranh (mặc dù có thể đọc được nhiều :))
Galen Ivanov


1

Thạch , 12 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

⁾/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 byte

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

Hãy thử trực tuyến!

Hy vọng rằng nó không trái với các quy tắc để trả lời câu hỏi của riêng bạn nhưng tôi muốn tham gia vào cuộc vui.

Math.E tạo ra giá trị 2.718281828459045 . Tôi đang sử dụng nó để tạo một số chuỗi filler để đẩy X đến vị trí 30.

indexOfcó được vị trí (dựa trên 0) của ký tự trong chuỗi "12345 ...". Nếu không tìm thấy, nó trả về -1. Chúng ta thêm 1 để tạo 0 này và điều đó cũng làm cho vị trí dựa trên 0 trở thành giá trị của chuỗi.


1

PHP 119 109 byte

-10 byte nhờ @KevinCruijssen

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

Hãy thử trực tuyến!


Bạn có thể thay đổi ($b=='/'?10+(int)$a:((int)$a+(int)$b))thành (int)$a+($b=='/'?10:(int)$b)-10 byte.
Kevin Cruijssen

@KevinCruijssen Cảm ơn, có vẻ tốt! Mặc dù, nhìn vào các câu trả lời khác, có vẻ như tôi đang đi về hướng này sai / dài. :)
Jo.

0

Than , 23 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

  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 byte

	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

Hãy thử trực tuyến!

	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 byte

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

Hãy thử trực tuyến!

Khi reduceing trên một Chuỗi, mỗi char thực sự được chuyển đổi thành char - ai có thể nghĩ. Nhưng điều này có nghĩa là, tôi phải viết \spacevà điều đó làm tổn thương nhiều hơn những gì người ta có thể tưởng tượng. Ngoài ra, khi tạo một số thực tế từ một char, sự kết hợp của bigintstr dường như là sự kết hợp có thể sử dụng duy nhất.

Chà, ngoài tất cả những cuộc đấu tranh này: Hàm ẩn danh trả về điểm số là điều đương nhiên.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.