Король горы: банк ограбление

15

Пример запуска добавлен 4/11

Разъяснение правил 4/8: Все заявки будут соревноваться в одном гигантском турнире «бесплатно для всех», состоящем из такого количества матчей, сколько мой компьютер может провести за 48 часов.

Любой, кто провел какое-то время за просмотром трансляций на Twitch, знает о распространенности DeepBot и, возможно, даже знаком с его игрой на ставки на Bank Heist . Этот турнир King of the Hill напрямую связан с этой игрой. Не беспокойся, хотя. Я думаю, что я бросил достаточно лишних изломов в эту версию, чтобы сделать вещи интересными.

Быстрый пример

#####GAME 13: 16 players######

Round 1:
gunHeCK bet 0.
PassivePanga bet 69.
SnitcherKing bet 1.
Lurker bet 0.
OC'sRandomTpyos bet 1.
MonisAddiction bet 69.
RaysFive01K bet 28.
LimeadeSneaktar bet 1.
KaylorrCriterion bet 0.
HardHatUmar bet 0.
HeCKuSumer bet 185.

Round 2
HeCKuSumer decided to !guncheck.
LimeadeSneaktar decided to double cross.
MonisAddiction decided to all in.
OC'sRandomTpyos decided to acquire intel.
RaysFive01K decided to deposit.
SnitcherKing decided to finger.
PassivePanga decided to !guncheck.

