Палочки для еды мутировали очками KoTH

13

Основные правила (отличные от моих)

История

Это 4579 год, у людей теперь есть две руки по 1001 палец в каждой. Палочки для еды стали основаны на очках. И у @Dennis больше представителей, чем у @Martin ... Рисованные красные круги теперь лишены голосов ... Джон Скит набрал 2 триллиона представителей на каждом сайте SE ... Да, я знаю, страшно

Палочки для еды - это ручная игра, которая была решена. Поэтому, чтобы обойти это, я создал его мутировавшим. Я увеличил количество пальцев.

Правила игры

То, как это играется

Каждый начинает с 2 рук. Каждая рука имеет 1001 палец. Каждая рука начинается с 1 (одного) пальца на каждой руке. Во время вашего хода вы можете «ударить» по руке других игроков. Для удара вы выбираете 1 из своих рук для удара и 1 из их рук для удара. У пораженной руки теперь есть количество пальцев, которыми они были вначале, и количество пальцев, которые были у вас на руке, которую вы ударили.

EX

P1: 1,1 P2: 1,1, P1[0]хиты P2[1]. Теперь пальцы есть P1:1,1 P2:1,2. Сейчас P2[1]хиты p1[0]. Пальцы теперь P1: 3,1P2 1,2.

Если одна рука поднимается на 1001 палец или больше, то эта рука отсутствует. Затем игрок, получивший раздачу (в свою очередь), может «разделиться». Разделение - это когда вы берете руку, которая находится внутри, и вдвое уменьшаете количество пальцев (округляет вверх) и отдаете эти пальцы другой руке, чтобы вернуть ее обратно.

EX

P1: 1000,2P2 7,7. P2[0]хиты P1[0]. Счет P1: 0,2P2 1,1. P1[1]делит ход за свой ход, и счет P1: 1,1и P2 7,7.

Игра заканчивается, когда у одного игрока обе руки. Очки оцениваются по количеству пальцев, которые есть у победителя. Больше очков = лучше. Проигравший не получает очков.

Есть и другие правила, которые здесь используются.

Все играют всех (круговой)

эндшпиль

Суммируйте свои очки за каждый выигранный раунд. Затем усредните все баллы. Разделите ваш итог на средние баллы и получите окончательный результат. Большинство очков выигрывают.

Актуальные правила

Стандартные лазейки

Пожалуйста, не пытайтесь решить игру. Я действительно должен быть в состоянии запустить это: P

Убедитесь, что бот может быстро бегать. Судя по продолжительности раундов, это займет некоторое время.

Все библиотеки, необходимые в вашей программе, должны быть в библиотеке по умолчанию Python. Также перечислите те, которые вам нужно импортировать. Импорт будет только основной импорт (по математике я: import math)

Ответы должны работать в Python 3.x

укротитель

У вашего бота будет собственный файл Python 3 с playфункцией.

playбудут переданы два списка по два номера в каждом. Это число указывает, сколько пальцев на каждой руке. Первый список - ваша собственная рука.

Если вы решите поразить руку другого игрока, верните список из двух битов. Первый бит - это индекс руки, которую вы используете для удара ( 0для первого1 для последнего), а второй бит - это индекс руки, которую вы бьете по противнику.

Если вы решили разделить, верните любое другое истинное значение.

Тада!

Контроллер можно найти здесь . Сохраните каждого бота в своем собственном файле и перечислите имя каждого бота (без .py) в botnames.

Конечная нота:

Вы и другой бот по очереди идете первыми. Если игра не заканчивается в 100 000 (сто тысяч) раундов, игра будет прервана, и ни один бот не выиграет.

Контроллер не защищен от движений, выполняемых вечно, но ненужные накладные расходы будут сильно осуждены.

Кристофер
источник
Песочница
Кристофер
Могут ли "Стандартные правила KOTH" быть ссылкой? И, может быть, «Стандартные лазейки» тоже.
Trichoplax
My handler is very simple, your bot must do it's logic then adjust the the finger scores as needed, remember!Что, так что мы те, кто делает вычисления для KoTH?
HyperNeutrino
@HyperNeutrino исправление опп.
Кристофер
4
Деннис имеет больше , чем репутацию Мартин прямо сейчас . Боже мой, откуда взялись эти 996 дополнительных пальцев ?!
Caird Coneheringaahing

Ответы:

6

CodingAndAlgorithms

