É Natal em julho, então, que melhor maneira de comemorar do que uma troca virtual de presentes de elefante branco!
Para este desafio de King of the Hill, você deve criar um bot que seja reproduzido em uma simulação de troca de elefantes brancos , tentando obter o presente mais valorizado possível.
Regras do jogo
- O jogo será disputado em várias rodadas, cada uma composta por um número variável de turnos.
- Configuração da Rodada : Haverá tantos presentes quanto jogadores no jogo, cada um avaliado aleatoriamente de maneira uniforme no intervalo [0 ... 1), sendo esse valor desconhecido até que o presente seja "aberto". Os jogadores serão colocados em uma ordem aleatória em uma fila. O primeiro jogador será exibido na frente da fila.
- Quando é a vez de um jogador, ele pode abrir um presente ou roubar o presente de outro jogador, passando a vez para o jogador cujo presente foi roubado.
- Cada presente pode ser roubado até 3 vezes.
- Você não pode roubar do jogador que acabou de roubar de você.
- Cada jogador pode ter apenas um presente de cada vez.
- Depois que um presente é aberto, o jogo avança para o próximo jogador exibido na frente da fila. Este será o próximo jogador na ordem do turno que ainda não teve um turno.
- Final da Rodada : Quando todos os presentes tiverem sido abertos, a rodada terminará e o valor do presente realizado por cada jogador será adicionado à pontuação desse jogador. Uma nova rodada começa, com cada jogador agora sem presente e a ordem do jogador embaralhada.
- Fim do Jogo : O jogo terminará quando pelo menos um jogador tiver marcado
100500 pontos, com a vitória sendo concedida ao jogador com o maior valor total de presentes.
Codificação
Todos os envios devem ser compatíveis com o Python 3.7. Você deve escrever uma classe que herda diretamente de WhiteElephantBot
. Por exemplo:
class FooBot(WhiteElephantBot):
# Your implementation here
Você pode fornecer um __init__
método (que usa um argumento name
) em sua classe de bot, que deve ser chamado super().__init__(name)
. Sua classe deve ter um take_turn
método esperando os seguintes argumentos nesta ordem:
players
: A lista de nomes de jogadores, por ordem de turno, de todos os jogadores que ainda não têm presentes.presents
: Um dicionário que mapeia nomes de jogadores para duas tuplas, contendo o valor presente mantido por esse jogador e o número de vezes que o presente foi roubado. Isso incluirá apenas outros jogadores que estão atualmente com presentes.just_stole
: Se a última ação tomada foi um roubo, este será o nome do jogador que acabou de roubar. Caso contrário, seráNone
.
Cada argumento será imutável ou um novo objeto, de modo que a mutação de qualquer um deles não terá efeito no jogo. Você pode manter uma cópia de qualquer um dos argumentos, se desejar.
Um valor de exemplo para presents
:
{
'Alice': (0.35, 0),
'Bob': (0.81, 2),
'Charlie': (0.57, 1)
}
Seu take_turn
método deve retornar o nome do jogador que você deseja roubar ou None
abrir um presente. Se isso gerar uma exceção, retornar algo diferente de um str
ou None
, ou o nome de um jogador do qual você não pode roubar, você abrirá um presente por padrão.
Seu construtor será chamado no início de cada rodada, para que você não se lembre do estado de rodada a rodada.
Ao herdar de WhiteElephantBot
, você terá acesso a um steal_targets
método que aceitará o ditado dos presentes just_stole
e retornará uma lista de nomes de jogadores dos quais você pode roubar.
Quaisquer módulos necessários para o seu script devem ser importados na parte superior da sua entrada.
Test Driver
O driver de teste pode ser encontrado aqui . Você não precisa incluir from white_elephant import WhiteElephantBot
na sua resposta postada, no entanto, um módulo local precisará fazer isso.
Concorrentes da linha de base
- Aleatório : escolhe aleatoriamente se deseja abrir um novo presente ou roubar, com o alvo roubado escolhido uniformemente aleatoriamente.
- Ganancioso : roube o presente mais valioso que pode ser roubado. Se nenhum presente puder ser roubado, abra um presente.
- Bom : sempre abre um novo presente. Nunca rouba.
Regras adicionais
- É sua responsabilidade capturar todas as exceções. Se sua classe falhar em capturar uma exceção, ela será desqualificada. Além disso, não pegue o KeyboardInterrupts.
- Não use arquivos ou outros métodos para ignorar a incapacidade de salvar o estado entre os jogos. Você não pode, por exemplo, salvar um estado de rede neural em um arquivo durante a execução.
- Seu bot deve estar independente do código da classe e das constantes relacionadas.
- Você só pode usar importações de bibliotecas padrão.
- Não há nenhum requisito estrito de desempenho. Seja razoável e prudente. Se o desempenho se tornar um problema, reservo-me o direito de adicionar limites de tempo.
Uma entrada por pessoa.Se você enviar mais de uma entrada, seus bots podem não funcionar juntos. Por enquanto, vou permitir várias entradas por pessoa, embora possa rebanho mais tarde se isso se tornar um problema.- Esta é uma competição aberta, sem data final distinta. Será executada novamente a qualquer momento quando houver alterações significativas.
EDIT1: alteração na pontuação vencedora de 100 para 500, para que as classificações sejam mais consistentes. O driver de teste possui uma nova correção de bug e também reflete as alterações na pontuação da vitória.
EDIT2: Nota esclarecedora sobre as importações necessárias.
Classificação (em 8 de agosto de 2018)
- SampleBot (500.093)
- LastMinuteBot (486.163)
- RobinHood (463.160)
- OddTodd (448.825)
- GreedyBot (438.520)
- SecondPlaceBot (430.598)
- ThresholdBot (390.480)
- Jogador (313,362)
- NiceBot (275.536)
- RandomBot (256.172)
- Bom samaritano (136.298)
fonte
Respostas:
LastMinuteBot
(Com muito obrigado a @Mnemonic pelo esqueleto do código, já que eu mal conheço Python.)
Aproveite o fato de que os presentes não podem ser roubados mais do que três vezes; faça o terceiro roubando a si mesmo se você encontrar um presente de alto valor e a maioria dos presentes tiver sido aberta.
fonte
Odd Todd
Rouba o melhor presente que ele pode, mas não quer ser a segunda pessoa a roubar um presente, porque se for roubado dele, ele não poderá recuperá-lo.
fonte
==
vez de um=
na compreensão da sua lista.SecondPlaceBot
Todo mundo vai estar lutando pelo presente mais valioso. O próximo melhor presente é quase tão bom, mas muito menos provável de ser roubado.
fonte
ThresholdBot
Realmente não nos preocupamos em receber o melhor presente, apenas algo bom o suficiente . Enquanto houver algo que valha a pena roubar, faremos isso.
fonte
SampleBot
Executa 2000 simulações com cada jogador agindo com avidez e escolhe a melhor ação.
fonte
RobinHood
Roubar dos ricos que não ganharam seu presente
fonte
Bom Samaritano
Dê às pessoas azaradas outra chance de boa sorte
fonte
Jogador
O jogador é viciado, ele tenta ser o último jogador e depois joga um novo presente para vencer todos os outros jogadores.
fonte
Top3Bot
Este bot não tenta obter o melhor presente possível, mas tenta obter um presente com o valor> = (n-3) / n, em que n é o número de presentes. Na maioria dos casos, haverá presentes com tanto valor, e o Top3Bot tentará colocar uma mão em um deles, mas ele realmente não se importa com quem recebe.
fonte
__init__
está faltando seuself
argumento