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

Чемпионат Урала 2016

Описание     Задачи     Отправить на проверку     Состояние проверки     Результаты
Соревнование завершено

E. Покер

Ограничение времени: 2.0 секунды
Ограничение памяти: 256 МБ
ACM-щик Игорь очень любит логические игры и даже как-то раз написал программу для игры в шашки. Закончив карьеру в АСМ, он осознал, что детское время кончилось и теперь нужно зарабатывать деньги. Конечно, он пошёл работать, но любовь к написанию игр осталась. Игорь решил с помощью методов машинного обучения, оптимизаций на ассемблере и dll-инъекций написать бота для онлайн-покера, который точно сделает его миллионером.
Игорь выбрал самую популярную разновидность покера — Техасский Холдем. В этой разновидности за столом находятся от двух до девяти человек. У каждого игрока есть некоторое количество фишек — его стэк (stack), в ходе игры участники делают ставки — кладут часть своих фишек в общий банк. В конце игры победитель получает содержимое банка. Играют стандартной колодой в 52 карты.
До того как игрокам будут розданы карты, все игроки ставят так называемое анте (ante). Один из игроков назначается дилером (dealer). После этого два игрока, сидящие по левую руку от дилера, ставят так называемые блайнды (blinds). Малый блайнд (small blind) ставит игрок, ближайший к дилеру, а большой блайнд (big blind) — следующий за ним. Правила немного меняются, когда играют два игрока: в этом случае малый блайнд ставит сам дилер.
После того как поставлены анте и блайнды, происходит раздача карт — каждый игрок получает две карты, которые видит только он. С этого момента начинаются торги. Торги проходят в несколько этапов, которые называются улицами.
  • Сначала идёт первый этап торгов, он называется префлоп (preflop).
  • После того как торги на этой улице заканчиваются, на стол раздается флоп (flop) — три карты, которые являются общими для всех игроков. Снова следует этап торгов, также называющийся флопом.
  • Затем выкладывается ещё одна карта — тёрн (turn), и следует одноименный этап торгов.
  • И, наконец, раздаётся пятая карта — ривер (river), и следует последний этап торгов.
После этого, если в игре осталось больше одного игрока, то все игроки вскрывают свои карты, и тот, у кого лучшая комбинация, забирает банк.
Порядок проведения торгов описан ниже. Первое слово на префлопе имеет игрок, сидящий сразу после большого блайнда, а на всех остальных улицах — игрок, сидящий сразу после дилера. В процессе торгов игроки делают ставки по очереди. Ставка игрока не может быть меньше максимальной ставки, сделанной на текущей улице, так называемой текущей ставки (current bet). Но если у игрока не хватает денег, чтобы поставить текущую ставку, то он может сыграть на всё, что у него есть — пойти ва-банк (all-in), при этом слова у него больше не будет. Игрок может сыграть ва-банк и в том случае, если тем самым повысит текущую ставку. В начале каждой улицы текущая ставка обнуляется. Исключение составляет префлоп, где она в начале улицы равна большому блайнду.
Каждый игрок может сделать один из следующих ходов:
  • fold — сбросить карты. Игрок, сбросивший карты, в игре больше не участвует. Заметим, что если к некоторому моменту игры карты сбросили все игроки, кроме одного, он забирает банк, и игра завершается.
  • call — уравнять текущую ставку, если она не равна нулю. Уравнять ставку для игрока означает добавить к своей ставке такую сумму, чтобы результат оказался равен текущей ставке.
  • bet — сделать ставку, если текущая ставка равна нулю.
  • raise — повысить текущую ставку, то есть добавить к своей ставке такую сумму, чтобы результат превысил максимальную сумму, поставленную на этой улице ранее. Повысить можно только ставку, не равную нулю.
  • check — пропустить ход. Пропустить ход игрок может в том случае, если на этой улице ещё не было ставок, либо он — большой блайнд на префлопе и не было повышения ставок (он же уже поставил свой блайнд, поэтому может либо повысить, либо пропустить ход и увидеть флоп). Если игрок имеет возможность пропустить ход и остаться в игре, то он непременно ей воспользуется и не будет сбрасывать карты.
