Десятиконтактна оцінка боулінгу - World Bowling edition


20

Всесвітнє боулінг

Багато людей вирушили до місцевого центру боулінгу, щоб пограти в кілька ігор у боулінг, і багато людей продовжують боротися, щоб підрахувати свої бали. Світовий боулінг запровадив спрощену систему підрахунку балів, щоб залучити до спорту більше людей. Ця система балів використовується в міжнародних іграх.

Система балів працює так (з Вікіпедії ):

Система окулярів Всесвітнього боулінгу - описана як "поточне підрахунок кадрів" [32] - на штифти наступним чином:

  • страйк: 30 (незалежно від результатів наступних рулонів)
  • запасні: 10 плюс пінфол на перший рулон поточного кадру
  • відкрито: загальний обсяг поточного кадру

Якщо ви не знайомі з десятиконтактним боулінгом, ось резюме.

У кінці боулінг-стрічки є 10 шпильок, де мета - збити їх усіма кулею для боулінгу. Ви отримуєте 2 рулони кулі, щоб спробувати збити їх усіх, бажано збити їх усім першим рулоном (відомим як удар ). Якщо ви все-таки отримаєте удар, то цей кадр завершений, і вам не потрібно вдруге котити м'яч. Страйк коштує 30.

Якщо не збити всі десять, ви отримаєте ще один рулон. Якщо збити всі шпильки, що залишилися, це відоме як запасні . Оцінка варто 10 шпильок + кількість штифтів, збитих у першому рулоні. Наприклад, якби я збив 7 штифтів, то встиг збити решту 3, це коштувало б 17.

Якщо після другого рулону вам не вдасться збити всі десять, це відомо як відкритий кадр . Оцінка варто загальної кількості збитих шпильок для цього кадру.

У грі є 10 кадрів . Якщо ви знайомі з традиційним баллінгу в боулінгу, ви не отримаєте додатковий рулон у 10-му кадрі разом із Всесвітнім боулінгу. У традиційному заліку боулінгу потрібно 12 послідовних ударів, щоб отримати ідеальний бал 300, тоді як для світового боулінгу потрібно лише 10 послідовних ударів.

Виклик

Ваша задача полягає в тому, щоб обчислити отримані значення на балі з таблиць.

На контрольному аркуші промах промальовується тире ( - ), ударом із знаком X та запасний з косою рисою ( / ). Якщо вони не застосовуються, то кількість підкорень просто позначається цифрою (1-9). Фоли та розбиття також записуються на табло, але про них не потрібно хвилюватися.

Вхідні дані

Вам буде надано рядок, що складається з балів за кожен кадр, і буде містити загальну кількість десяти кадрів. Кожен кадр матиме до двох значень, або як мінімум 1 значення, якщо відбувся б удар. Ваш вхід може бути параметром рядка для функції, зчитуваної з файлу або з STDIN.

Наприклад, якби я збив 1 штифт у своєму першому рулоні, а потім збив 2, кадр виглядав би як "12". Це не означає 12 (дванадцять), але означає 1 і 2, в цілому 3.

Якби я пропустив кожну шпильку з обома рулонами (жолоби кульок), це виглядало б так "-" (оцінка 0).

Кожен кадр буде розділений пробілом.

Зразок введення

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

Щоб розбити цей приклад,

  • Рамка 1 (-) - пропущені обидва рулони. забив 0
  • Рамка 2 (9-) - збита 9 на першому рулоні, пропущена на другому рулоні. Оцінка 9
  • Рамка 3 (-9) - Пропустив усіх на першому, отримав 9 на другому. Оцінка 9
  • Рамка 4 (X) - Страйк, збити всі десять. Оцінка 30
  • Рамка 5 (- /) - Запасний, пропустив усіх на першому, збив усіх з 2-го рулону. Оцінка 10 + 0 = 10
  • Рамка 6 (8 /) - Запасні, 8 штирів на першому рулоні, збиті інші 2 з другим рулоном. Оцінка 10 + 8 = 18
  • Рамка 7 (71) - відкрита рамка, 7 штирів на першому рулоні, 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
Я розчарований, що це не виклик боулінгу з кодом
Jo King

13
Ваш перший запасний приклад говорить, що оцінка склала б 13, але я думаю, це має бути 17.
Джо.

@Jo. Хороший улов. Я оновив питання, щоб виправити цю помилку.
Макотосан

@JoKing Я думав, що це виклик боулінгу з кодом, що складається з 10 підзадач, коли я вперше побачив назву.
Вейджун Чжоу

1
Один з найкращих документованих та письмових викликів, які я бачив.
Джошуа

Відповіді:



7

JavaScript, 43 байти

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

Як це працює

