Pauzinhos mutados com pontos KoTH

13

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,1P2 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,2P2 7,7. P2[0]hits P1[0]. A pontuação é P1: 0,2P2 1,1. P1[1]divide por sua vez e a pontuação é P1: 1,1e 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

Lacunas padrão

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 playfunção.

playserã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 ( 0pela primeira, 1pela ú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.

Christopher
fonte
Sandbox
Christopher
As "regras KOTH padrão" poderiam ser um link? E talvez "brechas padrão" também.
21817 Trichoplax
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?
21717 HyperNeutrino
@HyperNeutrino opps fixa.
19417 Christopher
4
Dennis tem mais representantes que Martin agora . Oh meu Deus, de onde esses 996 dedos extras vieram ?!
caird coinheringaahing

Respostas:

6

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)

def play(A, B):
    if sum(A) == 1:
        return [A.index(1), B.index(max(B))]
    elif max(A) + max(B) > 1000:
        return [A.index(max(A)), B.index(max(B))]
    elif 0 in A:
        return 1
    elif 0 in B:
        return [A.index(min(A)), 1-B.index(0)]
    else:
        return [A.index(min(A)), B.index(min(B))]
betseg
fonte
Eu peguei essa referência XD
Christopher
Isso acabou de ganhar. Isso nunca perdeu.
29417 Christopher
Parabéns! Acho que vou ter que me contentar com o segundo lugar. Seus algoritmos de codificação e eram mais fortes do que a minha
Valor Ink
3

Cuidado

def play(s,o):
 if max(s)+max(o)>1000 and (all(s) or max(s)+min(o)<1001):
  return [s.index(max(s)),o.index(max(o))]
 else:
  return [s.index(min(s)),o.index(min(filter(bool,o)))]if all(s) else 'split'

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.

Value Ink
fonte
Extra-oficialmente este está ganhando
Christopher
Legal! Vamos ver como as coisas vão daqui, porque não ficarei surpreso quando alguém desenvolver uma estratégia melhor. Acabei de aplicar o que entendi ser a estratégia de baunilha Chopstick (seja um covarde e se divida com frequência para evitar ser morto) de uma maneira que melhor acomode as novas regras (seja um covarde e tenha um golpe baixo para evitar ser morto, desde que se divida / mescla enquanto você tem as duas mãos é ilegal) lol #
Ink Ink
3

Equalizador

def play(s, o):
    if not all(s):
        return 1
    else:
        return [s.index(max(s)), o.index(min(filter(bool, o)))]

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.

LyricLy
fonte
De acordo com essas regras, AFAIK só pode ser dividido se uma mão estiver fora.
Value Ink
Ah sim, eu vou consertar isso.
LyricLy
"Se o equalizador não tem mãos ..." bem, quero dizer, se não tem mãos, então já perdeu? Mas isso é apenas picuinhas, pegue minha +1 para compensar
Valor de tinta
3

Agressor

def play(s, o):
    return [s.index(max(s)),o.index(max(o))]if all(s)else 1

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.

HyperNeutrino
fonte
2

RandomBot

import random

def play(s, o):
    return [random.randint(0,1)for i in'  ']if all(s)else 1

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

HyperNeutrino
fonte
Eu estava consertando isso
Christopher
@ Christopher Desculpe, não vi seu comentário. --- Uma vez que você corrigi-lo eu vou apagar esse .--- Eu só vou apagar isso porque é estúpido xD
HyperNeutrino
@ Christopher Nota: Eu editei isso em uma apresentação válida. Vou adicionar outra solução também; diga-me se o controlador não funciona corretamente :)
HyperNeutrino
Nice, tentar-los
Christopher
@Christopher O controlador funciona corretamente?
HyperNeutrino
2

Erro

Sim, esse é o nome do bot.

def play(s, o):
    if max(s)+max(o)>1000:
        return [s.index(max(s)),o.index(max(o))]
    if 0 in s:return ''
    return [s.index(max(s)),o.index(min(o))]

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.

Magenta
fonte
1

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.

def play(s, o):
     return [s.index(min(s)),o.index(min(o))]if all(s)else 1
Jordânia
fonte
Boa primeira resposta! Você escolheu uma grande questão: P (sem viés)
Christopher
Obrigado :) Eu estava muito nervoso porque não tinha certeza se seria permitido ou não ajustar o código de outra pessoa como eu. Suponho que seja contanto que você torne óbvio. E eu tentaria fazer uma que jogasse a maior mão contra a maior dos oponentes, mas o HyperNeutrino me venceu exatamente nessa! haha
Jordânia
Sim. Nesse código de ajuste do SE, é frequentemente usado: P
Christopher
Resposta legal! Uma coisa com a qual eu me preocupo (não posso testá-lo agora) é que não sei como o controlador responderá se você tentar acertar uma mão vazia, ou como isso afeta as regras.
Value Ink
1
Isso é muito parecido com o Equalizador, mas o Equalizador verifica se não bate na mão vazia do oponente, se presente. @LyricLy
HyperNeutrino