Regras básicas (diferentes das minhas)
História
É o ano de 4579, os humanos agora têm 2 mãos com 1001 dedos cada. Pauzinhos tornou-se baseado em pontos. E @Dennis tem mais representantes que @Martin ... Os círculos vermelhos desenhados à mão agora estão com o voto negativo ... Jon Skeet atingiu 2 trilhões de repetições em todos os sites do SE ... Sim, assustador, eu sei
Chopsticks é um jogo de mãos que foi resolvido. Então, para contornar isso, eu o criei mutado. Aumentei a quantidade de dedos.
Regras do jogo
A maneira como isso é tocado
Todo mundo começa com 2 mãos. Cada mão tem 1001 dedos. Cada mão começa com 1 (um) dedo para cima em cada mão. Durante o seu turno, você pode "acertar" a mão de outros jogadores. Para acertar, escolha 1 de suas mãos para acertar e 1 de suas mãos para acertar. A mão que foi atingida agora tem a quantidade de dedos que eram deles no início E a quantidade de dedos que você tinha na mão com a qual bateu.
EX
P1: 1,1
P2: 1,1
. P1[0]
hits P2[1]
. Agora os dedos estão P1:1,1
P2:1,2
. Agora P2[1]
bate p1[0]
. Os dedos estão agora P1: 3,1
P2 1,2
.
Se uma mão chegar a 1001 dedos para cima ou mais, então ela estará estendida. O jogador que recebeu uma mão (por sua vez) pode "dividir". A divisão é quando você pega a mão que está dentro e reduz pela metade a quantidade de dedos (arredondados para cima) e dá esses dedos para a outra mão, devolvendo-a.
EX
P1: 1000,2
P2 7,7
. P2[0]
hits P1[0]
. A pontuação é P1: 0,2
P2 1,1
. P1[1]
divide por sua vez e a pontuação é P1: 1,1
e P2 7,7
.
O jogo termina quando um jogador tem as duas mãos estendidas. Os pontos são pontuados pela quantidade de dedos que o vencedor possui. Mais pontos = melhor. O perdedor não ganha pontos.
Existem outras regras que são usadas, mas estas são as usadas aqui.
Todo mundo joga todo mundo (round robin)
Fim de jogo
Totalize seus pontos em cada rodada que você ganhar. Em seguida, calcule a média de todos os pontos. Divida seu total pela média de pontos e obtenha sua pontuação final. A maioria dos pontos vence.
Regras reais
Por favor, não tente resolver o jogo. Na verdade, tenho que ser capaz de executá-lo: P
Verifique se o bot pode funcionar rápido. Com a duração das rodadas julgando, isso levará um tempo
Todas as bibliotecas necessárias no seu programa devem estar na biblioteca python padrão. Também liste os que você precisa importar. As importações serão apenas a importação básica (para matemática, eu faço import math
:)
As respostas devem funcionar no Python 3.x
Handler
Seu bot será seu próprio arquivo Python 3 com uma play
função.
play
serão passadas duas listas de dois números cada. Este número indica quantos dedos há em cada mão. A primeira lista é sua própria mão.
Se você escolher bater na mão do outro jogador, retorne uma lista de dois bits. O primeiro bit é o índice da mão que você está usando para acertar ( 0
pela primeira, 1
pela última), e o segundo bit é o índice da mão que você está acertando no oponente.
Se você optar por dividir, retorne qualquer outro valor verdadeiro.
Tada!
O controlador pode ser encontrado aqui . Salve cada bot em seu próprio arquivo e liste o nome do arquivo de cada bot (sem .py
) em botnames
.
Nota final:
Você e o outro bot revezam-se primeiro. Se o jogo não terminar em 100.000 (cem mil) rodadas, o jogo será encerrado e nenhum bot vence.
O controlador não está protegido contra movimentos que levam uma eternidade, mas a sobrecarga desnecessária será fortemente desaprovada.
fonte
My handler is very simple, your bot must do it's logic then adjust the the finger scores as needed, remember!
Então, nós somos os únicos a fazer os cálculos para o KoTH?Respostas:
CodingAndAlgorithms
Esta resposta realmente usa codificação e algoritmos, ao contrário dos outros até agora! reference: imgur (também supera todas as respostas postadas antes disso)
fonte
Cuidado
O WarningBot não quer causar muitos problemas, por isso atinge a menor das mãos do oponente com sua mão menor, se tiver as duas mãos, e se divide. No entanto, o CautionBot não é tolo, por isso, se ele puder retirar a mão de um oponente sem perder imediatamente o próximo turno, o fará em vez de seu movimento normal.
fonte
Equalizador
Se estiver faltando uma mão no Equalizador, ela será dividida. Caso contrário, ele acerta a menor mão do oponente com a sua maior mão.
fonte
Agressor
Outro bot inicial, o Agrgressor atingirá a maior das mãos do oponente com a maior das suas próprias mãos, se as duas estiverem vazias; caso contrário, ele se divide.
fonte
RandomBot
Apenas para começar, aqui está um bot que faz um acerto aleatório se as mãos não estiverem vazias; caso contrário, se divide.
Jogou golfe porque não: 3
fonte
Erro
Sim, esse é o nome do bot.
Cheguei a isso testando com os outros bots. No entanto, é consistentemente o penúltimo nas minhas simulações. Então, eu vou estar fazendo outro bot eventualmente.
Edit: Não consigo escrever nenhum bot que supere o CautionBot, e meus testes extras parecem indicar que este é o segundo melhor, não o segundo pior.
fonte
Maratonista
Ajustei o código do Aggressor fornecido pelo "HyperNeutrino" para simplesmente acertar o menor dos dois oponentes com a menor das mãos. É uma estratégia muito boba, é claro, mas não posso deixar de estar no topo de um gráfico! (Mesmo que esse gráfico seja uma perda)
Não tenho certeza se esse código será executado sem erros porque não foi possível testá-lo por estar no trabalho. No entanto, ele deve funcionar perfeitamente.
fonte