Piloto de teste • Discussão do desafio • Enviar aventureiro
( Fonte da imagem )
Vários aventureiros rivais estão invadindo as ruínas em busca de tesouros, mas eles só podem carregar muito de cada vez e têm seus limites de resistência. Eles querem obter o tesouro mais valioso e sair antes que fiquem cansados demais para continuar. Eles estão tentando ficar o mais ricos possível com suas travessuras de saques.
Jogabilidade
Cada aventureiro começa na primeira sala da masmorra com 1000 pontos de resistência e 50 kg de espaço na mochila.
O jogo funciona em turnos, com todos os jogadores resolvendo seus turnos simultaneamente. A cada turno, você pode executar uma das seguintes ações:
- Mover para a próxima sala.
- Mover para a sala anterior.
- Ofereça resistência para pegar um tesouro.
- Largue um tesouro.
Mover-se entre os quartos exige 10 pontos de resistência, mais 1 por cada 5 kg atualmente em sua mochila, arredondados. Por exemplo, um aventureiro carregando 3kg de tesouro requer 11 resistência para se mover e um carregando 47kg requer 20 resistência para se mover.
Soltar um tesouro requer 1 ponto de resistência, independentemente do tesouro descartado.
Ao sair das ruínas, o jogador não realiza mais turnos.
Se um jogador não puder realizar nenhuma dessas ações (devido à falta de resistência ou ausência de tesouros), seu aventureiro morre de exaustão, despejando seu tesouro na sala atualmente ocupada. Da mesma forma, se um jogador tentar fazer uma ação inválida, seu aventureiro será morto por uma armadilha, resultando no mesmo derramamento de tesouro.
Licitação
A oferta mínima para um tesouro é de 1 resistência por 1 kg que o tesouro pesa. Você também pode oferecer pontos de resistência adicionais para ter mais chances de obter o tesouro. O vigor que foi oferecido é consumido, independentemente do resultado.
No caso de vários jogadores oferecerem o mesmo tesouro, o jogador que fizer o lance mais alto receberá o tesouro. Se mais de um jogador fez a oferta mais alta, nenhum deles receberá o tesouro.
Condição da vitória
O jogador com o maior valor total de tesouros é o vencedor. No improvável evento de empate, os empates têm o menor peso total, o menor número de tesouros e o valor do tesouro mais valioso, o segundo mais valioso, o terceiro ... até que o empate seja quebrado. No evento quase impossível de que ainda haja um empate nesse momento, o piloto de teste diz "estrague tudo" e o vencedor é, assim, determinado arbitrariamente.
No contexto do torneio, os jogadores serão classificados com o primeiro lugar recebendo 10 pontos, o segundo lugar com 9 pontos, o terceiro lugar com 8 pontos, etc ..., com jogadores mortos e aventureiros sem tesouros marcando 0 pontos.
Sobre as ruínas
- Cada quarto contém inicialmente entre e tesouros. (Onde é o número do quarto)
- Existem arbitrariamente muitos quartos, limitados apenas pela resistência e vontade de explorar dos aventureiros.
- Cada tesouro terá um valor monetário (em dólares inteiros) e um peso (em kg inteiros).
- Os tesouros tendem a ser mais valiosos e abundantes à medida que você se aprofunda nas ruínas.
- As fórmulas específicas para gerar tesouros são as seguintes: (usando a notação para de dados)
- O peso é gerado primeiro usando a fórmula (mínimo de 1)
- O valor do tesouro é gerado através de (onde é o número do quarto é o peso)
Informações visíveis para jogadores
A cada turno, os jogadores recebem as seguintes informações:
- O número da sala em que estão atualmente. Isso é indexado em 1; portanto, conceitualmente, a saída está na "sala 0"
- Uma lista de tesouros atualmente na sala
- Uma lista de outros jogadores que também estão atualmente na sala.
- Seu inventário atual de tesouros
- Seu nível atual de resistência
Codificação
O driver de teste pode ser encontrado aqui .
Você deve implementar uma subclasse desta Adventurer
classe:
class Adventurer:
def __init__(self, name, random):
self.name = name
self.random = random
def get_action(self, state):
raise NotImplementedError()
def enter_ruins(self):
pass
Você só precisa substituir o get_action
método. enter_ruins
é executado antes do início do jogo e é sua chance de preparar o que você deseja que esteja pronto para o jogo. Você não precisa substituir __init__
, e realmente não deveria . Se __init__
falhar, você será desqualificado.
get_action
recebe um único argumento que é a namedtuple
com os seguintes campos (nessa ordem, se você preferir desestruturar):
room
: o número da sala em que você está atualmentetreasures
: a lista de tesouros na salaplayers
: a lista de outros jogadores na sala. Você só recebe o nome do jogador dessa maneira, então você não sabe qual bot está controlando eles ou seu inventário / resistência.inventory
: a lista de tesouros na sua mochilastamina
: seu nível atual de resistência
Este objeto também fornece duas propriedades de utilitário:
carry_weight
: o peso total de todos os tesouros que você está carregandototal_value
: o valor total de todos os tesouros que você está carregando
As listas treasures
e inventory
contêm namedtuple
s com estes atributos:
name
: o nome do tesouro (para fins cosméticos)value
: o valor monetário do tesouro em $.weight
: peso do tesouro em kg
get_action
deve retornar um dos seguintes valores / padrões:
'next'
ou'previous'
para ir para as salas seguintes / anteriores'take', <treasure index>, <bid>
(sim, como uma tupla, embora qualquer sequência também funcione tecnicamente) para licitar no tesouro no índice especificado na lista de tesouros da sala. Ambos os argumentos devem ser inteiros. Os carros alegóricos serão arredondados para baixo.'drop', <inventory index>
para largar o tesouro carregado encontrado no índice fornecido. O índice deve (naturalmente) ser um número inteiro.
Outras Restrições
- Você só pode usar a instância aleatória fornecida a você durante a inicialização para pseudo-aleatoriedade.
- Qualquer outra coisa que possa introduzir não determinismo comportamental não é permitida. A intenção aqui é fazer com que os bots se comportem de forma idêntica quando recebem a mesma semente para ajudar no teste de novos bots (e potencialmente bugs no driver de teste). Somente a radiação cósmica deve causar algum desvio / não-determinismo.
- Lembre-se de que os códigos de hash são randomizados no Python 3, portanto, o uso
hash
para qualquer tomada de decisão não é permitido.dict
s são bons mesmo quando se usa ordem de iteração para decisões, pois a ordem é garantida de forma consistente desde o Python 3.6.
- Você não pode contornar o driver de teste usando
ctypes
hacks ouinspect
empilhar vodu (ou qualquer outro método). Existem algumas coisas impressionantemente assustadoras que você pode fazer com esses módulos. Por favor não.- Cada bot tem uma caixa de areia razoavelmente bem através de cópias defensivas e da imutabilidade natural de
namedtuple
s, mas existem algumas brechas / explorações inatacáveis. - Outra funcionalidade
inspect
ectypes
pode ser usada desde que nenhuma seja usada para contornar a funcionalidade do controlador. - Qualquer método de captura de instâncias dos outros bots no seu jogo atual não é permitido.
- Cada bot tem uma caixa de areia razoavelmente bem através de cópias defensivas e da imutabilidade natural de
- Os bots devem operar sozinhos e não podem se coordenar com outros bots de forma alguma para qualquer finalidade. Isso inclui a criação de dois bots com objetivos diferentes, de modo que um se sacrifique pelo sucesso do outro. Quando houver mais de 10 competidores, você não terá a garantia de ter os dois bots no mesmo jogo e os nomes dos aventureiros não darão nenhuma indicação da classe de bot, portanto esses tipos de estratégias são limitadas de qualquer maneira.
- No momento, não há nenhuma restrição rígida no tempo de execução, no entanto, eu me reservo o direito de restringi-lo no futuro se os torneios começarem a demorar muito. Seja razoável e tente manter o processamento de turnos abaixo de 100ms , pois não prevejo a necessidade de restringi-lo abaixo desse limite. (Os torneios ocorrerão em cerca de 2 horas se todos os bots demorarem cerca de 100 ms por turno.)
- Sua classe de bot deve ser nomeada exclusivamente entre todos os envios.
- Você pode não se lembrar de nada entre os jogos. (No entanto, você pode se lembrar de coisas entre turnos )
- Não edite sys.modules. Qualquer coisa fora das variáveis de instância deve ser tratada como uma constante.
- Você não pode modificar o código de nenhum bot programaticamente, incluindo o seu.
- Isso inclui excluir e restaurar seu código. Isso é para tornar a depuração e os torneios mais dinâmicos.
- Qualquer código que cause falha no controlador será imediatamente desqualificado. Embora a maioria das exceções seja detectada, algumas podem passar despercebidas e as segfaults são inalcançáveis. (Sim, você pode segfault em Python graças a
ctypes
)
Submissões
Para ajudar na raspagem da resposta, indique o nome do seu bot na parte superior da resposta com ae #Header1
garanta que sua resposta inclua pelo menos um bloco de código (somente o primeiro em sua resposta será usado). Você não precisa incluir nenhuma importação ou documentação, pois elas serão adicionadas automaticamente pelo raspador.
Estarei mais inclinado a votar novamente com explicações detalhadas e compreensíveis. É provável que outros se comportem da mesma maneira.
Grosso modo, sua resposta deve ser formatada da seguinte forma:
# Name of Bot
Optional blurb
#imports go here
class BotName(Adventurer):
#implementation
Explanation of bot algorithm, credits, etc...
(processado como)
Nome do Bot
Destaque opcional
#imports go here class BotName(Adventurer): #implementation
Explicação do algoritmo de bot, créditos, etc ...
Executando o driver de teste localmente
Você precisará do Python 3.7+ e eu recomendo que você instale também tabulate
via pip. Raspar esta página para envios requer adicionalmente lxml
e requests
. Você também deve usar um terminal com suporte para escapes de cores ANSI para obter melhores resultados. Informações sobre como configurar isso no Windows 10 podem ser encontradas aqui .
Adicione seu bot a um arquivo em um subdiretório no mesmo diretório que ruins.py
( ruins_bots
por padrão) e não se esqueça de adicionar from __main__ import Adventurer
à parte superior do módulo. Isso é adicionado aos módulos quando o raspador baixa o seu envio e, embora seja definitivamente hacky, esta é a maneira mais direta de garantir que seu bot tenha acesso adequado Adventurer
.
Todos os bots nesse diretório serão carregados dinamicamente no tempo de execução, portanto, nenhuma alteração adicional será necessária.
Torneio
O vencedor final será determinado em uma série de jogos com até 10 bots em cada jogo. Se houver mais de 10 envios no total, os 10 melhores bots serão determinados dividindo-os sistematicamente em grupos de 10 até que cada bot jogue (exatamente) 20 jogos. Os 10 melhores bots serão selecionados deste grupo com redefinições de pontuação e jogarão até que o bot do primeiro lugar tenha alcançado uma vantagem de 50 pontos sobre o bot do segundo lugar ou até que 500 jogos tenham sido jogados.
Até que haja pelo menos 10 inscrições, vagas vazias serão preenchidas com "Bêbados", que vagam aleatoriamente pelas ruínas e pegam (e ocasionalmente jogam) tesouros aleatórios até que fiquem sem energia e precisem seguir para a saída.
Os torneios serão repetidos semanalmente se houver novos envios. Este é um desafio KOTH aberto, sem data final definida.
Entre os melhores
A partir de quarta-feira, 4 de maio de 2019 às 16h25 MDT: (2019-05-04 4:25 -6: 00)
Seed: K48XMESC
Bot Class | Score | Mean Score
--------------+---------+--------------
BountyHunter | 898 | 7.301
Scoundrel | 847 | 6.886
Accountant | 773 | 6.285
Ponderer | 730 | 5.935
Artyventurer | 707 | 5.748
PlanAhead | 698 | 5.675
Sprinter | 683 | 5.553
Accomodator | 661 | 5.374
Memorizer | 459 | 3.732
Backwards | 296 | 2.407
Atualização - 15 de abril: algumas atualizações / esclarecimentos de regras
Atualização - 17 de abril: banindo alguns casos notáveis de ações nefastas, como modificar o código de outros bots.
Atualização - 4 de maio: Recompensa concedida a Sleafar por destruir absolutamente para trás. Parabéns!
fonte
pip
instalado e ativadoPATH
(o que é padrão para instalações mais recentes do AFAIK), a partir do Windows, você pode executarpip install modulename
no prompt de comando. Para outras circunstâncias (das quais não conheço), vá para o pip , procure o módulo necessário e escolha uma opção.Respostas:
Contador
O contador é uma pessoa muito avessa a riscos. Ele gosta de ter certeza de que o que faz realmente é a melhor opção na situação em questão. Então, ele define uma meta e só pega tesouros se seus cálculos mostrarem que isso o coloca no caminho certo em direção a essa meta. No entanto, ele é muito burocrático e não gosta de largar itens que já havia decidido que queria; quaisquer tentativas de ensiná-lo a fazê-lo resultaram até o momento em que o contador descartou um item e o retirou imediatamente imediatamente depois.
Possivelmente para ser continuado.
fonte
Alojamento
Baseado livremente no meu outro bot LightWeight. Onde o bot LightWeight era simples, esse bot é muito mais complexo para acomodar interações com outros bots: benignos e deliberadamente perturbadores.
Este bot primeiro dispara para uma sala designada aleatoriamente e, em seguida, tenta oferecer o melhor tesouro com relação valor / peso, se houver outros jogadores na sala, assume que eles também oferecerão o lance para o segundo melhor tesouro. Se esse lance falhar, no próximo turno lance para o próximo melhor tesouro.
Depois que uma oferta for bem-sucedida, repita a licitação para o melhor / segundo melhor até que não exista mais tesouros na sala e, em seguida, vá mais fundo na ruína
Para cada sala, entre na ruína e repita o lance para o melhor / segundo melhor até que não exista mais tesouros na sala, depois vá para a ruína ou se detectarmos que não podemos ir mais fundo, troque para o estado 'Exiting' e comece a diminuir o pior tesouro até que possamos garantir que podemos sair vivos da ruína.
Quando sairmos, verificaremos se podemos adicionar um tesouro de 1kg e ainda assim sair vivo, se for o caso, tentaremos oferecer um tesouro de 1kg, caso contrário, seguiremos para a sala anterior.
Seu desempenho é bastante variável ... no entanto, normalmente será um dos três principais bots.
fonte
Sprinter
Semelhante ao Diver, Sprinter se aprofunda e pega os melhores itens no caminho de volta.
O Sprinter vai fundo e calcula uma pontuação para cada tesouro e pega qualquer coisa acima de um determinado limite. Esse limite depende da sala em que ele está atualmente, porque custa mais para levar itens de salas mais profundas nas ruínas.
Ainda tenho duas otimizações em relação à "luta pelo tesouro" que estão planejadas para os próximos dias.
17.04 .: Scoundrel ficou esperto demais, Sprinter decidiu empurrá-lo para uma armadilha inicialmente. Eu queria matar qualquer bot que tentasse invocar o Sprinter, mas o testdriver infelizmente não lida com as exceções que ocorrem no init. Portanto, a próxima correção para Scoundrel é bastante fácil ...
fonte
Planejar com antecedência
Utilizei os melhores / piores trechos de cálculo da resposta de Artemis Fowl , mas a lógica da escolha é inteiramente do meu próprio design e foi modificada para incluir alguns fatores adicionais, como tesouros vistos em salas anteriores (para minimizar tesouro, apenas para voltar atrás, largá-lo e pegar outra coisa).
Os empreendimentos bot tão profundos quanto achar razoavelmente seguros fazê-lo (esse cálculo funciona efetivamente para mergulhar em uma profundidade específica, mas tem a flexibilidade de lidar com outros valores iniciais de resistência), coleta artefatos (priorizando alto custo e baixo peso) e, em seguida, começa a recuar quando determina que não pode mais carregar.
Na saída, ele pegará qualquer tesouro adicional que considerar que ainda pode levar com segurança até a saída. Ele até descartará artefatos retidos se o novo for um negócio melhor e não resultar em exaustão. Se houver espaço na mochila, ele buscará o novo tesouro antes de deixar o de menor qualidade, minimizando a briga com outros bots.
fonte
__init__
função já está implementada, você não precisa substituí-la.Artyventurer
Bate os bêbados em cerca de US $ 1000! Não conseguia pensar em um nome criativo, mas aqui estão:
Às vezes, a maior parte do código aqui nunca faz nada (pelo menos quando eu testo contra Drunkards), o programa apenas (tenta) encontrar a melhor jogada, incluindo o processamento para situações nas quais tenta não se colocar. Algumas delas nunca funcionam, estão lá para que eu possa mexer nos números, que provavelmente ainda podem ser melhorados.
Explicação
if state.inventory ... worsti = None
Encontre o item "pior" no inventário, ou seja, o item que tem a menor relação valor / peso. Ele armazena
worsti
, que contém o índice, o valor e o peso, como uma tupla, ouNone
se não houver itens no inventário.if self.drop ... return 'drop', worsti[0]
Se eu disser para ele abandonar esse turno no último turno (veja abaixo), e puder, largue o item 'pior' conforme calculado acima.
extra = ... * state.room
Calcule quanta resistência teria sobra se eu dissesse para voltar agora.
if extra > CONTINUE_IN:\ return 'next'
Se for mais do que CONTINUE_IN, retorne
'next'
.if extra < 0 and worsti:\ return 'drop', worsti[0]
Se for menor que
0
, solte o pior item.if extra < state.room:\ return 'previous'
Se for menor que o número do quarto (não pode carregar mais tesouros), volte.
if state.treasures: ... bestt = None
Elabore o melhor tesouro para levar, semelhante ao pior item do inventário acima. Guarde-o
bestt
.if extra > 0 and bestt: ... return 'take', bestt[0], bid
Com os números atuais, isso é executado sempre que chegamos até aqui e há um tesouro disponível. Se é seguro levar o 'melhor' tesouro, ele o faz. Seu lance é o mínimo, ou um a mais, se houver alguém presente.
if bestt and worsti: ... return 'take', bestt[0], bid
Com números atuais, esse bloco de código nunca será executado, porque o bloco de código anterior tem uma condição mais ampla. Isso é executado se chegarmos até aqui e houver tesouros no meu inventário e na sala. Se o 'melhor' tesouro da sala é mais valioso do que o 'pior' do meu inventário, e seria seguro trocá-los nos próximos dois turnos, é o que faz.
return 'previous'
Se nada disso acontecer, basta voltar.
Atualização 16/04/19:
Medidas anti-patife. Isso se tornará uma guerra de lances :(
Atualização adicional 16/04/19:
Revertido anteriormente, alterna aleatoriamente todos os outros elementos ao encontrar o melhor, por exemplo.
[1, 2, 3, 4, 5, 6] → [2, 1, 3, 4, 6, 5]
. Deve ser mais difícil de copiar :).Atualização 17/04/19:
Revertida anteriormente, em vez disso, limpa seu próprio código-fonte . Ele faz isso
__init__
como sempre será antesScoundrel.enter_ruins
e, assim, impedirá que Scoundrel o carregue. Ele substitui seu código quandoget_action
é chamado pela primeira vez, para que esteja pronto para a próxima vez. CORRIGIDO, Scoundrel agora morre na chegada.Atualização adicional 17/04/19:
Revertida anteriormente, em vez disso, substitui sua
sys.modules
entrada pelo módulo matemático, de modo que quando Scoundrel tenta carregá-lo, ele carrega o módulo matemático. :)Além disso, eu apenas percebi que a resistência do movimento era 10 + peso / 5 , então tentei consertar isso.
Atualização adicional 17/04/19:
Agora inclui alho de ambas as atualizações anteriores.
Atualização 18/04/19:
Brincando com números e cálculos, agora recebe US $ 2000 - US $ 3000.
Atualização adicional 18/04/19:
Removido o alho para limpeza de arquivos, pois foi banido, adicionado um novo alho, que garante que
'draco'
não é responsável por sua execução, se for apenas retornarprevious
na primeira vez. Os resultados levaram um mergulho misterioso de US $ 1200 a US $ 1800, no qual estou analisando.fonte
The Scoundrel
O canalha trabalha principalmente para interferir com outros competidores. Atualmente, ele interfere com Sprinter, Artyventurer e Accountant (essa lista aumentará ao longo do tempo, desde que seja do interesse do Scoundrel). Isso é feito imitando os outros bots e, em seguida, ofertando, sub-cortando ou brigando por relíquias. Como tal, é improvável que essa entrada domine a tabela de classificação e, em vez disso, funcione como uma força estragadora. A revisão atual no momento desta publicação a coloca em 2º lugar, com uma pontuação média de cerca de 7.
Scoundrel frustra as tentativas de outro bot de se modificar para se defender contra o Scoundrel executando diretamente o código dos outros participantes como uma cópia indistinguível do clone. Os problemas com importações que resultam em participantes duplicados foram resolvidos através da criação dos clones por meio do Reflection (as guerras de edição que envolvem detalhes finos da determinação matemática não são desejáveis do ponto de vista do Stack Exchange, mas resultariam no mesmo resultado). Os desafios da KOTH também têm um histórico de permitir isso.
Scoundrel substitui os Teamsters, a fim de mantê-los por uma questão de interesse. Após essa edição, os Teamsters não devem mais ser raspados pelo controlador.
Atualização 17/04/2019: outras medidas de balcão.
Os Teamsters (declarados ilegais)
Mas fique à vontade para correr localmente, onde não há mais de 8 outros concorrentes!
Essa entrada (embora agora explicitamente inválida) é, de fato, dois bots, e o controlador alegremente raspa os dois e os adiciona à lista de participantes (porque é o Python?)
Fase 1:
1. Se não houver um tesouro com menos de 3 no chão, ele desce
2. Como ele é praticamente o último aventureiro a voltar à superfície, tudo o que ele precisa fazer é encontrar alguém.
Fase 2:
O nome dos tesouros realmente foi útil para ajudar a lógica a não carregar no lixo 25 do andar e sair mais cedo, pois não havia como se comunicar entre os dois bots (e o TeamsterA sempre se encontrava em uma sala com outra pessoa antes TeamsterB havia retornado).
A próxima conclusão lógica: Criando um exército
Em teoria, isso poderia ser usado para explorar as profundezas e adquirir tesouros tão profundos quanto a Sala 98, no entanto, como isso exigiria mais de 2 bots, a lógica que os comporta se tornaria cada vez mais complexa, e tenho certeza de que um envio ilegal por violar uma regra não escrita, por isso não vou me incomodar.
A
Espera efetivamente aos 30,B
espera aos 50 ...n
mergulha para 98, pega um tesouro, move-se para 97, larga-o (e depois morre),n-1
pega-o e move-se para 96 ...C
larga-o (morre),B
pega-o sobe e sobe para 30, larga (morre),A
pega e volta à saída.Eu estimo que isso levaria 11 bots.
No entanto, não vale a pena fazer, a menos que você possa recuperar cerca de 4 tesouros dessa profundidade para competir com entradas como PlanAhead ou Artyventure, devido à escala entre os custos de resistência a serem movidos e o valor médio dos tesouros.
Resultados da amostra
Raramente pontua abaixo de US $ 4000, ocasionalmente atinge US $ 6000.
fonte
Para trás
Porque opera em sentido inverso
Por que é chamado de trás para frente?
Porque peguei o contador e tentei fazê-lo executar sua lógica de modo a mergulhar fundo e, em seguida, pegar seu saque preferido na saída (ao contrário do contador).
No final, ele ainda coleciona muitos de seus prêmios no caminho (pegando-os antes dos tradicionais buscadores de entrada e saída, operando ao contrário para todos os outros), mas é muito mais seletivo sobre quais são os prêmios , embora ainda assim pega as coisas no caminho de volta.
O resultado final é que a resistência é conservada no caminho, enquanto ainda prioriza tesouros de alto valor, aproveitando uma reviravolta profunda e escolhas fáceis no caminho de volta. Sabe-se que, ao contrário, coletar tesouros de lugares tão baixos quanto a Sala 41 (e durante o desenvolvimento entraria e depois sairia imediatamente da Sala 42).
fonte
Caçador de Recompensa
O método simples é o melhor. Pegue tesouros valiosos e leves, indo o mais fundo possível. Pegue tesouros menos valiosos no caminho de volta.
fonte
LightWeight
Um bot simples que ainda funciona muito bem.
Depois de se aventurar nas ruínas (atualmente com 21 quartos), ele pegará o melhor tesouro na sala, que é de apenas 1 kg (daí o nome do bot) e é mais valioso do que o tesouro menos valioso do inventário. Se o inventário estiver cheio, solte o tesouro menos valioso. Se nenhuma outra ação for selecionada, mova-se para as ruínas. Se estivermos no limite de nossa resistência para poder sair vivos, siga para a saída
fonte
dumping
oenter_ruins
método Na verdade, isso será lembrado entre os jogos e não funcionará no jogo 2. Tecnicamente, não é permitido, mas eu adicionei a regra agora (esqueci-a antes, mas era minha intenção), então vou dar uma folga. : PMemorizer
Posso enviar bots para o meu próprio KotH, certo?
Este bot mergulha na sala 30 e se lembra de todos os tesouros que viu. Nesse ponto, ele começa sua jornada de volta à entrada, tentando levar bons tesouros que lembrava de ter visto em salas anteriores.
Eu esperava que fosse melhor. As possíveis melhorias podem advir de um planejamento melhor e de ser mais dinâmico sobre em qual sala ele pára de mergulhar e de estar mais disposto a explorar as opções de backup.
Atualização: agora pega tesouros de 1 kg no valor de US $ 60 ou mais a caminho.
fonte
[Turn 072] Ryu Ridley (Memorizer) collapsed in the doorway to room #1 and died of exhaustion
Ponderer
Eu acho que é bastante semelhante ao Memorizer, pois usa o conhecimento das salas visitadas para escolher quais salas e tesouros coletar no caminho de volta para a saída, no entanto, foi derivada independentemente.
Este bot corre até uma sala profunda aleatória, registrando os tesouros encontrados ao longo do caminho. Uma vez na sala de destino, ele ponderará sobre a seleção ideal de tesouros para levar de volta à saída. A cada turno, ele ponderará novamente para determinar a melhor seleção provável de tesouros a serem tomados.
Atualmente, existe um algoritmo simples (poder inverso do número da sala) que gera o número assumido de tesouros retirados (ou serão retirados quando visitados por esse bot) para cada sala e, portanto, esses tesouros são ignorados quando se pensa em quais tesouros / salas tirar de. Tenho idéias para outros algoritmos mais avançados para modelar quais tesouros permanecem. Mas vou ter que ver se o benefício vale a pena.
fonte
Hoarder
O Hoarder fica em uma sala até ter todos os tesouros da sala (ou calcula que não tem resistência suficiente para continuar levando / continuando). Quando todos os tesouros acabarem, se o bot puder seguir em frente com segurança, continuará e continuará o processo de pegar todo o tesouro.
fonte
Backwards
a estratégia de s,Sprinter
s eMemorizer
funciona; porque eles sabem quais são os valores relativos de todo tesouro que veem.Mergulhador
(Não é possível testar no momento, avise-me se isso estiver quebrado.)
O melhor tesouro é mais profundo nas ruínas, então mergulhe fundo e pegue o que pudermos na saída.
fonte
diving
definido?Jacob the Orphan (Diver) was sliced in half by a swinging blade trap.
Não tenho certeza do que você fez de errado, mas isso significa 'retorno inválido' AFAIK.