Pałeczki zmutowane punktami KoTH

13

Podstawowe zasady (inne niż moje)

Fabuła

Jest rok 4579, ludzie mają teraz 2 ręce po 1001 palców. Pałeczki stały się oparte na punktach. I @Dennis ma więcej przedstawicieli niż @Martin ... Ręcznie rysowane czerwone kółka są teraz odrzucane ... Jon Skeet trafił 2 tryliony przedstawicieli na każdej stronie SE ... Tak, strasznie wiem

Pałeczki to rozwiązana gra ręczna. Aby obejść ten problem, stworzyłem go zmutowanym. Zwiększyłem liczbę palców.

Zasady gry

Sposób, w jaki się to gra

Każdy zaczyna z 2 rękami. Każda ręka ma 1001 palców. Każda ręka zaczyna się od 1 (jednego) palca w górę na każdej dłoni. Podczas swojej tury możesz „trafić” rękę innych graczy. Aby trafić, wybierz 1 z twoich rąk do uderzenia i 1 z ich rąk do uderzenia. Ręka, która została trafiona, ma teraz liczbę palców, które były na początku ORAZ liczbę palców, które miałeś na dłoni, którą uderzyłeś.

DAWNY

P1: 1,1 P2: 1,1. P1[0]trafienia P2[1]. Teraz palce są P1:1,1 P2:1,2. Teraz P2[1]uderza p1[0]. Palce są teraz P1: 3,1P2 1,2.

Jeśli jedna ręka dotrze do 1001 palców w górę lub więcej, wówczas ta ręka jest na zewnątrz. Następnie gracz, który dostał rękę (na swoją turę) może „podzielić”. Dzielenie ma miejsce wtedy, gdy bierzesz dłoń, która jest w środku, i zmniejszasz o połowę liczbę palców (zaokrąglamy w górę) i oddajesz je drugiej ręce, aby ją odzyskała.

DAWNY

P1: 1000,2P2 7,7. P2[0]trafienia P1[0]. Wynik to P1: 0,2P2 1,1. P1[1]dzieli się na swoją turę, a wynik to P1: 1,1i P2 7,7.

Gra kończy się, gdy jeden z graczy wyciągnie obie ręce. Punkty są punktowane na podstawie liczby palców zwycięzcy. Więcej punktów = lepiej. Przegrany nie zdobywa punktów.

Są inne zasady, które są używane, ale te są tutaj stosowane.

Wszyscy grają wszyscy (round robin)

Etap końcowy

Suma punktów za każdą wygraną rundę. Wtedy średnia wszystkich punktów w górę. Podziel sumę przez średnią liczbę punktów i uzyskaj końcowy wynik. Większość punktów wygrywa.

Rzeczywiste zasady

Standardowe luki

Proszę nie nie starają się rozwiązać grę. Naprawdę muszę go uruchomić: P

Upewnij się, że bot może działać szybko. Przy ocenie długości rund potrwa to trochę

Wszystkie biblioteki potrzebne w twoim programie muszą znajdować się w domyślnej bibliotece Pythona. Wymień także te, które chcesz zaimportować. Import będzie tylko podstawowy import (dla matematyki zrobić: import math)

Odpowiedzi muszą działać w Pythonie 3.x

Treser

Twój bot będzie własnym plikiem Python 3 z playfunkcją.

playzostaną przekazane dwie listy po dwie liczby. Ta liczba wskazuje, ile palców jest na każdej ręce. Pierwsza lista to Twoja własna ręka.

Jeśli zdecydujesz się uderzyć rękę drugiego gracza, zwróć listę dwóch bitów. Pierwszy bit to indeks ręki, której używasz do uderzenia ( 0pierwszy, 1ostatni), a drugi bit to indeks ręki, którą trafiasz na przeciwnika.

Jeśli zdecydujesz się podzielić, zwróć dowolną inną prawdziwą wartość.

Tada!

Kontroler można znaleźć tutaj . Zapisz każdego bota we własnym pliku i wypisz jego nazwę pliku (bez .py) w botnames.

Ostatnia uwaga:

Ty i drugi bot będziecie na zmianę w pierwszej kolejności. Jeśli gra nie zakończy się w 100 000 (sto tysięcy) rundach, gra zostanie zakończona i żaden bot nie wygra.

Kontroler nie jest chroniony przed ruchami trwającymi wiecznie, ale niepotrzebne koszty ogólne zostaną mocno skrzywdzone.

Krzysztof
źródło
Piaskownica
Christopher
Czy „Standardowe reguły KOTH” mogą być linkiem? A może też „Standardowe luki”.
trichoplax
My handler is very simple, your bot must do it's logic then adjust the the finger scores as needed, remember!Co, więc to my wykonujemy obliczenia dla KoTH?
HyperNeutrino,
@HyperNeutrino mocowanie opps.
Christopher
4
Dennis ma więcej niż rep Martin teraz . O mój boże, skąd te dodatkowe 996 palców ?!
caird coinheringaahing

Odpowiedzi:

6

CodingAndAl algorytmy