Когда игрок завершил ход, ход переходит к следующему игроку по часовой стрелке. Торги заканчиваются, когда все ставки уравнены — все игроки, не сбросившие карты, поставили одну и ту же сумму.
Бот представляет собой сложную систему, состоящую из множества модулей. Сейчас Игорь работает над модулем распознавания, который устроен следующим образом:
  1. Управление модулю передаётся в момент, когда бот должен сделать ход.
  2. В этот момент запускается компонент компьютерного зрения, который передаёт модулю информацию о текущих стэках игроков. Распознать ставки компонент компьютерного зрения не в состоянии.
В момент вызова у модуля есть информация о начале игры и текущие стэки игроков. Если модуль получил управление в первый раз, тогда он должен по имеющимся данным понять все ходы игроков с самого начала игры. В противном случае у модуля также имеется информация обо всех ходах игроков к началу предыдущего хода бота. По этим данным модулю необходимо вычислить все ходы игроков, начиная с предыдущего хода бота, в том числе сам этот ход.
Помогите Игорю написать этот модуль.

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

В первой строке содержатся 3 целых числа — малый блайнд sb (10 ≤ sb ≤ 500), большой блайнд bb (20 ≤ bb ≤ 1000, sb < bb) и анте a (0 ≤ a ≤ 100).
Далее во второй строке находятся 3 целых числа — количество игроков n (2 ≤ n ≤ 9), позиция дилера d (1 ≤ dn) и позиция бота h (1 ≤ hn). Игроки пронумерованы в порядке, в котором делают ходы — по часовой стрелке.
В третьей строке расположена текущая улица — preflop, flop, turn или river.
В следующих n строках находятся описания игроков, идущие по порядку их номеров. Каждая строка содержит разделённые пробелом имя игрока (непустая строка, состоящая из больших или малых латинских букв и цифр длиной не более 20) и его стартовый стэк (целое число от 1 до 20000 включительно). Все имена игроков различны, игрока с именем «dealing» нет.
В следующей строке содержится целое число k — количество известных боту действий (0 ≤ k ≤ 1000).
Далее следуют k строк, содержащих эти действия. Действиями могут быть ходы игроков или переход на следующую улицу (dealing). Действия выводятся в следующем формате:
  • deal: dealing <street>, street — улица, на которую осуществляется переход;
  • fold: <player> folds;
  • check: <player> checks;
  • call: <player> calls <amount>, amount > 0 — сумма, которую игрок добавил к своей ставке;
  • bet: <player> bets <amount>, amount > 0 — сумма, которую игрок добавил к своей ставке;
  • raise: <player> raises <amount> to <total>, amount > 0 — сумма, на которую игрок увеличил текущую ставку, total > amount — новая текущая ставка.
player — имя игрока. Если игрок пошёл ва-банк, то это действие специально не выделяется, а представляется как raise, bet или call.
Наконец, в последней строке находятся n целых чисел — это текущие стэки игроков. Порядок стэков соответствует порядку игроков при выводе начальных стэков.
Гарантируется, что действия корректны и происходили в хронологическом порядке.

Результат

В первой строке необходимо вывести количество полученных действий — m. Далее в следующих m строках требуется вывести сами действия в порядке их совершения в таком же формате, что и на входе.
Гарантируется, что решение существует и единственно.

Примеры

исходные данныерезультат
10 20 2
5 3 4
preflop
PhilIvey 500
TomDwan 500
ViktorBlom 500
Grobot 500
Ziigmund 500
0
498 478 438 488 478
3
PhilIvey folds
TomDwan calls 20
ViktorBlom raises 40 to 60
10 20 2
5 3 4
flop
PhilIvey 500
TomDwan 500
ViktorBlom 500
Grobot 500
Ziigmund 500
3
PhilIvey folds
TomDwan calls 20
ViktorBlom raises 40 to 60
498 478 438 438 478
4
Grobot calls 50
Ziigmund folds
TomDwan folds
dealing flop
10 20 2
5 3 4
flop
PhilIvey 500
TomDwan 500
ViktorBlom 500
Grobot 500
Ziigmund 500
7
PhilIvey folds
TomDwan calls 20
ViktorBlom raises 40 to 60
Grobot calls 50
Ziigmund folds
TomDwan folds
dealing flop
498 478 338 438 478
2
Grobot checks
ViktorBlom bets 100
50 100 10
2 2 1
preflop
Grobot 2500
ViktorBlom 2000
0
2390 1890
1
ViktorBlom calls 50
Автор задачи: Игорь Чевдарь
Чтобы отправить решение этой задачи на проверку перейдите в Архив задач: 2082. Покер