ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила

1543. Танцевальная революция

Ограничение времени: 1.0 секунды
Ограничение памяти: 64 МБ
Dance Dance Revolution, or DDR (known as Dancing Stage in Europe) is a music video games series produced by Konami. As of 2005, over 90 official versions have been produced, including those for home video game consoles. The game is played on a dance pad with four arrow panels: left, down, up, and right. These panels are pressed using the player's feet, in response to arrows that appear on the screen in front of the player. The arrows are synchronized to the general rhythm or beat of a chosen song, and success is dependent on the player's ability to time and position his or her steps accordingly.
From Wikipedia, the Free Encyclopedia.
Танцевальные автоматы DDR очень популярны в Японии. Постепенно они завоевали сердца и ноги многих поклонников со всего мира и появились даже на Урале. Но для суровых уральских условий потребовалось разработать новый вариант, который назвали DDR Ural Mix (сокращенно DDRUMix), основанный на популярном в Японии и, к сожалению, распространенном только там автомате DDR 5th Mix.
Основная конструкция та же: игрок должен в такт выбранной музыке наступать ногами на определенные клавиши в заданной последовательности, таким образом, танцуя. Пока играет музыка, на экране снизу вверх прокручиваются строчки со стрелками; когда строчка доходит до верхней полосы, стрелка вспыхивает ярче, и в этот момент игрок должен наступить на соответствующую клавишу. В зависимости от нажатых клавиш и моментов нажатий действия игрока в каждом периоде, где от игрока требуется нажатие на одну из клавиш, оцениваются как «PERFECT», «GREAT», «GOOD», «BOO» или «MISS». В конце игрок видит общий счет, бонусные очки, и сколько разных шагов он сделал. Также игрок получает оценку за исполнение от «E» (плохо) до «AAA» (если все шаги были ранга «PERFECT»). В самом конце игрок получает общую оценку за все песни, которые он протанцевал.
Поскольку проект совместный, разработку ПО автомата DDRUMix японцы решили доверить ведущим уральским программистам, то есть вам. Первой вашей задачей будет создать систему подсчета очков, заработанных игроком во время одного танца на DDRUMix. Для этого вам необходимо познакомиться с алгоритмом подсчета очков.
Все песни разделены на три уровня сложности: Easy, Medium и Hard (в зависимости от их ритма: Easy — 1 такт в секунду, Medium для 2 тактов в секунду, а Hard для 4 тактов). Промежуток между двумя тактами называется периодом, например, период для сложности Medium составляет 500 миллисекунд. Периоды, в которые от игрока ожидается какое-то действие, называются степами. Каждая песня записана как последовательность тактов с указанием, какой шаг должен сделать игрок в соответствующий период (степ «вверх», «вниз», «влево» или «вправо»). Такт может быть пустым, когда никуда наступать не надо.
Действия игрока в течение «пустого» периода не оцениваются.
Правила оценки действий игрока в одном степе следующие:
  1. Все не первые шаги в течение одного степа не оцениваются.
  2. Если игрок не нажал ни одной клавиши в течение всего степа, он получает оценку «BOO».
  3. Если первый шаг в степе был неправильным, он получает «MISS».
  4. Если нужная клавиша была нажата первым шагом в соответствующем степе, и с начала периода прошло менее 40% периода, то игрок получает «PERFECT», менее 70% — «GREAT», и не менее 70% — «GOOD».
Общий счет игрока складывается из очков за танец, бонуса за комбо и бонуса за уровень исполнения.
Как считать очки за танец:
Пусть Diff = 1 для уровня Easy, 2 для Medium и 3 для Hard.
Пусть B = 106 * Diff.
Пусть p = score multiplier («PERFECT» = 10, «GREAT» = 5, остальное = 0).
Обозначим через N общее число степов (тактов с действиями) и определим число S = (N * (N+1)) / 2. Пусть n — номер текущего степа (от 1 до N), тогда количество очков за этот степ равно:
StepScore = p * n * (B div S),
(здесь B div S означает целую часть от деления B на S). Общий счет за танец равен сумме очков за все степы.
Как считать бонус за комбо:
Комбо — это последовательность подряд идущих степов, состоящая только из «PERFECT», «GREAT» и «GOOD» (конечно, внутри комбо могут также быть пустые такты, но они не учитываются и не увеличивают длины комбо).
Пусть q = step multiplier («PERFECT» = 55, «GREAT» = 33, остальное = 0). Каждый степ в комбо оценивается в q * c очков, где c — номер степа в текущем комбо. Общий бонус за комбо равен сумме очков за все степы во всех комбо.
Как считать бонус за уровень исполнения:
Каждый степ добавляет или вычитает баллы «Dance Points», которые начисляются следующим образом: «PERFECT» добавляет 2 «Dance Points», «GREAT» добавляет 1 «Dance Point», «GOOD» не добавляет ничего, «BOO» вычитает 4 «Dance Points», а «MISS» вычитает 5 «Dance Points».
Бонус за уровень исполнения начисляется так:
AAA = 10 000 000 (если все степы были сыграны «PERFECT»)
AA = 1 000 000 (все степы «PERFECT» или «GREAT»)
A = 100 000 (не менее 80% от максимально возможного количества «Dance Points»)
B = 10 000 (не менее 64% от максимума)
C = 1 000 (не менее 50% от максимума)
D = 100 (менее, чем 50% от максимума)
E = 0 (если в течении игры «Dance Points» опускались ниже нуля).
Зная всю информацию про одну игру (длительность песни, ее сложность, последовательность тактов и нажатий клавиш), вы должны вычислить общий счет и вывести статистику по игре.

Исходные данные

Первая строка содержит длительность песни в формате m:ss (длительность каждой песни не менее 10 секунд и менее 10 минут) и сложность (Easy, Medium или Hard). Вторая строка содержит последовательность тактов. Такт может иметь знак вверх, вниз, влево или вправо (обозначаются соответственно буквами U, D, L и R) или быть пустым (обозначается буквой N). Песня не может состоять из одних пустых тактов. Оставшиеся строки содержат лог действий игрока, где каждому нажатию соответствует одна строка в следующем формате:
<time> <action>
где <time> — время в миллисекундах от начала песни, а <action> обозначается одним из четырех символов U, D, L или R. Заметьте, что человеческая гибкость не позволяет нажимать клавиши чаще, чем раз в 50 миллисекунд.

Результат

Вывести статистику игрока. В первой строке выведите количество оценок «PERFECT», заработанных игроком, во второй — «GREAT», в третьей — «GOOD», в четвертой — «BOO», в пятой — «MISS». Шестая строка — разделитель из 20 дефисов (-). В седьмой строке выведете очки за танец, в восьмой — бонус за комбо, в девятой — бонус за уровень исполнения и в десятой — суммарное количество очков, заработанных игроком. Для пояснения формата вывода смотрите пример.

Пример

исходные данныерезультат
0:30 Easy
NNNNNLNNRNUNNUNNNDDDNNUNNNNRNU
5201 L
8475 R
8735 L
10000 U
13200 U
17284 D
18355 D
19124 D
22222 U
27543 R
29923 U
Perfect: 7
Great: 2
Good: 1
Boo: 0
Miss: 0
--------------------
Stage Score: 7181495
Combo Bonus: 2233
Dance Level Bonus: 100000
Total Score: 7283728
Автор задачи: Денис Мусин
Источник задачи: XI командный чемпионат Урала по спортивному программированию, Екатеринбург, 21 апреля 2007 г