Classificação Final
+ ---------------------------------- + --------- + ---- ----- + --------- + ---------------------------- + | Nome Pontuação | WinRate | TieRate | Probabilidade de eliminação | + ---------------------------------- + --------- + ---- ----- + --------- + ---------------------------- + | 1. SarcomaBotMk11 | 0,06333 6,13% | 0,41% | [42 24 10 8 6 4]% | | 2. WiseKickBot | 0,06189 | 5,91% | 0,56% | [51 12 7 10 7 6]% | | 3. StrikerBot | 0,05984 5,78% | 0,41% | [46 18 11 8 6 5]% | | 4. PerfectFractionBot | 0,05336 5,16% | 0,35% | [49 12 14 10 6 4]% | | 5. MehRanBot | 0,05012 4,81% | 0,41% | [57 12 8 7 6 5]% | | 6. OgBot | 0,04879 4,66% | 0,45% | [50 15 9 8 7 5]% | | 7. SnetchBot | 0,04616 4,48% | 0,28% | [41 29 8 9 5 3]% | | 8. AntiKickBot | 0,04458 4,24% | 0,44% | [20 38 17 10 6 4]% | | 9. MehBot | 0,03636 3,51% | 0,25% | [80 3 4 4 3 3]% | | 10. Meh20Bot | 0,03421 3,30% | 0,23% | [57 12 8 7 9 3]% | | 11. GenericBot | 0,03136 3,00% | 0,28% | [18 39 20 11 5 3]% | | 12. HardCodedBot | 0,02891 2,75% | 0,29% | [58 21 3 6 5 4]% | | 13. GangBot1 | 0,02797 2,64% | 0,32% | [20 31 35 6 3 2]% | | 14. SarcomaBotMk3 | 0,02794 2,62% | 0,34% | [16 15 38 17 7 4]% | | 15. GangBot0 | 0,02794 2,64% | 0,30% | [20 31 35 6 3 2]% | | 16. GangBot2 | 0,02770 2,62% | 0,31% | [20 31 35 6 3 2]% | | 17. TitTatBot | 0,02740 2,63% | 0,21% | [54 10 15 10 5 2]% | | 18. MataHari2Bot | 0,02611 2,35% | 0,51% | [39 26 11 11 6 5]% | | 19. PolyBot | 0,02545 2,41% | 0,27% | [53 18 6 13 5 3]% | | 20. SpitballBot | 0,02502 2,39% | 0,22% | [84 10 1 1 0 1]% | | 21. SquareUpBot | 0,02397 2,35% | 0,10% | [10 60 14 7 4 3]% | | 22. CautiousGamblerBot2 | 0,02250 2,19% | 0,13% | [60 18 10 5 3 1]% | | 23. Bot13 | 0,02205 2,15% | 0,11% | [90 0 2 3 2 1]% | | 24. AggroCalcBot | 0,01892 1,75% | 0,29% | [26 49 13 5 3 3]% | | 25. CautiousBot | 0,01629 1,56% | 0,14% | [15 41 27 11 4 1]% | | 26. CoastBotV2 | 0,01413 1,40% | 0,02% | [83 12 3 1 0 0]% | | 27. CalculatingBot | 0,01404 1,29% | 0,22% | [87 9 1 1 1 1]% | | 28. HalfPunchBot | 0,01241 1,15% | 0,18% | [47 20 13 12 5 2]% | | 29. HalflifeS3Bot | 0,01097 1,00% | 0,20% | [76 9 5 4 2 2]% | | 30. AntiGangBot | 0,00816 | 0,76% | 0,11% | [94 1 1 1 1 1]% | | 31. GeometricBot | 0,00776 | 0,74% | 0,07% | [19 46 25 7 2 1]% | | 32. GuessBot | 0,00719 | 0,05% | 1,34% | [65 17 4 6 5 3]% | | 33. BoundedRandomBot | 0,00622 | 0,60% | 0,05% | [42 39 12 5 2 0]% | | 34. SpreaderBot | 0,00549 | 0,54% | 0,02% | [32 43 19 4 1 0]% | | 35. DeterminBot | 0,00529 | 0,45% | 0,16% | [22 41 20 11 4 2]% | | 36. PercentBot | 0,00377 | 0,38% | 0,00% | [85 8 4 2 1 0]% | | 37. HalvsiestBot | 0,00337 | 0,29% | 0,08% | [32 43 15 6 2 1]% | | 38. GetAlongBot | 0,00330 | 0,33% | 0,01% | [76 18 4 1 0 0]% | | 39. BandaidBot | 0,00297 | 0,29% | 0,02% | [76 9 10 4 1 0]% | | 40. TENaciousBot | 0,00287 | 0,29% | 0,00% | [94 4 1 0 0 0]% | | 41. SurvivalistBot | 0,00275 | 0,25% | 0,04% | [92 6 1 0 0 0]% | | 42. RandomBot | 0,00170 | 0,13% | 0,07% | [42 36 14 5 2 1]% | | 43. AggressiveBoundedRandomBotV2 | 0,00165 | 0,14% | 0,06% | [8 46 34 9 2 1]% | | 44. BloodBot | 0,00155 | 0,01% | 0,30% | [65 28 5 1 1 0]% | | 45. OutBidBot | 0,00155 | 0,03% | 0,25% | [65 6 21 6 1 1]% | | 46. BoxBot | 0,00148 | 0,10% | 0,09% | [10 51 33 5 1 1]% | | 47. LastBot | 0,00116 | 0,08% | 0,07% | [74 6 16 2 1 0]% | | 48. UpYoursBot | 0,00088 | 0,07% | 0,03% | [37 40 17 5 1 0]% | | 49. AverageBot | 0,00073 | 0,06% | 0,03% | [74 3 10 10 2 0]% | | 50. PatheticBot | 0,00016 | 0,01% | 0,02% | [94 0 5 1 0 0]% | | 51. OverfittedBot | 0,00014 | 0,01% | 0,00% | [58 40 2 0 0 0]% | | 52. RobbieBot | 0,00009 | 0,01% | 0,00% | [32 41 24 2 0 0]% | | 53. WorstCaseBot | 0,00002 | 0,00% | 0,00% | [4 71 23 2 0 0]% | | 54. SmartBot | 0,00002 | 0,00% | 0,00% | [44 51 5 0 0 0]% | | 55. AAAAUpYoursBot | 0,00000 | 0,00% | 0,00% | [40 58 2 0 0 0]% | | 56. KickbanBot | 0,00000 | 0,00% | 0,00% | [67 32 1 0 0 0]% | | 57. OneShotBot | 0,00000 | 0,00% | 0,00% | [2 95 3 0 0 0]% | | 58. KickBot | 0,00000 | 0,00% | 0,00% | [100 0 0 0 0 0]% | | 59. KamikazeBot | 0,00000 | 0,00% | 0,00% | [100 0 0 0 0 0]% | | 60. MeanKickBot | 0,00000 | 0,00% | 0,00% | [100 0 0 0 0 0]% | + ---------------------------------- + --------- + ---- ----- + --------- + ---------------------------- +
Obrigado a todos que participaram e parabéns a @Sarcoma pela vitória!
Regras:
Todo mundo começa com 100 hp. A cada rodada, dois jogadores são escolhidos aleatoriamente dentre os competidores que ainda não competiram nessa rodada. Ambos os jogadores escolhem um número entre 0 e seu hp atual e revelam esses números ao mesmo tempo. O jogador que escolheu o número mais baixo morre imediatamente. O outro jogador subtrai o número escolhido do hp restante e passa para a próxima rodada.
O torneio funciona assim:
Entre os concorrentes, 2 são escolhidos aleatoriamente. Eles se enfrentam e um ou os dois morrem. Um jogador morre se:
- Eles escolhem um número menor que o do oponente
- O hp deles cai para ou abaixo de zero
- Eles empatam três vezes seguidas com seu oponente
No caso de empate, ambos os jogadores simplesmente geram novos números, até 3 vezes. Após o confronto, o sobrevivente (se houver) é movido para a piscina para a próxima rodada, e o processo se repete até esgotarmos a piscina da rodada atual. Se houver um número ímpar na piscina, o número ímpar passa para a próxima rodada de graça.
Sua tarefa é escrever uma função no python2.7 que tenha como entrada a sua corrente hp
, uma lista da oferta do seu oponente history
e um número inteiro ties
que informa quantas vezes você já empatou com o seu oponente atual e um número inteiro que informa como muitos bots ainda estão alive
(incluindo você) e um número inteiro que lista o número de bots no start
torneio. Observe que o histórico não inclui laços. A função deve retornar um número inteiro entre 0 e seu hp total atual. Alguns exemplos simples, que ignoram os vínculos, são mostrados abaixo:
def last(hp, history, ties, alive, start):
''' Bet a third of your hp at first, then bet your opponent's last bid, if possible '''
if history:
return np.minimum(hp-1, history[-1])
else:
return hp/3
def average(hp, history, ties, alive, start):
''' Bet the average opponent's bid so far, on the assumption that bids will tend downward '''
if history:
num = np.minimum(hp-1, int(np.average(history))+1)
else:
num = hp/2
return num
def random(hp, history, ties, alive, start):
''' DO YOU WANT TO LIVE FOREVER?! '''
return 1 + np.random.randint(0, hp)
Se sua função retornar um número maior que seu hp, ela será redefinida para 0. Sim, é possível se matar. Sua função não deve tentar acessar ou modificar qualquer membro de qualquer objeto da classe RouletteBot. Você não tem permissão para executar nenhuma ação que identifique inequivocamente seu oponente, independentemente de futuros bots adicionais. A inspeção da pilha é permitida desde que seja teoricamente possível que mais de um oponente distinto possa ter produzido as informações que você extrai dela, mesmo que apenas um bot exista atualmente. ou seja, você não pode simplesmente ler a pilha para ver qual função inimiga foi chamada.
Sob essas regras, é possível que não haja vencedor, e os dois últimos competidores se matam. Nesse caso, os dois finalistas ganham meio ponto cada.
Esta é minha primeira tentativa de quebra-cabeça de programação, então críticas são bem-vindas!
O controlador pode ser encontrado aqui .