Ми перетворюємо кожен символ у його точку:

  • 'X' коштує 30 балів
  • '/' вартує 10 балів
  • '1' .. '9' вартує 1 .. 9 балів
  • інші символи на суму 0 балів

Потім підсумовуйте всі бали.

Перетворити

Бітовий АБО оператор |перетворює свій операнд в Int32 перед операцією. Перетворюючи в Int32, значення спочатку перетворять у формат Number (64-бітний плаваючий номер), а потім - магістраль в Int32 (або перетворюється в 0, якщо недійсна).

  • ToInt32({'/':10,X:30}[c]) можна прочитати як:
    • якщо c == '/': результат дорівнює 10;
    • якщо c == 'X': результат дорівнює 30;
    • в іншому випадку: результат ToInt32(undefined)-> ToInt32(NaN)-> 0;
  • ToInt32(c) може бути:
    • якщо c == '1' ... '9': результат дорівнює 1 .. 9;
    • якщо c == '': Number(c)дорівнює 0, результат - 0;
    • інакше: Number(c)є NaN, результат дорівнює 0;
  • Побітовий або тут такий же, як "додати", оскільки одним з його операндів буде 0

Сума

  • [c,...s] = sнехай c = s[0], і s = s.slice(1);
    • якщо s порожній рядок, c не визначено ;
    • в іншому випадку, c - перша літера s
  • undefined is false, непуста рядок (включаючи пробіл) є правдою

1
Чи можете ви пояснити свій код? виглядає по-справжньому добре
Луїс феліпе Де ісус Муноз

@LuisfelipeDejesusMunoz Просто додав деякі.
tsh

5

Стакс , 13 байт

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

Запустіть і налагоджуйте його

Розпакували, не взяли вогонь і прокоментували це таким чином.

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)

Виконати цей



3

Java 8, 64 59 46 байт

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

-5 байт завдяки @Neil .
-13 байт завдяки @ OlivierGrégoire .

Пояснення:

Спробуйте в Інтернеті.

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 #, 106 103 байт

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 від Кевіна Круїссена, за те, що він помітив, що пробіл між 'і' тоді 'може бути видалений. Спасибі!

Рекурсивне рішення Stax за допомогою рядкових індексів дуже добре. Якщо ви портуєте його до F #, ви можете отримати його на 77 байт :

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

Спробуйте це в Інтернеті!


1
Я не знаю F # дуже добре, але, здається, ви можете залишити пробіли після '-3 байт.
Kevin Cruijssen

Ні я! Але ти маєш рацію, добре помічений! Спасибі!
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. Я більше розглядаю їх, коли отримаю шанс і побачу, чи є якісь нові хитрощі для того, щоб грати в гольф. Код перетворює всі удари в три запасні частини, всі запасні частини на десять пунктів, а потім усі вказує на відповідну кількість підкреслених. Тоді він підраховує кількість підкреслених.


2

Perl 5 -pF , 30 27 байт

-3 байти завдяки Xcali

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

Спробуйте в Інтернеті!


Ви можете вирізати два байти, використовуючи /X/замість y/X//і ще один, використовуючи m%/%замість y%/%%: Спробуйте в Інтернеті!
Xcali

@Xcali Ах, звичайно. Класичний недалекоглядний гольф, я все ще думав 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 /і один Xдо рядка-123456789

i. знаходить індекси введення у наведеному вище рядку

31|modulo 31 - щоб позбутися пробілів - вони не знайдені в рядку, тому i.повертає 31 для них

1#. знаходить суму індексів


Оскільки J і Red - це дві абсолютно різні мови, то краще розмістити два роздільних відповіді, хоча вони можуть зробити те саме. Ви можете додати посилання з червоної відповіді на цю відповідь 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

Котлін , 50 байт

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

Спробуйте в Інтернеті!

Сподіваємось, це не проти правил відповіді на ваше власне питання, але я хотів приєднатися до веселощів.

Math.Eвиробляє значення 2.718281828459045. Я використовую його, щоб створити рядок заповнення, щоб підштовхнути X до позиції 30.

indexOfотримує положення (на основі 0) символу в рядку "12345 ...". Якщо його не знайти, він поверне -1. Додаємо 1, щоб зробити ці 0, і це також зробить позицію на основі 0 значенням рядка.


1

PHP, 119 109 байт

-10 байт завдяки @KevinCruijssen

<?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над рядком кожне знаряддя насправді перетворюється на char - хто б міг подумати. Але це манія, я мушу писати, \spaceі це боляче, ніж можна собі уявити. Крім того, при створенні фактичного числа зі знака поєднання bigintі, strздається, є єдиною корисною комбінацією.

Ну, окрім усіх цих проблем: Анонімна функція, яка повертає оцінку як природну.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.