Ваша задача состоит в том, чтобы подвести итоги и оценку выходного одного игрока в игре 10-контактный боулинг после до 21 рулонов .
Броски представлены в виде последовательности целых чисел в вашем предпочтительном методе ввода . Каждое целое число соответствует количеству пинов, которые были сбиты в этом броске.
счет
После каждого раунда количество выбитых в этом раунде булавок засчитывается в итоговый счет. Если игрок сбивает все десять булавок в первом броске раунда, это удар , и раунд окончен. В противном случае раунд длится еще один бросок. Если второй бросок раунда сбивает все оставшиеся булавки, это запасной .
Для каждого удара есть бонус, равный сумме булавок, сбитых в двух следующих бросках. Для каждого запасного есть бонус, равный количеству булавок, сбитых в следующем броске.
В 10-м и последнем раунде игрок может получить дополнительные броски: в случае удара игрок получает еще два броска, чтобы получить бонус за удар. В случае запаса игрок получает еще один бросок.
Примеры
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
правила
- Вы можете предположить, что ввод действителен.
- Согласно комментарию Мего, я ослабил требования к методам ввода / вывода, чтобы соответствовать нашему текущему стандарту .
- Разрешены ответы на языках, которые новее, чем задание
- Самый короткий код выигрывает!
space separated integers
?Ответы:
GolfScript,
5041 символовЕще одна попытка в GolfScript ( запустите его онлайн ).
Объяснение кода приведено ниже. Решение использует стековый характер проблемы (потребляет броски один за другим), но поэтому ввод должен быть обратным.
Предыдущая версия:
источник
Python,
11611010510310099 символовТратить 30 символов на ввод утомительно. Предложения приветствуются.
Большое спасибо Говарду за улучшения.
источник
1+(z[i]!=10)
на,2-(z[i]>9)
чтобы сохранить один символ.i
полностью (установите в 0) и вместоi+=...
использованияz=z[2-(z[0]>9)::];
z=input()
должны быть в порядке (эффективно взять строковое представление спискаint
s иeval
записать его). Однако полные программы должны где-то выводить (я думаю, что это было и тогда). Таким образом, я считаю, что это может быть изменено на эту 78-байтовую программуR 101 байт
Я не уверен, почему этот вызов был повышен, но мне это нравится, так что я все равно поздно отвечу.
Попробуйте онлайн!
Ungolfed:
Рекурсивная функция. Принимает в
x
качестве входных данных, который содержит оценки. Инициализируетs
ядра иc
подсчитывает количество брошенных раундов.Оператор if проверяет, были ли выброшены 10 раундов или
x
пусто. Если это так, результат возвращается. В противном случае функция будет вызывать себя следующим образом:Он удаляет броски
x
, проверяя, является ли это ударом или нет. Если это так, первая запись удаляется, а первые две.(S=x[1]!=10)
чеки на удары. Мы удаляем (-
) index0:S
, гдеS
1, если это удар, и 0, если нет. А потом добавьте:-(0:(x[1]!=10)+1)
. Мы передаем сокращенныйx
к следующему звонку.Что касается счета, это можно узнать,
x[1:2]
если это обычный ход, аx[1:3]
также удар или запасной. Мы проверяем,sum(x[1:2])
больше или равен 10. Если это удар, очевидно, это так. Если это запасной, то это тоже работает. Так что, если это ИСТИНА, мы добавляемx[3]
к сумме. Это тогда добавлено кs
.источник
CoffeeScript (
234215170)РЕДАКТИРОВАТЬ : здоровенная переписать, бесстыдно плагиат великий подход на основе стека Говарда. Я уверен, что можно получить больше за доступ к последнему элементу массива, не разрушая его ...
источник
Рубин, 252 байта
Принимает входные данные в массив, сначала добавляет все элементы, затем ищет запасной и ударный бонус.
источник
PHP, 82 байта
принимает входные данные из аргументов командной строки; запустить
-nr
или проверить это онлайн .сломать
источник
Perl 5 , 65 + 2 = 67 байт
Требуются
-ap
флагиПопробуйте онлайн!
источник
Желе ,
3635 байтМонадическая ссылка, принимающая список целых чисел и возвращающая целое число.
Попробуйте онлайн!
Как?
Вычисляет счет каждого перекрывающегося цикла из трех чаш, как если бы он был начат в начале кадра и, при необходимости, добавляет идентификатор удара (
-1
), выравнивает этот результирующий список, разбивает его по идентификаторам удара, а затем отбрасывает каждый второй результат из каждый кусок (удаляя оценки тех прогонов, которые действительно не начинались с начала кадра).Чтобы обслужить последний кадр, к входу сначала добавляется ноль (чтобы позволить трехстороннюю нарезку, чтобы позволить кадру начинать с того, что было предпоследней чашей), и результирующие оценки усекаются до первой десятки (чтобы убрать теперь возможен фиктивный 11-й кадр) до их подведения итогов.
источник
Perl, 140?
Первая попытка:
К сожалению, есть определенные случаи, когда это терпит неудачу. Я приду и переделаю это позже.
источник