Kierowca testowy • Dyskusja o wyzwaniu • Prześlij poszukiwacza przygód
( Źródło obrazu )
Kilku rywalizujących poszukiwaczy przygód napada na ruiny w poszukiwaniu skarbu, ale mogą nosić tylko tyle rzeczy naraz i mają swoje granice wytrzymałości. Chcą zdobyć najcenniejszy skarb i wydostać się, zanim staną się zbyt zmęczeni, aby kontynuować. Próbują stać się jak najbogatszymi ze swoich grabieży shenaniganów.
Rozgrywka
Każdy poszukiwacz przygód zaczyna w pierwszym pokoju lochu z 1000 punktami wytrzymałości i 50 kg miejsca w plecaku.
Gra działa w systemie turowym, a wszyscy gracze rozpatrują swoje tury jednocześnie. W każdej turze możesz wykonać jedną z następujących czynności:
- Przejdź do następnego pokoju.
- Przejdź do poprzedniego pokoju.
- Licytuj wytrzymałość, aby zdobyć skarb.
- Upuść skarb.
Przemieszczanie się między pokojami wymaga 10 punktów wytrzymałości plus 1 za każde 5 kg aktualnie w plecaku, zaokrąglone w górę. Na przykład poszukiwacz przygód niosący 3 kg skarbu wymaga 11 punktów wytrzymałości, a jeden niosący 47 kg wymaga 20 punktów wytrzymałości.
Upuszczenie skarbu wymaga 1 wytrzymałości bez względu na upuszczony skarb.
Po wyjściu z ruin gracz nie będzie podejmował więcej tur.
Jeśli gracz nie może wykonać żadnej z tych akcji (z powodu braku wytrzymałości lub braku skarbów), jego poszukiwacz przygód umiera z wyczerpania, rozlewając posiadany skarb do aktualnie zajmowanego pokoju. Podobnie, jeśli gracz podejmie próbę wykonania nieprawidłowej akcji, jego poszukiwacz przygód zostanie zamiast tego zabity przez pułapkę, co spowoduje takie samo rozlanie skarbu.
Licytacja
Minimalna oferta dla skarbu to 1 wytrzymałość na 1 kg ważonego skarbu. Możesz także licytować dodatkowe punkty wytrzymałości, aby zwiększyć prawdopodobieństwo zdobycia skarbu. Wytrzymałość, która została licytowana, jest zużywana bez względu na wynik.
W przypadku, gdy wielu graczy licytuje ten sam skarb, gracz, który licytuje najwięcej, otrzymuje skarb. Jeśli więcej niż jeden gracz złoży najwyższą ofertę, żaden z nich nie otrzyma skarbu.
Warunek wygranej
Gracz z największą całkowitą wartością skarbów jest zwycięzcą. W mało prawdopodobnym przypadku remisu, krawaty przechodzą do najmniejszej całkowitej wagi, następnie najmniejszej liczby skarbów, a następnie wartości najcenniejszego skarbu, drugiego najcenniejszego, trzeciego ... aż do zerwania remisu. W niemal niemożliwym przypadku, gdy w tym momencie nadal jest remis, kierowca testowy mówi „spieprzyć”, a zwycięzca zostaje w ten sposób ustalony arbitralnie.
W kontekście turnieju gracze zostaną sklasyfikowani z pierwszym miejscem, które otrzyma 10 punktów, drugim miejscem z 9 punktami, trzecim miejscem z 8 punktami itp., Z martwymi graczami i poszukiwaczami przygód bez skarbów, którzy zdobędą 0 punktów.
O ruinach
- Każdy pokój początkowo zawiera między i skarbów. (Gdzie jest numerem pokoju)
- Istnieje dowolnie wiele pokoi, ograniczonych jedynie wytrzymałością poszukiwaczy przygód i chęcią eksploracji.
- Każdy skarb będzie miał wartość pieniężną (w pełnych $) i wagę (w pełnych kg).
- Skarby wydają się być bardziej cenne i obfite, gdy schodzisz głębiej w ruiny.
- Szczegółowe formuły generowania skarbów są następujące: (używając notacji dla rzutów kostką)
- Masa jest najpierw generowana przy użyciu wzoru (minimum 1)
- Wartość skarbu jest następnie generowana przez (gdzie jest numerem pokoju, a jest wagą)
Informacje widoczne dla graczy
W każdej turze gracze otrzymują następujące informacje:
- Numer pokoju, w którym aktualnie przebywają. Jest to indeks 1, więc koncepcyjnie wyjście znajduje się w „pokoju 0”
- Lista skarbów znajdujących się obecnie w pokoju
- Lista innych graczy, którzy również znajdują się obecnie w pokoju.
- Twój aktualny spis skarbów
- Twój obecny poziom wytrzymałości
Kodowanie
Sterownik testowy można znaleźć tutaj .
Powinieneś zaimplementować podklasę tej Adventurer
klasy:
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
Musisz tylko zastąpić get_action
metodę. enter_ruins
jest uruchamiany przed rozpoczęciem gry i jest szansą na przygotowanie czegokolwiek, co chcesz mieć w grze. Nie musisz przesłonić __init__
i naprawdę nie powinieneś . Jeśli Twoje __init__
awarie zostaną zdyskwalifikowane.
get_action
otrzymuje pojedynczy argument namedtuple
zawierający następujące pola (w tej kolejności, jeśli wolisz destrukcję):
room
: numer pokoju, w którym aktualnie się znajdujesztreasures
: lista skarbów w pokojuplayers
: lista innych graczy w pokoju. W ten sposób otrzymujesz tylko nazwę gracza, więc nie wiesz, który bot kontroluje go, ani jaki jest jego ekwipunek / wytrzymałość.inventory
: lista skarbów w twoim plecakustamina
: twój obecny poziom wytrzymałości
Ten obiekt zapewnia dodatkowo dwie właściwości narzędzia:
carry_weight
: całkowita waga wszystkich skarbów, które nosisztotal_value
: całkowita wartość wszystkich skarbów, które nosisz
Te treasures
i inventory
wykazy zawierają namedtuple
S z tych atrybutów:
name
: nazwa skarbu (do celów kosmetycznych)value
: wartość pieniężna skarbu w $.weight
: waga skarbu w kg
get_action
powinien zwrócić jedną z następujących wartości / wzorców:
'next'
lub'previous'
przejść do następnych / poprzednich pokoi'take', <treasure index>, <bid>
(tak, jako krotka, choć każda sekwencja również technicznie będzie działała), aby licytować skarb pod danym indeksem na liście skarbów w pokoju. Oba argumenty powinny być liczbami całkowitymi. Pływaki będą zaokrąglane w dół.'drop', <inventory index>
upuścić przenoszony skarb znaleziony przy danym indeksie. Indeks powinien (naturalnie) być liczbą całkowitą.
Inne ograniczenia
- Możesz użyć tylko przypadkowej instancji podanej podczas inicjalizacji dla pseudolosowości.
- Cokolwiek innego, co mogłoby wprowadzić behawioralny niedeterminizm, jest niedozwolone. Chodzi tutaj o to, aby boty zachowywały się identycznie, gdy otrzymają to samo ziarno, aby pomóc w testowaniu nowych botów (i potencjalnie błędów w sterowniku testowym). Tylko promieniowanie kosmiczne powinno powodować wszelkie odchylenia / niedeterminizm.
- Należy pamiętać, że kody skrótu są losowe w Pythonie 3, więc używanie
hash
do podejmowania jakichkolwiek decyzji jest niedozwolone.dict
s są w porządku, nawet jeśli używamy kolejności iteracji dla decyzji, ponieważ kolejność jest gwarantowana spójna od Pythona 3.6.
- Nie możesz ominąć sterownika testowego za pomocą
ctypes
hacków lubinspect
stosu voodoo (lub innej metody). Istnieje kilka imponująco przerażających rzeczy, które możesz zrobić z tymi modułami. Proszę nie.- Każdy bot jest dobrze izolowany w piaskownicy dzięki obronnym kopiom i naturalnej niezmienności
namedtuple
s, ale istnieją pewne nie do naprawienia luki / exploity. - Inne funkcje
inspect
ictypes
mogą być używane, o ile żadne z nich nie jest używane do obchodzenia funkcji kontrolera. - Żadna metoda przechwytywania instancji innych botów w bieżącej grze jest niedozwolona.
- Każdy bot jest dobrze izolowany w piaskownicy dzięki obronnym kopiom i naturalnej niezmienności
- Boty powinny działać solo i nie mogą w żaden sposób koordynować się z innymi botami w jakimkolwiek celu. Obejmuje to tworzenie dwóch botów o różnych celach, z których jeden poświęca się dla sukcesu drugiego. Gdy jest więcej niż 10 konkurentów, tak naprawdę nie ma gwarancji, że oba boty będą w tej samej grze, a nazwy poszukiwaczy przygód nie dadzą żadnych wskazówek co do klasy bota, więc tego typu strategie są ograniczone.
- Obecnie nie ma ścisłego ograniczenia czasu wykonania, jednak zastrzegam sobie prawo do ograniczenia go w przyszłości, jeśli turnieje zaczną trwać zbyt długo. Bądź rozsądny i staraj się utrzymywać przetwarzanie tury poniżej 100 ms , ponieważ nie przewiduję potrzeby ograniczenia go poniżej tego progu. (Turnieje potrwają około 2 godzin, jeśli wszystkie boty zajmą około 100 ms na turę.)
- Twoja klasa botów musi mieć unikalną nazwę spośród wszystkich zgłoszeń.
- Możesz nic nie pamiętać między grami. (Możesz jednak pamiętać rzeczy między turami )
- Nie edytuj sys.modules. Wszystko poza zmiennymi instancji należy traktować jako stałą.
- Nie możesz modyfikować kodu żadnego bota programowo, w tym własnego.
- Obejmuje to usunięcie i przywrócenie kodu. Ma to na celu usprawnienie debugowania i turniejów.
- Każdy kod powodujący awarię kontrolera zostanie natychmiast zdyskwalifikowany. Chociaż wychwyconych zostanie większość wyjątków, niektóre z nich mogą się prześlizgnąć, a segfaultów nie da się złapać. (Tak, możesz segfault w Pythonie dzięki
ctypes
)
Zgłoszenia
Aby ułatwić usuwanie odpowiedzi, wskaż nazwę bota u góry odpowiedzi za pomocą a #Header1
i upewnij się, że twoja odpowiedź zawiera co najmniej jeden blok kodu (użyty zostanie tylko pierwszy blok w odpowiedzi). Nie musisz dołączać żadnych importów ani dokumentów, ponieważ zostaną one automatycznie dodane przez skrobak.
Będę bardziej skłonny głosować nad odpowiedziami szczegółowymi i zrozumiałymi wyjaśnieniami. Inni mogą zachowywać się tak samo.
Z grubsza mówiąc, twoja odpowiedź powinna być sformatowana mniej więcej tak:
# Name of Bot
Optional blurb
#imports go here
class BotName(Adventurer):
#implementation
Explanation of bot algorithm, credits, etc...
(renderowane jako)
Nazwa bota
Opcjonalny napis
#imports go here class BotName(Adventurer): #implementation
Objaśnienie algorytmu bota, kredytów itp.
Lokalne uruchamianie sterownika testowego
Będziesz potrzebował Pythona w wersji 3.7+ i zalecam także instalację tabulate
za pomocą pip. Skrobanie tej strony w celu przesłania dodatkowo wymaga lxml
i requests
. Aby uzyskać najlepsze wyniki, należy również użyć terminala z obsługą znaków zmiany koloru ANSI. Informacje na temat konfiguracji w systemie Windows 10 można znaleźć tutaj .
Dodaj bota do pliku w podkatalogu w tym samym katalogu co ruins.py
( ruins_bots
domyślnie) i pamiętaj o dodaniu from __main__ import Adventurer
go na górze modułu. Jest to dodawane do modułów, gdy skrobak pobiera twoje zgłoszenie, i chociaż jest zdecydowanie zhackowane, jest to najprostszy sposób na upewnienie się, że bot ma właściwy dostęp Adventurer
.
Wszystkie boty w tym katalogu będą ładowane dynamicznie w czasie wykonywania, więc dalsze zmiany nie są konieczne.
Zawody
Zwycięzca zostanie wyłoniony w serii gier z maksymalnie 10 botami w każdej grze. Jeśli zgłoszeń jest więcej niż 10, 10 najlepszych botów zostanie określonych poprzez systematyczne dzielenie ich na grupy po 10, aż każdy bot rozegra (dokładnie) 20 gier. 10 najlepszych botów zostanie wybranych z tej grupy z wynikami resetowania i będzie grać w gry, dopóki bot z pierwszego miejsca nie osiągnie 50-punktowej przewagi nad botem z drugiego miejsca lub do momentu rozegrania 500 gier.
Dopóki nie będzie co najmniej 10 zgłoszeń, puste miejsca zostaną wypełnione „Pijakami”, które wędrują losowo przez ruiny i zabierają (a czasami upuszczają) losowe skarby, dopóki nie wyczerpią się ich wytrzymałość i nie będą musiały płynąć do wyjścia.
Turnieje będą uruchamiane co tydzień, jeśli pojawią się nowe zgłoszenia. To jest otwarte wyzwanie KOTH bez określonej daty zakończenia.
Tabela liderów
Z biegu 4 maja 2019 o 16:25 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
Aktualizacja - 15 kwietnia: kilka aktualizacji / objaśnień do reguł
Aktualizacja - 17 kwietnia: zakaz kilku ważnych przypadków nikczemnych działań, takich jak modyfikowanie kodu innych botów.
Aktualizacja - 4 maja: Nagroda przyznana Sleafarowi za absolutne zniszczenie wstecz. Gratulacje!
źródło
pip
zainstalowany i włączonyPATH
(co jest domyślne w przypadku nowszych instalacji AFAIK), to z systemu Windows można uruchomićpip install modulename
w wierszu polecenia. W innych okolicznościach (o których nie wiem) przejdź do pip , wyszukaj potrzebny moduł i wybierz opcję.Odpowiedzi:
Księgowa
Księgowy jest osobą bardzo unikającą ryzyka. Lubi mieć pewność, że to, co robi, jest naprawdę najlepszą opcją w danej sytuacji. Stawia sobie więc cel i zbiera skarb tylko wtedy, gdy jego obliczenia pokazują, że ustawia go na właściwej drodze do tego celu. Jest jednak bardzo biurokratyczny i nie lubi upuszczać przedmiotów, o których wcześniej postanowił, że chce; wszelkie próby nauczenia go tego do tej pory powodowały, że księgowy upuścił przedmiot, a następnie natychmiast go podniósł.
Być może będzie kontynuowane.
źródło
Accomodator
Oparty luźno na moim innym bocie LightWeight. Gdzie lekki bot był prosty, to bot jest dużo bardziej skomplikowana, aby pomieścić interakcje z innymi botami: zarówno łagodne i deliberatly distruptive.
Ten bot najpierw pobiegnie do losowo przydzielonego pokoju, a następnie spróbuje licytować za skarb o najlepszym stosunku wartości do masy, jeśli w pokoju są inni gracze, to załóżmy, że licytują, więc zamiast tego licytują drugi najlepszy skarb. Jeśli ta oferta nie powiedzie się, w następnej turze licytuj kolejny najlepszy skarb.
Gdy licytacja zakończyła się powodzeniem, powtarzaj licytację za najlepszy / drugi najlepszy wynik, aż w pokoju nie będzie już skarbów, a następnie przejdź głębiej do ruiny
Dla każdego pokoju wejdź w ruinę, powtarzaj licytację o najlepszy / drugi najlepszy wynik, dopóki nie będzie już więcej skarbów w pokoju, a następnie przejdź głębiej do ruiny lub jeśli wykryjemy, że nie możemy zejść głębiej, przełącz się do stanu „Wyjście” i zacznij spadać najgorsze skarb, dopóki nie będziemy w stanie zagwarantować, że możemy opuścić ruinę żywcem.
W stanie wyjścia sprawdzimy, czy możemy dodać 1 kg skarbu i nadal będziemy ożywiać, jeśli tak, to spróbujemy licytować skarb 1 kg, jeśli nie, to przejdziemy do poprzedniego pokoju.
Jego działanie jest dość zmienne ... jednak zwykle będzie jednym z trzech najlepszych botów.
źródło
Sprinter
Podobnie jak Nurek, Sprinter wchodzi głęboko i zbiera najlepsze przedmioty w drodze powrotnej.
Sprinter wchodzi głęboko, a następnie oblicza wynik dla każdego skarbu i podnosi wszystko powyżej pewnego progu. Ten próg zależy od pomieszczenia, w którym aktualnie się znajduje, ponieważ kosztuje więcej, aby zabrać przedmioty z pomieszczeń głębiej w ruinach.
Nadal mam 2 optymalizacje dotyczące „walki o skarb”, które są planowane na następne dni.
17.04 .: Scoundrel stał się zbyt bystry, Sprinter początkowo postanowił wpuścić go w pułapkę. Chciałem zabić dowolnego bota, który próbował wywołać Sprintera, ale testdriver niestety nie radzi sobie z wyjątkami, które zdarzają się przy init. Więc kolejna poprawka dla Scoundrel jest dość łatwa ...
źródło
Planować naprzód
Wykorzystałem najlepsze / najgorsze fragmenty obliczeń z odpowiedzi Artemis Fowl , ale logika wyboru jest całkowicie moim własnym projektem i od tego czasu została zmodyfikowana, aby uwzględnić kilka dodatkowych czynników, takich jak skarby widoczne we wcześniejszych pokojach (w celu zminimalizowania odbioru skarb, tylko do cofnięcia się, upuszczenia i odebrania czegoś innego).
Bot zapuszcza się tak głęboko, jak uważa, że jest to dość bezpieczne (obliczenia te skutecznie sprawdzają się podczas nurkowania na określoną głębokość, ale ma elastyczność w obsłudze innych początkowych wartości wytrzymałości), zbiera artefakty (priorytetem jest wysoki koszt i niska waga), a następnie zaczyna się wycofywać, gdy stwierdzi, że nie może już więcej nieść.
Wychodząc, zbierze dodatkowe skarby, które widzi, że może nadal bezpiecznie przenosić do wyjścia. Zrzuci nawet posiadane artefakty, jeśli nowy jest lepszą ofertą i nie spowoduje wyczerpania. Jeśli ma miejsce w plecaku, zbierze nowy skarb przed upuszczeniem go o niższej jakości, minimalizując walkę z innymi botami.
źródło
__init__
funkcja jest już zaimplementowana, nie musisz jej zastępować.Artyventurer
Pokonaj pijaków o około 1000 $! Nie mogłem wymyślić twórczej nazwy, ale tutaj wszyscy:
Czasami większość kodu tutaj nic nie robi (przynajmniej kiedy testuję go przeciwko Drunkards), program po prostu (próbuje) znaleźć najlepszy ruch, w tym przetwarzanie w sytuacjach, w których próbuje się nie poddać. Niektóre z nich nigdy nie mogą działać, po prostu są tam, więc mogę bawić się liczbami, które prawdopodobnie nadal można poprawić.
Wyjaśnienie
if state.inventory ... worsti = None
Znajdź „najgorszy” element w ekwipunku, czyli przedmiot o najniższym stosunku wartości do masy. Przechowuje
worsti
, który zawiera jego indeks, jego wartość i wagę, jako krotka lubNone
jeśli w ekwipunku nie ma żadnych przedmiotów.if self.drop ... return 'drop', worsti[0]
Jeśli kazałem mu upuścić tę turę w ostatniej turze (patrz poniżej), i może, upuść „najgorszy” przedmiot, jak obliczono powyżej.
extra = ... * state.room
Oblicz, ile wytrzymałości by pozostałoby, gdybym kazał jej wrócić teraz.
if extra > CONTINUE_IN:\ return 'next'
Jeśli to więcej niż CONTINUE_IN, wróć
'next'
.if extra < 0 and worsti:\ return 'drop', worsti[0]
Jeśli jest mniej niż
0
, upuść najgorszy przedmiot.if extra < state.room:\ return 'previous'
Jeśli jest mniejszy niż numer pokoju (nie może nosić więcej skarbów), wróć.
if state.treasures: ... bestt = None
Wypracuj najlepszy skarb do zabrania, podobny do najgorszego przedmiotu w powyższym ekwipunku. Przechowuj w
bestt
.if extra > 0 and bestt: ... return 'take', bestt[0], bid
Przy obecnych liczbach jest to wykonywane za każdym razem, gdy jesteśmy tak daleko i istnieje skarb. Jeśli bezpiecznie jest wziąć „najlepszy” skarb, robi to. Licytacja to minimum, lub jeszcze jedno, jeśli ktoś jest obecny.
if bestt and worsti: ... return 'take', bestt[0], bid
Przy obecnych liczbach ten blok kodu nigdy się nie uruchomi, ponieważ poprzedni blok kodu ma szerszy warunek. Wykonuje się to, jeśli zaszliśmy tak daleko i w moim ekwipunku i pokoju znajdują się zarówno skarby / skarby. Jeśli „najlepszy” skarb w pokoju jest cenniejszy niż „najgorszy” skarb w moim ekwipunku i bezpiecznie byłoby go zamienić w ciągu następnych dwóch tur, robi to.
return 'previous'
Jeśli nic się nie wydarzy, po prostu wróć.
Aktualizacja 16/04/19:
Środki przeciw łajdakowi. To stanie się wojną licytacyjną :(
Dalsza aktualizacja 16/04/19:
Cofnięto poprzedni, zamiast tego losowo przełącza każdy inny element przy znajdowaniu najlepszego, np.
[1, 2, 3, 4, 5, 6] → [2, 1, 3, 4, 6, 5]
. Powinny być trudniejsze do skopiowania :).Aktualizacja 17/04/19:
Cofnął poprzedni, zamiast tego czyści swój własny kod źródłowy . Robi to, w
__init__
czym zawsze będzie wcześniejScoundrel.enter_ruins
, i tym samym powstrzyma Scoundrel przed załadowaniem go. Zastępuje swój kod przyget_action
pierwszym wywołaniu, aby był gotowy na następny raz. NAPRAWIONO, Łotr umiera teraz po przyjeździe.Dalsza aktualizacja 17.04.19:
Cofnięty poprzedni, zamiast tego zastępuje
sys.modules
wpis modułem matematycznym, więc gdy Scoundrel próbuje go załadować, zamiast tego ładuje moduł matematyczny. :)Poza tym dopiero sobie uświadomiłem, że wytrzymałość na ruch wynosi 10 + waga / 5 , więc próbowałem to naprawić.
Dalsza aktualizacja 17.04.19:
Teraz obejmuje czosnek z obu poprzednich aktualizacji.
Aktualizacja 18/04/19:
Bawiąc się liczbami i obliczeniami, dostaje teraz 2000 USD - 3000 USD.
Dalsza aktualizacja 18/04/19:
Usunięto czosnek do usuwania plików, ponieważ został zbanowany, dodano nowy czosnek, który upewnia się, że
'draco'
nie jest odpowiedzialny za jego działanie, jeśli tak, to po prostu wracaprevious
przy pierwszej turze. Wyniki skoczyły w tajemniczy sposób do 1200–1800 USD, na co patrzę.źródło
Łotr
Łotr działa przede wszystkim na przeszkadzanie innym zawodnikom. Obecnie ingeruje w Sprintera, Artystera i Księgowego (lista ta będzie rosła w miarę upływu czasu, pod warunkiem, że leży to w najlepszym interesie Łajdaka). Robi to poprzez naśladowanie innych botów, a następnie licytowanie, podcinanie lub w inny sposób walkę o relikwie. W związku z tym jest mało prawdopodobne, aby ten wpis kiedykolwiek zdominował tabelę wyników i zamiast tego działał jako siła psująca. Obecna wersja w momencie publikowania tego artykułu stawia go na 2. miejscu ze średnią oceną wynoszącą około 7.
Scoundrel udaremnia próby innego bota, aby zmodyfikować się w celu obrony przed Scoundrel, wykonując bezpośrednio kod innych uczestników jako nierozróżnialną kopię klonu. Problemy z importem powodujące zduplikowanie uczestników zostały rozwiązane poprzez utworzenie klonów poprzez odbicie (wojny edycyjne z drobnymi szczegółami matematycznego określenia nie są pożądane z punktu widzenia wymiany stosów, ale doprowadziłyby do tego samego rezultatu). Wyzwania KOTH również mają na to swoją historię.
Scoundrel zastępuje Teamsters, aby zachować Teamsters ze względu na ich ciekawość. Po tej edycji kontroler nie powinien już zdrapywać Teamsters.
Aktualizacja 17.04.2019: dalsze środki zaradcze.
Teamsters (uznany za nielegalny)
Nie krępuj się biegać lokalnie tam, gdzie jest nie więcej niż 8 innych zawodników!
Ten wpis (choć teraz wyraźnie nieważny) to w rzeczywistości dwa boty, a kontroler chętnie zgarnie je oba i doda do listy uczestników (bo czyż nie, Python?)
Faza 1:
1. Jeśli na podłodze nie ma skarbu ważącego mniej niż 3, porusza się w dół 2. Ponieważ jest prawie pewnym, że
jest ostatnim poszukiwaczem przygód powracającym na powierzchnię, wszystko, co musi zrobić, to znaleźć kogoś.
Faza 2:
Nazwa skarbów faktycznie przydała się, aby pomóc logice nie załadować się na śmieci na podłodze 25 i wyjść wcześniej, ponieważ nie było sposobu na komunikację między dwoma botami (a TeamsterA zawsze wcześniej znajdowałby się w pokoju z kimś innym) TeamsterB powrócił).
Kolejny logiczny wniosek: stworzenie armii
Teoretycznie można to wykorzystać do ustalenia głębokości i zdobycia skarbów z głębokości nawet z Pokoju 98, jednak ponieważ wymagałoby to więcej niż 2 botów, logika składająca się z tych botów stawałaby się coraz bardziej złożona, a ponieważ jestem pewien, że tak jest nielegalne zgłoszenie za naruszenie niepisanej reguły, więc nie będę się tym przejmować.
Skutecznie
A
czeka na 30,B
czeka na 50 ...n
nurkuje do 98, podnosi skarb, przesuwa się do 97, upuszcza (a następnie umiera),n-1
podnosi i przesuwa do 96 ...C
upuszcza (umiera),B
podnosi w górę i przesuwa się do 30, upuszcza (umiera),A
podnosi go i wraca do wyjścia.Szacuję, że zajęłoby to 11 botów.
Jednak nie warto tego robić, chyba że uda ci się odzyskać z tej głębokości około 4 skarbów, aby konkurować z takimi wejściami jak PlanAhead lub Artyventure, ze względu na skalowanie między kosztami wytrzymałości ruchu i średnią wartością skarbów.
Przykładowe wyniki
Rzadko osiąga wynik poniżej 4000 $, czasami grzebienie 6000 $.
źródło
Wstecz
Ponieważ działa odwrotnie
Dlaczego nazywa się Backwards?
Ponieważ wziąłem Księgowego i próbowałem zmusić go do działania zgodnie z jego logiką, aby zanurkował głęboko, a następnie podniósł preferowane łupy w drodze do wyjścia (na tyłach Księgowego).
W końcu wciąż zbiera większość swoich nagród po drodze (zgarniając je, zanim zrobią to tradycyjni poszukiwacze zbierania, działając wstecz do wszystkich innych), ale jest znacznie bardziej selektywny w kwestii tego, które z nich bierze, chociaż nadal odbiera rzeczy w drodze powrotnej.
Efektem końcowym jest zachowanie wytrzymałości po drodze, przy jednoczesnym priorytetowym traktowaniu skarbów o wysokiej wartości, a następnie skorzystanie z głębokiego zwrotu i łatwego zbierania w drodze powrotnej. Od dawna wiadomo, że zbiera skarby aż z pokoju 41 (a podczas rozwoju wchodził, a następnie natychmiast opuszczał pokój 42).
źródło
Łowca nagród
Ta prosta metoda jest najlepsza. Chwyć cenne i lekkie skarby, wchodząc tak głęboko, jak to możliwe. W drodze powrotnej zdobądź mniej cenne skarby.
źródło
Waga lekka
Prosty bot, który nadal działa całkiem dobrze.
Po zapuszczeniu się do ruin (obecnie 21 pokoi) zdobędzie najlepszy skarb w pokoju, który ma tylko 1 kg (stąd nazwa bota) i jest cenniejszy niż najmniej cenny skarb w ekwipunku. Jeśli ekwipunek jest pełny, zrzuć najmniej wartościowy skarb. Jeśli nie zostanie wybrana żadna inna akcja, przejdź do ruin. Jeśli jesteśmy na granicy naszej wytrzymałości, aby móc wyjść żywo, skieruj się do wyjścia
źródło
dumping
wenter_ruins
metody. To faktycznie zapamięta to między grami i nie będzie działać w grze 2. Technicznie niedozwolone, ale właśnie dodałem regułę (wcześniej o tym zapomniałem, ale było to moim zamiarem), więc zmniejszyłem trochę luzu. : PMemorizer
Mogę przesyłać boty do własnego KotH, prawda?
Ten robot nurkuje w pokoju 30 i pamięta wszystkie skarby, które widział. W tym momencie rozpoczyna wędrówkę z powrotem do wejścia, próbując zdobyć dobre skarby, które pamiętał z wcześniejszych pokoi.
Miałem nadzieję, że będzie lepiej. Możliwe ulepszenia mogą wynikać z lepszego planowania i bycia bardziej dynamicznym w zakresie tego, w którym pokoju przestaje nurkować, oraz z chęci eksploracji opcji tworzenia kopii zapasowych.
Aktualizacja: teraz po drodze zgarnia 1 kg skarbów o wartości 60 USD lub więcej.
źródło
[Turn 072] Ryu Ridley (Memorizer) collapsed in the doorway to room #1 and died of exhaustion
Myśliciel
Myślę, że jest bardzo podobny do Memorizera, ponieważ wykorzystuje wiedzę o odwiedzonych pokojach, aby wybrać, które pokoje i skarby zebrać w drodze powrotnej do wyjścia, jednak zostało ono niezależnie uzyskane.
Ten bot biegnie do przypadkowego głębokiego pokoju, w którym zapisuje skarby znalezione po drodze. W pokoju docelowym zastanawia się nad wyborem skarbów, które można zabrać z powrotem do wyjścia. Przy każdej turze zastanawia się ponownie, aby ustalić najbardziej prawdopodobny wybór skarbów do zabrania.
Obecnie istnieje prosty algorytm (odwrotna moc liczby pokojów), który daje założoną liczbę zabranych skarbów (lub zostanie zabranych podczas wizyty przez tego bota) dla każdego pokoju, więc te skarby są ignorowane przy rozważaniu, które skarby / pokoje wziąć od. Mam pomysły na inne bardziej zaawansowane algorytmy do modelowania, które skarby pozostały. Ale będę musiał sprawdzić, czy korzyść jest tego warta.
źródło
Hoarder
Hoarder pozostaje w pokoju, dopóki nie zabierze wszystkich skarbów w pokoju (lub obliczy, że nie ma wystarczającej wytrzymałości, aby kontynuować przyjmowanie / poruszanie się). Kiedy wszystkie skarby znikną, jeśli bot będzie mógł bezpiecznie przejść dalej, zrobi to i będzie kontynuował proces zbierania całego skarbu.
źródło
Backwards
„s,Sprinter
” s iMemorizer
„s praca strategia; ponieważ wiedzą, jakie są względne wartości każdego skarbu, który widzą.Nurek
(W tej chwili nie można przetestować, więc daj mi znać, czy to jest zepsute).
Najlepszy skarb znajduje się głębiej w ruinach, więc zanurkuj głęboko, a następnie weź to, co możemy, wychodząc.
źródło
diving
zdefiniowane?Jacob the Orphan (Diver) was sliced in half by a swinging blade trap.
Nie jestem pewien, co zrobiłeś źle, ale to oznacza AFAIK „nieprawidłowy zwrot”.