Ten-pin bowling score - World Bowling edition
JavaScript, 43 bytes
f=([c,...s])=>c?({'/':10,X:30}[c]|c)+f(s):0
f=([c,...s])=>c?({'/':10,X:30}[c]|c)+f(s):0
Score(<input style="width:200px" oninput="o.value=f(this.value)" />) = <output id=o></output>
How it works
We convert each character to its point:
- 'X' worth 30 point
- '/' worth 10 point
- '1' .. '9' worth 1 .. 9 point
- other characters worth 0 point
Then sum all points.
Convert
Bitwise OR operator |
convert its operand to Int32 before operate. When converting to Int32, value first convert to Number (64bit float number) format, then trunk to Int32 (or converted to 0 if invalid).
ToInt32({'/':10,X:30}[c])
could be read as:- if c == '/': result is 10;
- if c == 'X': result is 30;
- otherwise: result is
ToInt32(undefined)
->ToInt32(NaN)
-> 0;
ToInt32(c)
could be:- if c == '1' ... '9': result is 1 .. 9;
- if c == ' ':
Number(c)
is 0, result is 0; - otherwise:
Number(c)
isNaN
, result is 0;
- Bitwise or here is same as "add", since one of its operand will be 0
Sum
[c,...s] = s
letc = s[0]
, ands = s.slice(1)
;- if s is empty string, c is undefined;
- otherwise, c is first letter of s
- undefined is falsy, non-empty string (including space) is truthy
05AB1E, 12 11 bytes
Code
S'/T:'X30:O
Try it online!
Explanation
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)
Stax, 13 bytes
─*âⁿ┴8òt↨HÉ÷8
Run and debug it
Unpacked, ungolfed, and commented it's thus.
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)
Run this one