Ta odpowiedź używa kodowania i algorytmów, w przeciwieństwie do innych do tej pory! referencja: imgur (bije także wszystkie odpowiedzi opublikowane wcześniej)

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
źródło
Mam ten odnośnik XD
Christopher
To właśnie wygrało. Nigdy nie przegrał.
Christopher
Gratulacje! Chyba będę musiał zadowolić się drugim miejscem. Twoje kodowanie i algorytmy były silniejsze niż moje
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'

Przestroga Bot nie chce sprawiać większych kłopotów, więc uderza mniejszą z rąk przeciwnika swoją mniejszą ręką, jeśli ma obie ręce, i w inny sposób dzieli. Jednak WarningBot nie jest głupcem, więc jeśli może wyciągnąć rękę przeciwnika bez natychmiastowej utraty następnej tury, zrobi to zamiast normalnego ruchu.

Wartość tuszu
źródło
Nieoficjalnie wygrywa
Christopher
Chłodny! Zobaczymy, jak się to potoczy, bo nie będę zaskoczony, gdy ktoś opracuje lepszą strategię. Właśnie zastosowałem coś, co rozumiałem jako waniliową strategię Chopstick (bądź tchórzem i często rozdzielaj się, aby uniknąć śmierci) w sposób, który najlepiej odpowiada nowym zasadom (bądź tchórzem i uderzaj nisko, aby uniknąć śmierci, ponieważ dzielenie / łączenie się podczas ciebie masz obie ręce jest nielegalne) lol
Value Ink
3

Wyrównywacz

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

Jeśli korektor nie ma układu, zostanie on podzielony. W przeciwnym razie trafi najmniejszą rękę przeciwnika własną największą ręką.

LyricLy
źródło
Zgodnie z tymi zmutowanymi zasadami, AFAIK możesz rozdzielić tylko, jeśli jedna ręka jest wyłożona.
Wartość tuszu
O tak, naprawię to.
LyricLy,
„Jeśli korektor nie ma rąk…” mam na myśli, że jeśli nie ma rąk, to już przegrał? Ale to tylko drapanie, weź moje +1, aby to zrekompensować
Value Ink
3

Agresor

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

Kolejny bot startowy, Aggressor uderzy większą z rąk przeciwnika większą z własnych rąk, jeśli obie ręce nie są puste; w przeciwnym razie dzieli się.

HyperNeutrino
źródło
2

RandomBot

import random

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

Na początek jest bot, który wykonuje losowe trafienie, jeśli jego ręce nie są puste; w przeciwnym razie dzieli.

Grał w golfa, ponieważ dlaczego nie: 3

HyperNeutrino
źródło
Naprawiłem to
Christopher
@Christopher Przepraszamy, nie widziałem twojego komentarza. --- Kiedy to naprawisz, usunę to. --- Po prostu usunę to, ponieważ to głupie xD
HyperNeutrino
@Christopher Uwaga: Zredagowałem to w prawidłowym zgłoszeniu. Dodam też inne rozwiązanie; powiedz mi, czy kontroler nie działa poprawnie :)
HyperNeutrino,
Miło jest je wypróbować
Christopher
@Christopher Czy kontroler działa poprawnie?
HyperNeutrino,
2

Błąd

Tak, tak nazywa się 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))]

Doszedłem do tego, testując z innymi botami. Jednak konsekwentnie zajmuje drugie miejsce w moich symulacjach. Więc w końcu będę robił kolejnego bota.

Edycja: Wydaje mi się, że nie mogę napisać żadnego bota, który pokonałby WarningBot, a moje dodatkowe testy wydają się wskazywać, że jest to drugi najlepszy, a nie drugi najgorszy.

Magenta
źródło
1

Maratończyk

Ulepszyłem kod Aggressora dostarczony przez „HyperNeutrino”, aby po prostu trafić mniejszą z dwóch przeciwników dwiema rękami. Jest to oczywiście bardzo głupia strategia, ale nie mogę odmówić bycia na szczycie tabeli! (Mimo że ten wykres byłby stratami)

Nie jestem pewien, czy ten kod będzie działał bez błędów, ponieważ nie mogłem go przetestować z powodu pracy. Powinien jednak działać bezbłędnie.

def play(s, o):
     return [s.index(min(s)),o.index(min(o))]if all(s)else 1
Jordania
źródło
Ładna pierwsza odpowiedź! Wybrałeś świetne pytanie: P (bez uprzedzeń)
Christopher
Dzięki :) Byłem dość zdenerwowany, ponieważ nie byłem pewien, czy poprawianie czyichś kodów tak jak ja było dozwolone, czy nie. Zakładam, że to tak długo, jak dasz temu wyraz. I chciałem stworzyć taki, który po prostu rozegrałby największą rękę przeciwko największej przeciwnicy, ale HyperNeutrino pobił mnie właśnie do tego! haha
Jordan
Tak. W tym SE często używany jest kod modyfikujący: P
Christopher
Fajna odpowiedź! Jedną z rzeczy, o które się martwię (nie mogę teraz tego przetestować) jest to, że nie wiem, jak kontroler zareaguje, jeśli spróbujesz trafić pustą rękę, ani jak to wpływa na reguły.
Wartość tuszu
1
Jest to bardzo podobne do Equalizera, ale Equalizer sprawdzi, czy nie trafi w pustą rękę przeciwnika, jeśli jest obecny. @LyricLy
HyperNeutrino