Results
PassivePanga failed. :(
SnitcherKing failed. :(
OC'sRandomTpyos was successful, and may gain ¥0
MonisAddiction failed. :(
RaysFive01K was successful, and may gain ¥0
LimeadeSneaktar was successful, and may gain ¥1
HeCKuSumer failed. :(

Results:
0. KaylorrCriterion: 3600
1. Lurker: 3600
2. gunHeCK: 3600
3. SnitcherKing: 3586
4. PassivePanga: 2634
5. LimeadeSneaktar: 2496
6. HeCKuSumer: 1909
7. HardHatUmar: 490
8. RaysFive01K: 255
9. OC'sRandomTpyos: 170
10. MonisAddiction: 0

(In this round, 7 players joined the heist, but the dice only rolled right for 3 of them. Of those, only LimeadeSneaktar brought any home--having stolen it from OcsRandomTpyos. RaysFive01K won significantly more, but deposited it all at the bank before leaving. At this point, the players who did not heist are doing well, living off their day jobs.)

#####GAME 14: 231 players######

Round 1:
Lurker bet 0.
HeCKuSumer bet 190.
KaylorrCriterion bet 0.
HardHatUmar bet 0.
MonisAddiction bet 0.
OC'sRandomTpyos bet 1.
gunHeCK bet 0.
LimeadeSneaktar bet 1.
RaysFive01K bet 25.
PassivePanga bet 69.
SnitcherKing bet 1.

Round 2
PassivePanga decided to !guncheck.
OC'sRandomTpyos decided to buy guard.
HeCKuSumer decided to !guncheck.
SnitcherKing decided to finger.
RaysFive01K decided to deposit.
LimeadeSneaktar decided to double cross.

Results
HeCKuSumer failed. :(
OC'sRandomTpyos failed. :(
LimeadeSneaktar failed. :(
RaysFive01K failed. :(
PassivePanga failed. :(
SnitcherKing failed. :(

Results:
0. KaylorrCriterion: 3840
1. Lurker: 3840
2. gunHeCK: 3840
3. SnitcherKing: 3825
4. PassivePanga: 2805
5. LimeadeSneaktar: 2495
6. HeCKuSumer: 1959
7. HardHatUmar: 490
8. MonisAddiction: 240
9. RaysFive01K: 229
10. OC'sRandomTpyos: 161

Six players heisted--but should have been paying more attention to the rabble and backed out, because the probabilities dropped too low to win, and all failed.


#####GAME 15: 300 players######

Round 1:
OC'sRandomTpyos bet 1.
Lurker bet 0.
SnitcherKing bet 1.
MonisAddiction bet 69.
LimeadeSneaktar bet 1.
gunHeCK bet 0.
HardHatUmar bet 0.
RaysFive01K bet 22.
KaylorrCriterion bet 0.
HeCKuSumer bet 195.
PassivePanga bet 69.

Round 2
HeCKuSumer decided to !guncheck.
OC'sRandomTpyos decided to buy guard.
MonisAddiction decided to all in.
PassivePanga decided to !guncheck.
LimeadeSneaktar decided to double cross.
RaysFive01K decided to deposit.
SnitcherKing decided to finger.

Results
OC'sRandomTpyos failed. :(
SnitcherKing failed. :(
MonisAddiction was successful, and may gain ¥0
LimeadeSneaktar failed. :(
RaysFive01K failed. :(
HeCKuSumer failed. :(
PassivePanga failed. :(

And here, the probabilities dropped too low to win again--except for MonisAddiction, who went all in, and therefore avoided the probability modification incurred by the rabble backing out. No winnings are listed here, because a player who wins going all in immediately adds all winnings to its holdings without any possible modification by other players' actions.

Правила игры

Турнир / Структура игры

  • Турнир будет состоять из нескольких игр, выбранных случайным образом между 1000 и 1100, в которых каждая серьезная заявка будет соревноваться одновременно в бесплатной игре для всех.
  • Каждый игрок начинает первую игру с 240 кредитами, а каждую последующую игру - с количеством кредитов, которое у него было в конце предыдущей игры.
  • Каждая игра продолжается в 2 раунда, и в каждом раунде игроков вызывают в порядке, определенном случайным образом, чтобы принять одно решение:
    • В первом раунде игрок может заплатить любое целое число кредитов от 0 до его текущих кредитов, чтобы принять участие в разграблении банка.
    • Во втором раунде каждый игрок, который решил участвовать в ограблении, поставив хотя бы один кредит (далее именуемый как «воровство»), может принять решение о том, чтобы разрешить свою ставку (и при этом, возможно, выполнить какое-либо другое действие), отказаться от ограбления или пойти ва-банк. (Эти параметры дополнительно описаны ниже.)
  • На основании количества наследников и общего количества кредитов, которые они заплатили, выбирается один из пяти банков, на котором будет организован ограбление. Этот выбор влияет на индивидуальную вероятность победы и шансы, по которым определяется выплата. (Банки описаны ниже.)
  • Каждый наследник, который не отказался, с вероятностью (измененной) банка выиграет свою ставку, умноженную на (измененную) ставку банка (округленную в меньшую сторону), или потеряет свою ставку. Обратите внимание, что успех или неудача каждого игрока определяется индивидуально - некоторые преуспеют там, где другие терпят неудачу.
  • Все игроки, независимо от того, участвовали они или нет, преуспели или потерпели неудачу, затем получают зарплату (с исключениями, описанными ниже).
  • Обратите внимание, что невозможно навсегда покинуть игру. В худшем случае игроку придется подождать игру, чтобы получить следующую зарплату.
  • После всех 1000-1100 игр игрок с наибольшим количеством кредитов будет объявлен победителем этого турнира.
  • Турнир будет повторяться неопределенное количество раз (столько, сколько можно рассчитать за 48 часов), и заработок игрока по всем турнирам будет суммирован для определения общего победителя этого конкурса.

Второй раунд ставок

  • Любой игрок, который сделал положительную ставку в первом раунде, может участвовать во втором раунде.
  • В этом раунде игрок может:
    • ответьте со строкой «назад», чтобы отменить ставку. Это установит его ставку на ноль для текущего ограбления, а также немного уменьшит вероятность того, что игроки, оставшиеся в ограблении, добьются успеха. Пользуясь этой опцией, игрок отказывается от зарплаты в 240 кредитов, которая следует за ограблением в качестве наказания за то, чтобы подвергнуть риску оставшиеся воровки. (Остальные наследники преуспеют с вероятностью, равной вероятности банка, умноженной на долю наследников, которые не «отступили».)
    • ответьте строкой «олл-ин», чтобы взорвать все свои кредитные авуары - и взять ссуду на зарплату до следующей зарплаты на 240 кредитов - чтобы купить все лучшее снаряжение и информацию для ограбления и идти в одиночку, сверкая оружием, без полагаться на кого-либо. Такая вероятность победы игрока не может зависеть от других наследников, выпадающих из ограбления, и при этом его выигрыш не может быть украден двойными кроссировщиками. Выигрышные выплаты будут определяться так, как если бы его ставка составляла все его кредитные авуары плюс 240, а проигрыш обнулит его авуары.
    • Ответьте с любой другой строкой (включая пустую строку), чтобы придерживаться предыдущей ставки и пройти грабли как обычно. (Рекомендуемый ответ: "! Guncheck"). Некоторые ответы будут иметь дополнительные побочные эффекты:
      • Ответ «сменить работу» заставит игрока бросить свою работу. В начале этого раунда, в конце каждого раунда, у игрока будет 5% шансов получить работу в новой позиции. Если это удается, игрок нанимается и сразу же получает свою первую зарплату. Каждая новая работа гарантированно платит ровно на 5% больше, чем предыдущая (округленная в меньшую сторону). Это действие будет успешным независимо от того, преуспеет ли ограбление.
      • Ответ «приобрести информацию», в случае успеха ограбления, приведет к тому, что игрок потратит все свои выигрыши с этого ограбления, чтобы получить дополнительно 0,00001 за каждый кредит, потраченный таким образом на шансы банка, который был разыгран только для этого игрока . Это изменение шансов является постоянным. Например, если игрок выбирает это действие, когда грабит банк 1 и выигрывает 6969 кредитов в грабеже, шансы банка 1 для этого игрока будут постоянно увеличены на 0,06969, и игрок ничего не получит от этого грабежа.
      • Ответ «купить охранника» приведет к тому, что игрок выкупит одного из охранников в банке, подлежащем краже. В обмен на постоянное уменьшение 1 кредита на зарплату этого игрока (обычная взятка охранника), игрок получит «постоянную» повышенную вероятность победы в этом банке (из-за того, что охранник «забыл упомянуть» этого игрока полицейским, когда спросил). Вероятность увеличится ровно на 1% от разницы между текущей вероятностью победы игрока в этом банке и 100%. Это действие будет успешным, даже если ограбление не удастся. ПРИМЕЧАНИЕ. Если в любое время у игрока недостаточно кредитов, чтобы заплатить все его защитные взятки, он немедленно и «навсегда» теряет столько вероятных бонусов, сколько и количество взяток, которые не могли быть выплачены,
      • Ответ «депозит», в случае успеха ограбления, оставит все выигрыши игрока на счете в банке, который он получил. Кредиты не будут доступны для каких-либо целей и не будут засчитаны в счет игрока до тех пор, пока они не будут сняты. Этот аккаунт будет платить проценты по ставке 0,14% за игру.
      • Ответ «отозвать», в случае успеха ограбления, добавит к выигрышу игрока все содержимое его счета в банке, который он ограбил. Аккаунт будет обнулен в результате. Обратите внимание, что эти дополнительные выигрыши могут быть украдены двойными кроссерами.
      • Ответ "двойной крест" сделает одну из двух вещей:
        • Если число наследников, сыгравших «двойной кросс», составляет не более 1/10 (округлено в меньшую сторону) от общего числа неучастников, которые решили пройти с этим ограблением (или ровно один, если таких игроков менее 10) ), игрок получит дополнительные выигрыши, равные общему выигрышу всех не-двойных кроссоверов, деленному на количество двойных кроссировщиков (округленное в меньшую сторону). Все не двойные кроссеры в этом случае получают 0 кредитов от ограбления. Другими словами, двойные кроссеры крадут чужие кредиты и равномерно распределяют их между собой.
        • Если количество наследников, сыгравших «двойной крест», превышает пороговое значение, игрок не получит выигрыша (если его ограбление было успешным), его зарплата будет сокращена вдвое, и его уволят с работы. (См. «Сменить работу».) Все не двойные кроссеры (в том числе сброд) в этом случае получат бонусную выплату от общего выигрыша всех двойных кроссоверов, деленного на общее количество не двойных кроссировщиков. Другими словами, заговор стал слишком большим, чтобы держать его в секрете, заговорщики были изгнаны и исключены из ограбления, и все разделили свои ставки на наказание - и их репутация за грязные сделки потеряла их работу.
      • Ответ «палец» (как в случае «перебирая негодяя крысы с двойным скрещиванием») в случае успеха ограбления даст игроку восемь возможностей (равномерное рисование с заменой из набора неучастников), чтобы идентифицировать двойника. Кроссер, который еще не был идентифицирован .
        • Каждый двойник, идентифицированный таким образом, немедленно выплатит аппликатору 25% его текущих кредитных активов (округленных в меньшую сторону) вместо того, чтобы быть застреленным, потерять свою работу и сократить зарплату вдвое (потому что босс не потерпит плохого поведения) и потерять 5% своей вероятности победы в банке, подвергаемом ограблению (поскольку другие наследники в будущем будут крайне подозрительны и могут бросить его под автобус, если что-то станет волосатым). Двойные скрещиватели, определенные таким образом, не влияют на то, был ли двойной скрещивание успешным для других двойных скрещивателей, но они не получают ни одного украденного кредита от двойного скрещивания, и указанные украденные кредиты будут перераспределены обратно не двойные пересекающие.
        • Если двойные кроссеры не будут идентифицированы таким образом, снитч получит стежки, чтобы тратить время каждого, а также заплатит половину своего выигрыша от текущего ограбления, возьмет 5% сокращение своей зарплаты (босс сокращает часы таттлета) и проиграет. 5% его коэффициентов на ставки в текущем банке (поскольку другие наследники с меньшей вероятностью будут щедрыми / справедливыми с их выигрышами в будущем). Половина его выигрышей, таким образом проигранных, будет распределена на двойных кроссоверов без упора, если удвоенные кроссоверы были успешными, или на не двойных кроссеров (включая сброд), если двойные кроссеры потерпели неудачу.

Банки

Банк выбирается с использованием индекса numheisters + int(totalamountbet/100000), где numheisters - это число игроков, сделавших положительную ставку в первом раунде, а totalamountbet - сумма ставок всех этих игроков. Другими словами, сто тысяч кредитов равны 1 дополнительному наследнику. На основании этого индекса будет выбран один из следующих банков, банк с самым высоким порогом, по которому индекс соответствует или превышает:

Bank             Index Threshold   Victory Prob.  Bet Odds
----             ---------------   -------------  --------
0:Municipal                    0           0.540      0.80
1:City                        20           0.488      1.10
2:State                       40           0.425      1.30
3:National                    60           0.387      1.65
4:Federal Reserve             80           0.324      1.95

Обратите внимание, что по мере продолжения турнира вероятность достижения наивысшего уровня банка будет увеличиваться, так как сумма, которую каждый игрок может ставить, имеет тенденцию к росту. Также обратите внимание, что это только начальные шансы и вероятности до того, как они были изменены какими-либо действиями «приобрети интеллект» или «купи охранника». С первоначальными вероятностями и шансами, только городские и национальные банки ожидали выигрыши, превышающие ожидаемые потери.

Сброд

  • Турнир также содержит 500 других игроков, называемых «сброд», которые участвуют как обычные игроки в ограблениях, но в итоге не забиваются. Они служат для того, чтобы сделать каждую игру особенной и несколько менее предсказуемой, и позволяют достичь более рискованных / более прибыльных банков даже с несколькими «настоящими» игроками.
  • Каждая игра будет включать в себя определенное подмножество сбродов, которые будут выбраны случайным образом по всем подмножествам сбродов.
  • Все сброды используют следующую стратегию:
    • Случайно выбирайте ставку с вероятностью, равной вероятности успеха в банке, который будет выбран на основе решений игроков , которые уже приняли решение в этом раунде .
    • Если вы ставите ненулевую сумму, выберите наибольшую из следующих сумм, которые не будут превышать ее текущие авуары: 69, 420, 6969, 80085.
    • Во втором раунде «отступите» с вероятностью, равной 5% плюс 50% от доли игроков, которые уже отступили, в противном случае уклонитесь как обычно. (Обратите внимание, что это означает, что ранние игроки во втором раунде, которые отступают, могут иметь огромные каскадные эффекты среди черни - обратите внимание и будьте готовы к тому, что ограбление рухнет еще до того, как оно начнется)

Входы и выходы

В обоих раундах программам будет предоставлена ​​следующая информация, именно в этом порядке, в качестве аргументов командной строки . Если не указано иное, все значения являются целыми числами без десятичной дроби.

  1. Текущий номер игры (с нулевым индексом)
  2. Круглый номер текущей игры (1 или 2)
  3. Количество игроков в текущей игре (включая сброд).
  4. Количество игроков, которые уже приняли свои ходы в этом раунде.
  5. Количество наследников, которые сделали положительную ставку до сих пор. (Во втором раунде это будет общее количество наследников, которые купили в первом раунде.)
  6. Общее количество кредитов вложено до сих пор. (Во втором туре, это будет на самом деле общее количество кредитов , вложенных в первом туре - в частности, не включает в себя больше , чем первоначальные колах «все в» heisters и делает включать колы «отступить» heisters.)
  7. Количество наследников, которые подтвердили во втором раунде (то есть не "отступить"). Это будет ноль в первом раунде.
  8. (Номер с нулевым индексом) банка, подлежащего краже (во время первого раунда, банка, к которому будет обращаться, если никто не сделает ставку)
  9. Количество кредитов, доступных в данный момент игроку.
  10. Количество кредитов, которое игрок поставил в первом раунде. (Это всегда ноль в первом раунде.)
  11. Количество кредитов, которые игрок получит в своей зарплате в конце каждой игры.
  12. 1, если игрок в настоящее время получает зарплату, 0, если игрок безработный
  13. Позиция игрока в таблице лидеров (не включая чернь) по состоянию на конец предыдущей игры, 1 индексируется. (Определяется как 1 + количество игроков со строго большим количеством кредитов на тот момент. Например, во время первой игры все игроки имеют ранг 1.)
  14. Среднее количество кредитов, удерживаемых всеми игроками (не включая сброд) (представлено в виде десятичного числа)
  15. Среднее абсолютное отклонение в количестве кредитов, принадлежащих всем игрокам (не включая сброд) (представленных в виде десятичного числа)
  16. Максимальное количество кредитов, удерживаемых любым игроком (т. Е. Количество кредитов, удерживаемых игроком ранга 1, не включая сброд)
  17. Количество кредитов, которые игрок сохранил на счету в банке 0
  18. Счет в банке 1
  19. Счет в банке 2
  20. Счет банка 3
  21. Счет банка 4
  22. Индивидуальная вероятность победы игрока в банке 0
  23. Банк 1 вероятность
  24. Банк 2 вероятность
  25. Банк 3 вероятность
  26. Банк 4 вероятность
  27. Индивидуальные шансы игрока на выигрыш в ограблении банка 0
  28. Банк 1 коэффициент
  29. Банк 2 шансы
  30. Банк 3 шанса
  31. Банк 4 коэффициента

В первом раунде игры программа игрока должна напечатать, чтобы вывести целое число от 0 до общего количества кредитов на счете этого игрока. Любая сумма ставки, превышающая доступный кредитный баланс, считается максимальной ставкой. Любой другой вывод (или условие ошибки) будет интерпретироваться как нулевая ставка.

Во втором раунде игры программа игрока должна напечатать для вывода строки, как описано в разделе «Второй раунд ставок» выше. В качестве условия по умолчанию принимается условие ошибки: выполните ограбление как обычно.

контроллер

Турнир будет проводиться с использованием этого контроллера . Примеры ботов там тоже. Все еще проверяется. Больше кода, чтобы прийти. Не стесняйтесь вносить исправления ошибок (на github). Будет обновлено, если какие-либо правила также изменятся.

Чтобы запустить один турнир на своей собственной машине, добавьте строку в Competitors.txt и затем используйте:

python bankheist.py 1000

Правила конкурса

  • Игроки могут подавать любое количество программ для игроков на любом свободно доступном языке, программы которого могут получать аргументы командной строки.
  • Материалы должны содержать довольно четкие инструкции о том, как компилировать программы и запускать их на моем ПК, включая названия необходимых инструментов и точные команды, которые необходимо выполнить. Передача должна включать хотя бы одну команду, которая выполняет программу и может иметь к ней непосредственно добавленные аргументы командной строки.
  • Материалы должны также иметь уникальное имя для их идентификации (без пробелов).
  • Программы должны работать в достаточно короткий промежуток времени. (Я не устанавливаю верхнюю границу того, что является разумным. Скорее, я просто сообщу создателю любую запись, которая, кажется, имеет слишком большое время выполнения, чтобы ускорить ее.)
  • Программы не могут читать или записывать файлы. Они также не могут использовать какой-либо другой способ хранения информации между прогонами. Смысл этой задачи состоит в том, чтобы принимать сложные решения на основе ограниченной / обобщенной информации.
  • Любые из этих правил могут быть изменены в любое время, если это необходимо. В верхней части этого сообщения будет добавлено сообщение с указанием любых таких изменений.
  • Этот конкурс заканчивается не ранее, чем через неделю после того, как последний пользователь отправит сообщения о своем первом представлении . Модификации существующих материалов разрешены в любое время до окончания конкурса. Я сделаю все возможное, чтобы текущий срок обновлялся в сообщении в верхней части этого поста.
  • Этот конкурс заканчивается не ранее, чем через неделю после последнего изменения правил, если таковые имеются. Я сделаю все возможное, чтобы оставлять комментарии для всех пользователей, затронутых изменениями правил.
  • Лучше поспорить, что я сам приму участие в этом конкурсе. ;)
quintopia
источник
Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
Деннис
Может быть, потому что я не знаком с дерганием или ограблением, но есть много правил, которые лучше всего продемонстрировать на небольшом проработанном примере (ах). На данный момент это кажется не очень доступным.
Муги
Царь горы? Я не слышал это имя годами.
бета-распад

Ответы:

6

Несколько «плохих» примеров программ.

Вот некоторые боты, которые я написал для тестирования контроллера. В основном, они просто делают минимально необходимую вещь, чтобы проверить один конкретный тип действия. В зависимости от уровня участия в этом KotH, в финальный турнир будет включено от нескольких до всех из них, так как большая часть стратегии в игре будет зависеть от поведения множества разных ботов.

Я включаю их все здесь в основном в качестве примеров "использования".

Lurker

Никогда не держи пари Если вы не победили это, переосмыслите свою стратегию.

print 0

PassivePanga

Всегда ставьте 69.

import sys


round = int(sys.argv[2])
myyattas = int(sys.argv[9])
if round == 1:
    if myyattas > 69:
        print "69"
    else:
        print "0"
else:
    print "!guncheck"

KaylorrCriterion

Сделайте ставку на Келли тогда и только тогда, когда критерий Келли соблюден. Так как это редко случается с первым «приобретением информации» и «покупкой охранника», это обычно дает тот же результат, что и у Люркера.

import sys
import ast
game,round,numplayers,alreadyplayed,numbet,yattasbet,numready,bankid,myyattas,mybet,mypayment,hired,myrank,mu_yattas,sigma_yattas,max_yattas = map(ast.literal_eval,sys.argv[1:17])
bankholdings = map(int,sys.argv[17:22])
bankprobs = map(float,sys.argv[22:27])
bankodds = map(float,sys.argv[27:32])

def get_bank(bettors,credits):
    selector = min(4,int(bettors+int(credits/100000.)/20))
    return bankprobs[selector],bankodds[selector]



if round == 1:
    if alreadyplayed < 0.37*numplayers or numbet==0:
        print 0
        #sys.stderr.write("1: %d,%d\n"%(alreadyplayed,numbet))
    else:
        ratiosofar = numbet/float(alreadyplayed)
        bettors = ratiosofar * numplayers
        ratesofar = yattasbet/float(numbet)
        credits = bettors*ratesofar
        p,b = get_bank(bettors,credits)
        f = (p*(b+1)-1)/b
        print max(int(f*myyattas),0)
        #sys.stderr.write("2: %d,%d\n"%(p,b))
else:
    if alreadyplayed < 0.37*numbet or numbet==0:
        print "!guncheck"
    else:
        p,b = get_bank(numbet,yattasbet)
        realp = p*numready/float(alreadyplayed)
        f = (realp*(b+1)-(1-240./(myyattas+240.)))/b
        print "!guncheck" if f>0 else "back out"

gunHeCK

Делайте ставку на Келли тогда и только тогда, когда количество увиденных к настоящему времени наследников указывает на то, что ставка будет соответствовать критерию Келли (но не отступайте, если ошиблись). Обычно делает хуже, чем Люркер

import sys
import ast
game,round,numplayers,alreadyplayed,numbet,yattasbet,numready,bankid,myyattas,mybet,mypayment,hired,myrank,mu_yattas,sigma_yattas,max_yattas = map(ast.literal_eval,sys.argv[1:17])
bankholdings = map(int,sys.argv[17:22])
bankprobs = map(float,sys.argv[22:27])
bankodds = map(float,sys.argv[27:32])

def get_bank(bettors,credits):
    selector = min(4,int(bettors+int(credits/100000.)/20))
    return bankprobs[selector],bankodds[selector]

if round == 1:
    if alreadyplayed < 0.37*numplayers or numbet==0:
        print 0
        #sys.stderr.write("1: %d,%d\n"%(alreadyplayed,numbet))
    else:
        ratiosofar = numbet/float(alreadyplayed)
        bettors = ratiosofar * numplayers
        ratesofar = yattasbet/float(numbet)
        credits = bettors*ratesofar
        p,b = get_bank(bettors,credits)
        f = (p*(b+1)-1)/b
        print max(int(f*myyattas),0)
        #sys.stderr.write("2: %d,%d\n"%(p,b))
else:
    print "!gunHeCK"

Moni'sAddiction

Иди "олл-ин", если уже не выиграл.

import sys
import random


round = int(sys.argv[2])
myrank = int(sys.argv[13])
mybet = int(sys.argv[10])

if round == 1:
    if random.random()<0.1:
        print 1
    else:
        print 69
else:
    if myrank>1:
        print "all in"
    else:
        if mybet==1:
            print "back out"
        else:
            print "!guncheck"

HeCKuSumer

Всегда ставьте небольшую постоянную долю авансов.

import sys

round = int(sys.argv[2])
myyattas = int(sys.argv[9])

if round==1:
    print int(0.1*myyattas)
else:
    print "!guncheck"

OC'sRandomTpyos

В начале турнира много меняются местами. Потратьте все эти деньги на улучшение вероятностей и шансов. Затем потратьте несколько последних игр на олл-ин. Вероятно, было бы намного лучше, если бы не олл-ин, если только вы не в топе.

import sys
import ast
import random

game,round,numplayers,alreadyplayed,numbet,yattasbet,numready,bankid,myyattas,mybet,mypayment,hired,myrank,mu_yattas,sigma_yattas,max_yattas = map(ast.literal_eval,sys.argv[1:17])
bankholdings = map(int,sys.argv[17:22])
bankprobs = map(float,sys.argv[22:27])
bankodds = map(float,sys.argv[27:32])

if round == 1:
    if game<800 or myrank>3:
        print 1
    else:
        print myyattas/4
else:
    if game<800:
        if hired:
            print "change jobs"
        else:
            print random.choice(["acquire intel","buy guard"])
    else:
        if myrank>3:
            print "all in"
        else:
            print "!guncheck"

HardHatUmar

По возможности меняет работу для большей части турнира. Избегает ставок больше необходимого минимума. Делает прилично хорошо, но не замечательно.

import sys

game = int(sys.argv[1])
round = int(sys.argv[2])
hired = int(sys.argv[12])

if round==1:
    if game < 900 and hired:
        print 1
    else:
        print 0
else:
    print "change jobs"

LimeadeSneaktar

Поменяйте местами по возможности во время первой части турнира. Проведите в каждой игре двойное скрещивание. Хорошо прилично даже против SnitcherKing. Вероятно, будет хуже, когда многие другие боты будут дважды перебирать и перебирать. Если нет - правила могут нуждаться в изменении.

import sys
import ast

game,round,numplayers,alreadyplayed,numbet,yattasbet,numready,bankid,myyattas,mybet,mypayment,hired,myrank,mu_yattas,sigma_yattas,max_yattas = map(ast.literal_eval,sys.argv[1:17])
bankholdings = map(int,sys.argv[17:22])
bankprobs = map(float,sys.argv[22:27])
bankodds = map(float,sys.argv[27:32])

if round==1:
    print 1
else:
    if hired and game<900:
        print "change jobs"
    else:
        print "double cross"

SnitcherKing

Всегда ставьте по минимуму и всегда пальцем. Хорошо справляется с небольшими турнирами, которые включают LimeadeSneaktar.

import sys

round = int(sys.argv[2])

if round == 1:
    print 1
else:
    print "finger"

RaysFive01K

Немного сложнее - и, следовательно, на самом деле довольно хорошо. Большая часть его преимущества заключается в депонировании всех выигрышей в раннем турнире (защите их от двойных кроссоверов), повышении вероятностей его выигрыша (и смене мест работы для оплаты всех этих охранников и ограблений), а затем снятии их всех в конце игры ( после того, как они заработали серьезный интерес, и вероятность отказа от вывода достаточно низкая - хотя здесь потери для двойных кроссоверов - серьезный риск). Это определенно будет в турнире, и может быть или не быть серьезным соперником.

import sys
import ast
import random
game,round,numplayers,alreadyplayed,numbet,yattasbet,numready,bankid,myyattas,mybet,mypayment,hired,myrank,mu_yattas,sigma_yattas,max_yattas = map(ast.literal_eval,sys.argv[1:17])

bankholdings = map(int,sys.argv[17:22])
bankprobs = map(float,sys.argv[22:27])
bankodds = map(float,sys.argv[27:32])

if round ==1:
    if game < 900:
        print myyattas/10
    else:
        print 1
else:
    if game < 500 and hired:
        print random.choice(["change jobs","finger","buy guard"])
    elif game < 900:
        print "deposit"
    elif bankholdings[bankid]>0:
        print "withdraw"
    else:
        if alreadyplayed/float(numplayers)<0.5:
            print "finger"
        else:
            print "back out"
quintopia
источник
Я одобряю эти названия <вставьте мемы Twitch & Panga>
CAD97
2

Одинокий Джон

import sys
import ast

game,round,numplayers,alreadyplayed,numbet,creditsbet,numready,bankid,mycredits,mybet,mypayment,hired,myrank,mu_credits,sigma_credits,max_credits = map(ast.literal_eval,sys.argv[1:17])

bankholdings = map(int,sys.argv[17:22])
bankprobs = map(float,sys.argv[22:27])
bankodds = map(float,sys.argv[27:32])

if round == 1:
    if mycredits > 100 or hired:
        print(int(mycredits)/2)
    else:
        print(0)
else:
    if bankprobs[int(bankid)] > 0.6:
        print("all in")
    elif int(mypayment) > 50 :
        print("buy guard")
    elif int(mycredits) > 200 and int(game) < 900 and hired == "1":
        print("change jobs")
    elif bankprobs[int(bankid)] * (float(numready)+1)/(float(alreadyplayed)+1) < 0.30:
        print "withdraw"
    else:
        print "!guncheck"

Подкупайте охранников, пока у него не будет шансов на победу, затем идете ва-банк. В одиночку.

Меняет работу, когда ему нужно больше денег, чтобы подкупить охранников.

MegaTom
источник
как называется этот игрок?
Quintopia
@ Quintopia опс! Я забыл, что у меня есть все возможности для публикации! Добавлено имя и объяснение.
MegaTom
Ницца. Как совет: вам не нужно делать все эти типы. Все уже правильного типа, потому что с самого начала все было в порядке. Это означает, что условие hired == "1"всегда будет ложным и никогда не поменяет работу.
Quintopia
Я просто провел его за один раунд против всех остальных, что сделал. Пришел на последнем месте. Невезение :(
Quintopia