Возможно, многие умеют играть в боулинг и знают, как подсчитываются очки. Если нет, то правила под спойлером.
Одна партия состоит из 10 фреймов. В каждом фрейме у игрока есть два броска. Если игрок сбивает все 10 кеглей первым броском, такой бросок называется страйк (англ. strike — удар). Если игрок сбивает все 10 кеглей за два броска, такой бросок называется спэр (англ. spare — запасной. Если после двух бросков остаются несбитые кегли, такой фрейм называется «открытым». Если во фрейме страйк, сумма очков за этот фрейм будет равна количеству сбитых кеглей в этом фрейме (10 кеглей) плюс количество фактически сбитых кеглей за два следующих броска (в одном или двух фреймах, в зависимости от того, был ли страйк в следующем броске). Если во фрейме сбит спэр, то сумма очков будет равна количеству сбитых кеглей в этом фрейме (10 кеглей) плюс количество фактически сбитых кеглей за первый бросок в следующем фрейме. Если фрейм остался открытым, то сумма очков будет равна количеству сбитых кеглей в этом фрейме. Поскольку количество очков во фрейме, в случае страйка и спэр, зависит не только от бросков в этом фрейме, но и от следующих бросков, особый статус получает последний, 10-й, фрейм. Если в десятом фрейме первым броском выбивается страйк, игрок может сделать ещё два броска в этом же фрейме. Если в десятом фрейме удаётся спэр, игрок может сделать ещё один бросок. Следует отметить, что к спэр и страйкам в 10-м фрейме, естественно, не применяются указанные выше правила, поскольку нет следующего фрейма. Если за два первых броска в десятом фрейме остаются несбитые кегли и фрейм получается открытым, игра заканчивается. Таким образом, максимальное количество очков в одной игре — 300, поскольку максимально в каждом фрейме можно заработать 30 очков (10 очков за страйк в этом фрейме плюс 20 очков за страйки в следующих двух бросках).
В ячейках A2:An – находятся числа, обозначающие количество сбитых кеглей за каждый совершенный бросок. Требуется написать формулу, которая определит количество набранных очков. Количество бросков может быть разным (от 11 до 21). Формула должна автоматически определять количество бросков и корректно считать очки. Т.к. достаточно трудно решить все одной формулой (я не знаю как это сделать), то добавил два дополнительных столбца – номер очередного фрейма и номер удара в фрейме, (не совсем корректно получается, т.к. бонусные удары не являются очередным фреймом, а формула может их определить как 11 и 12 фрейм, но на расчет это не должно влиять, а для уменьшения промежуточных формул дополнительных проверок не делал). Для усложнения задачи можно не ссылаться на значения в столбце B (номер очередного фрейма). Для проверки формулы подсчитал очки при разных исходах игры.
Возможно, многие умеют играть в боулинг и знают, как подсчитываются очки. Если нет, то правила под спойлером.
Одна партия состоит из 10 фреймов. В каждом фрейме у игрока есть два броска. Если игрок сбивает все 10 кеглей первым броском, такой бросок называется страйк (англ. strike — удар). Если игрок сбивает все 10 кеглей за два броска, такой бросок называется спэр (англ. spare — запасной. Если после двух бросков остаются несбитые кегли, такой фрейм называется «открытым». Если во фрейме страйк, сумма очков за этот фрейм будет равна количеству сбитых кеглей в этом фрейме (10 кеглей) плюс количество фактически сбитых кеглей за два следующих броска (в одном или двух фреймах, в зависимости от того, был ли страйк в следующем броске). Если во фрейме сбит спэр, то сумма очков будет равна количеству сбитых кеглей в этом фрейме (10 кеглей) плюс количество фактически сбитых кеглей за первый бросок в следующем фрейме. Если фрейм остался открытым, то сумма очков будет равна количеству сбитых кеглей в этом фрейме. Поскольку количество очков во фрейме, в случае страйка и спэр, зависит не только от бросков в этом фрейме, но и от следующих бросков, особый статус получает последний, 10-й, фрейм. Если в десятом фрейме первым броском выбивается страйк, игрок может сделать ещё два броска в этом же фрейме. Если в десятом фрейме удаётся спэр, игрок может сделать ещё один бросок. Следует отметить, что к спэр и страйкам в 10-м фрейме, естественно, не применяются указанные выше правила, поскольку нет следующего фрейма. Если за два первых броска в десятом фрейме остаются несбитые кегли и фрейм получается открытым, игра заканчивается. Таким образом, максимальное количество очков в одной игре — 300, поскольку максимально в каждом фрейме можно заработать 30 очков (10 очков за страйк в этом фрейме плюс 20 очков за страйки в следующих двух бросках).
В ячейках A2:An – находятся числа, обозначающие количество сбитых кеглей за каждый совершенный бросок. Требуется написать формулу, которая определит количество набранных очков. Количество бросков может быть разным (от 11 до 21). Формула должна автоматически определять количество бросков и корректно считать очки. Т.к. достаточно трудно решить все одной формулой (я не знаю как это сделать), то добавил два дополнительных столбца – номер очередного фрейма и номер удара в фрейме, (не совсем корректно получается, т.к. бонусные удары не являются очередным фреймом, а формула может их определить как 11 и 12 фрейм, но на расчет это не должно влиять, а для уменьшения промежуточных формул дополнительных проверок не делал). Для усложнения задачи можно не ссылаться на значения в столбце B (номер очередного фрейма). Для проверки формулы подсчитал очки при разных исходах игры.MCH
Вот если честно - то достаточно расположить результаты в два столбца (первый-второй удары фрейма), и тогда формула рисуется легко (поскольку диапазон будет фиксированным - и номер фрейма, и номер удара, соответственно, заданы уже расположением данных). После этого останется биться только за минимальное количество знаков...
А вот если Миша захотел, чтобы мы повыделывались над длинными формулами (ибо номер фрейма и номер удара всё равно надо будет вычислять), то я, пожалуй, пас... Ибо пока практического смысла в таких расчётах не вижу. Так-то, конечно, вижу, где можно это использовать - но не в праздники же ломать голову
Вот если честно - то достаточно расположить результаты в два столбца (первый-второй удары фрейма), и тогда формула рисуется легко (поскольку диапазон будет фиксированным - и номер фрейма, и номер удара, соответственно, заданы уже расположением данных). После этого останется биться только за минимальное количество знаков...
А вот если Миша захотел, чтобы мы повыделывались над длинными формулами (ибо номер фрейма и номер удара всё равно надо будет вычислять), то я, пожалуй, пас... Ибо пока практического смысла в таких расчётах не вижу. Так-то, конечно, вижу, где можно это использовать - но не в праздники же ломать голову AndreTM
Вот если честно - то достаточно расположить результаты в два столбца (первый-второй удары фрейма), и тогда формула рисуется легко
Хорошо, Андрей, Меняю расположение данных по твоему предложению Нужно одной формулой посчитать количество очков в партии. Есть формула в 130 знаков (учитывая =)
Для первоначального файла есть формула менее 100 знаков (и написать ее было проще)
Вот если честно - то достаточно расположить результаты в два столбца (первый-второй удары фрейма), и тогда формула рисуется легко
Хорошо, Андрей, Меняю расположение данных по твоему предложению Нужно одной формулой посчитать количество очков в партии. Есть формула в 130 знаков (учитывая =)
Для первоначального файла есть формула менее 100 знаков (и написать ее было проще)MCH
Я располагал данные немного по-другому (бонусные удары - в следующей за десятым фреймом строке, а не в третий столбик данных...) Формула получилась на 101100 82 знака.
Для первоначального файла есть формула менее 100 знаков (и написать ее было проще)
Я предполагал, что опираться надо на данные только первого столбца. Если же эта формула использует данные не только из A2:An, но и из второго/третьего столбца (B,C), то это "не совсем честно" , поскольку эти данные тоже надо как-то рассчитать. Либо внести руками, что увеличивает объём исходной информации. И хотя в моём варианте расположения эти "данные" тоже присутствуют (как я и указывал), - но в "скрытом" виде А вот если всё же эта формула менее чем за 100 знаков считает нужную сумму только из последовательности результатов ударов - вот тут можно подумать...
Я располагал данные немного по-другому (бонусные удары - в следующей за десятым фреймом строке, а не в третий столбик данных...) Формула получилась на 101100 82 знака.
Для первоначального файла есть формула менее 100 знаков (и написать ее было проще)
Я предполагал, что опираться надо на данные только первого столбца. Если же эта формула использует данные не только из A2:An, но и из второго/третьего столбца (B,C), то это "не совсем честно" , поскольку эти данные тоже надо как-то рассчитать. Либо внести руками, что увеличивает объём исходной информации. И хотя в моём варианте расположения эти "данные" тоже присутствуют (как я и указывал), - но в "скрытом" виде А вот если всё же эта формула менее чем за 100 знаков считает нужную сумму только из последовательности результатов ударов - вот тут можно подумать...AndreTM
Skype: andre.tm.007 Donate: Qiwi: 9517375010
Сообщение отредактировал AndreTM - Вторник, 07.01.2014, 13:36
Получается, что наши первоначальные варианты (по последней организации данных) - практически одно и то же (я там ещё лишние скобки настрадал и забыл). Так что готовый результат - 80 знаков (правда, у меня одна строка после таблицы должна быть пустой)
Получается, что наши первоначальные варианты (по последней организации данных) - практически одно и то же (я там ещё лишние скобки настрадал и забыл). Так что готовый результат - 80 знаков (правда, у меня одна строка после таблицы должна быть пустой) AndreTM
Не смог победить ситуацию, когда первый бросок любого из первых девяти фреймов 0, а второй 10 кеглей. Формула даёт ошибочный результат. 10 воспринимается как страйк, а на самом деле это спэр. Отсюда ошибка.
Придумал формулу, для которой достаточно столбца количества сбитых кеглей. Всего 210 символов, но это я ещё не оптимизировал (мозг кипит):
Не смог победить ситуацию, когда первый бросок любого из первых девяти фреймов 0, а второй 10 кеглей. Формула даёт ошибочный результат. 10 воспринимается как страйк, а на самом деле это спэр. Отсюда ошибка.Светлый