Этот ответ на самом деле использует кодирование и алгоритмы, в отличие от других до сих пор! ссылка: imgur (также превосходит все ответы, опубликованные до этого)

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
источник
Я получил эту ссылку XD
Кристофер
Это только что выиграл. Это никогда не потеряно.
Кристофер
Поздравляем! Я думаю, мне придется согласиться на второе место. Ваше кодирование и алгоритмы были сильнее моего
Value Ink
3

CautionBot

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'

CautionBot не хочет причинять слишком много неприятностей, поэтому он ударяет по меньшей руке противника своей меньшей рукой, если у него есть обе руки, и в противном случае разделяется. Однако CautionBot не дурак, поэтому, если он может взять руку противника, не теряя сразу следующего хода, он сделает это вместо обычного хода.

Значение чернил
источник
Неофициально это победа
Кристофер
Здорово! Посмотрим, как все пойдет отсюда, потому что я не удивлюсь, если кто-то разработает лучшую стратегию. Я просто применил то, что я понял, как стратегию ванильной палочки для еды (будь трусом и часто раскалывайся, чтобы не быть убитым) таким образом, чтобы лучше соответствовать новым правилам (будь трусом и ударись низко, чтобы не быть убитым, так как расщепление / слияние в то время как ты у тебя обе руки нелегальны) лол
Value Ink
3

Эквалайзер

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

Если в Эквалайзере отсутствует рука, он разделится. В противном случае, он поражает наименьшую руку противника своей самой большой рукой.

LyricLy
источник
Согласно этим мутированным правилам, AFAIK вы можете разделить, только если одна рука отсутствует.
Стоимость чернил
О да, я исправлю это.
LyricLy
«Если у Эквалайзера нет рук ...», я имею в виду, если у него нет рук, то он уже проиграл? Но это просто придирки, возьми мой +1, чтобы компенсировать
Value Ink
3

агрессор

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

Другой стартовый бот, Агрессор, ударит большую руку противника большей своей собственной рукой, если обе его руки не пусты; в противном случае это раскалывается.

HyperNeutrino
источник
2

RandomBot

import random

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

Просто для начала, вот бот, который делает случайный удар, если его руки не пусты; в противном случае, расщепляется.

Гольф, потому что почему бы и нет: 3

HyperNeutrino
источник
Я это исправлял
Кристофер
@Christopher Извините, не видел ваш комментарий. --- Как только вы исправите это, я удалю это .--- Я просто удалю это, потому что это глупый xD
HyperNeutrino
@Christopher Примечание: я отредактировал это в правильное представление. Я тоже добавлю другое решение; скажите, если контроллер не работает должным образом :)
HyperNeutrino
Приятно их опробовать
Кристофер
@ Christopher Контроллер работает нормально?
HyperNeutrino
2

ошибка

Да, это имя бота.

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))]

Я пришел к этому путем тестирования с другими ботами. Тем не менее, он последовательно второй в моей модели. Так что в конечном итоге я сделаю еще одного бота.

Изменить: я не могу написать ни одного бота, который побеждает CautionBot, и мое дополнительное тестирование, кажется, показывает, что это второй лучший, а не второй худший.

фуксин
источник
1

марафонец

Я подправил код Агрессора, предоставленный «HyperNeutrino», чтобы просто ударить меньшего из противников двумя руками с меньшим из его рук. Конечно, это очень глупая стратегия, но я не могу отказаться от того, чтобы быть на вершине чарта! (Даже если этот график будет потери)

Я не уверен, что этот код будет работать без ошибок, потому что я не смог проверить его из-за того, что на работе. Тем не менее, он должен работать без нареканий.

def play(s, o):
     return [s.index(min(s)),o.index(min(o))]if all(s)else 1
Иордания
источник
Хороший первый ответ! Вы выбрали отличный вопрос: P (без предвзятости)
Кристофер
Спасибо :) Я очень нервничал, потому что я не был уверен, разрешено ли изменять чужой код, как я, или нет. Я предполагаю, что это так долго, как вы делаете это очевидным. И я собирался сделать такую, которая бы сыграла самую сильную руку против самой большой противников, но HyperNeutrino точно победил меня! хаха
Джордан
Да. В этом SE часто используется код настройки: P
Кристофер
Классный ответ! Одна вещь, о которой я бы беспокоился (не могу проверить это прямо сейчас), это то, что я не знаю, как контроллер ответит, если вы попытаетесь получить пустую руку, или как это учитывается в правилах.
Стоимость чернил
1
Это очень похоже на эквалайзер, но эквалайзер проверит, чтобы убедиться, что он не попал в пустую руку противника, если он присутствует. @LyricLy
HyperNeutrino