Easter Egg Hunt
Bot znajdź jajko, zanim królik znajdzie jajko. Bot szczęśliwy.
Przegląd
To wyzwanie na szczycie wzgórza na cześć Wielkanocy i tradycji polowania na pisanki!
Twój bot ma wizję dwóch pól w każdym kierunku, w tym przekątnych, tworząc wokół siebie kwadrat 5x5, który możesz zobaczyć. Szuka jajek, a ten, kto znajdzie najwięcej jajek, wygrywa!
Tablica
Plansza będzie się składać z o
s, które są pisankami, #
s, które są ścianami, *
s, którzy są innymi graczami, i s, które są pustymi polami.
- Będzie to kwadrat o długości krawędzi
(number of entries) * 3
. - Będzie otoczony murami.
- Wewnątrz ścian będzie znajdować się losowo rozmieszczone ściany o linii prostej
#
, o losowej długości od 2 do 10 włącznie. Będzie(number of entries) * 3
ich. - Jaja zostaną następnie umieszczone losowo. Będą
(number of entries) * 4
ich i będą generowane tylko na pustych () kwadratach.
- Aby proces generowania płyty działał poprawnie, musi być co najmniej 7 wpisów.
Oto JSFiddle, który wygeneruje losową planszę do przetestowania. Oto przykład z (number of entries) = 7
:
#####################
# o ##
# # o ##
# #o ###### ##
###### # ##
## o # # ##
## o# #o# o o##
## #o # # o # #
## # o # # # #
## ## # # o # #
## # # o # # #
## # o # ## # # #
## # # # #
# o # ## # #
# o oo ##o #
#o ####### oo ## #
# # # #
# o o o# #
# o #### o o#
# #
#####################
Po wygenerowaniu planszy każdy gracz kładzie się na losowym polu (puste miejsce).
Wejście
Weźmiesz sześć wierszy danych wejściowych. Pierwsze pięć linii to twoje pole widzenia (spacje poza granicami planszy będą reprezentowane przez X
, a środkowa spacja zawsze będzie to *
Ty), a szósta linia będzie pusta (na początku).
Wynik
Wyprowadzisz trzy linie. Po pierwsze, kierunek, w którym chcesz się poruszać:
1 2 3
8 YOU 4
7 6 5
(9 to brak A
operacji, jeśli nie chcesz się ruszać), po drugie, jeden z ttack, C
ounter lub N
othing (zostanie to wyjaśnione wkrótce), a trzecia linia będzie miała dowolny ciąg długości do 1024 To będzie pamięć twojego bota. Możesz użyć go do wszystkiego, co chcesz, lub pozostawić puste. Pamięć ta będzie następnie szóstym wierszem danych wejściowych do programu przy następnym uruchomieniu.
Wszystkie dalsze wiersze danych wyjściowych są ignorowane, a jeśli jest tylko jeden wiersz, zakłada się, że drugi jest pusty.
W ruchu
Poniższy proces służy do określenia miejsca przeniesienia:
- Jeśli podczas ruchu skończysz na pustym polu (
), Twój gracz zostanie umieszczony na tym polu.
- Jeśli trafisz na ścianę (
#
), twój ruch zostanie zignorowany i stracisz swoją kolej. - Jeśli trafisz do jajka (
o
) lub gracza (*
), informacje te zostaną zapisane i zostaną wykorzystane po przeprowadzce wszystkich osób.
Po tym, jak wszyscy się przeprowadzą, niejasności zostaną rozwiązane.
Jeśli jest dwóch graczy, którzy wylądowali na tym samym polu, następuje walka! W tym miejscu pojawia się A
/ C
/ N
. A
ttack bije N
othing (normalny atak), N
othing bije C
ounter (nie można nic C
skontrować ), a ounter bije A
ttack (kontratak). Gracz, który wygra tę walkę, pozostaje na swoim polu, a gracz, który przegrywa, wraca do pierwotnego pola, na którym zaczął. W przypadku remisu obaj gracze wracają tam, gdzie byli.
Jeśli przegrywający lub remisujący gracz wróci do miejsca, w którym był, i tam jest inny gracz, nie będzie walki, a drugi gracz również powróci na swoje pierwotne pole. Jeśli na tym polu znajduje się inny gracz, ten gracz cofa się i to trwa, dopóki wszyscy gracze nie znajdą się na różnych polach.
Jeśli na jednym polu znajduje się trzech lub więcej graczy, wszyscy wracają do swoich pierwotnych pozycji.
Jeśli jakiś gracz nadal stoi na jajku ...
- Jeśli gracz wybierze
A
, jajko zostanie zniszczone. - Jeśli gracz wybrał
C
, nic się nie dzieje i gracz powraca do pierwotnego miejsca. - Jeśli gracz wybrał
N
, gracz podnosi jajko! Wynik gracza jest zwiększany o jeden, a jajko jest usuwane.
Języki
Możesz używać dowolnego języka, który jest swobodnie dostępny w systemach Windows, OSX i Linux, aby zapewnić uczciwość między uczestnikami. Jeśli kodu nie można swobodnie uruchamiać, ale można go skompilować lub spakować w formacie, który jest, proszę również podać ten format w swojej odpowiedzi. Najlepiej, jeśli możesz skompilować kod w bardziej popularnym języku (tj. CoffeeScript -> JavaScript), zrób to.
Punktacja
Twój wynik będzie średnią liczbą zebranych jaj z dziesięciu serii. Bieg kończy się, gdy wszystkie jajka zostaną zebrane lub gdy (number of entries * 25)
minie kolej. Ręcznie upewnię się, że możliwe jest dotarcie do wszystkich jaj dla każdej mapy (poprzez ciągłe generowanie map, aż wszystkie jajka będą dostępne).
Tablica wyników
Tablica wyników zostanie dodana, gdy zostaną spełnione wszystkie następujące warunki:
- Zgłoszono co najmniej siedem ważnych zgłoszeń z wynikiem pozytywnym lub zerowym (nie oceniono)
- Od utworzenia tego wyzwania minęło co najmniej 48 godzin (UTC 14:23)
Zasady nie zmienią się w tym okresie przedkonkursowym, z wyjątkiem dodania wyjaśnień w przypadku niejasności reguły. Po utworzeniu tablicy wyników zostanie tutaj opublikowany program testujący, abyś mógł przetestować swoje wpisy. Kod testowy jest wciąż w toku, ale można go odtworzyć i działa. Oto repozytorium GitHub.
źródło
9
, nigdy nie zostanie znacząco zaatakowany. Jeśli inny gracz (B) wejdzie na to pole gracza i wygra, A zostanie przeniesiony z powrotem na jego pierwotny kwadrat (który jest taki sam). Ale teraz dochodzi do starcia, ponieważ istnieją zarówno A, jak i B, więc B musi wrócić na swój własny kwadrat. Wynik jest więc niezależny od faktycznej walki, B zawsze wraca do początkowego pola, a A zawsze pozostaje na swoim miejscu. To pozwoliłoby mi napisać jedno i drugie, które mogłoby pomóc w kolejnym przesłaniu, blokując ścieżkę dla wszystkich innych.Odpowiedzi:
Cart'o'Gophers
Oto kolejne zgłoszenie - które w rzeczywistości ma być konkurencyjne. Znów jest w Ruby. Więc uruchom to
ruby cartogophers.rb
. Trwało to znacznie dłużej niż oczekiwano ...Ten robot pamięta to, co widział wcześniej i za każdym razem próbuje zbudować większą mapę. Następnie używa pierwszego wyszukiwania najbliższego jajka i głów w ten sposób. Jeśli na bieżącej mapie nie ma jajka, bot skieruje się do najbliższej otwartej krawędzi mapy (aby szybko rozwinąć mapę w kierunku, w którym nadal może się poruszać).
Ten bot nie ma jeszcze pojęcia o innych botach i strategii walki. Ponieważ nie znalazłem wiarygodnego sposobu na sprawdzenie, czy mój ruch się powiódł, może to powodować pewne problemy. Po prostu zawsze zakładam, że ruch się powiódł - więc jeśli nie było, nowe łaty zostaną załadowane na mapę w niewłaściwych miejscach, co może, ale nie musi być szkodliwe dla poszukiwania ścieżki.
Bot używa pamięci do przechowywania mapy i jej nowej pozycji na mapie (zakładając, że ruch się powiedzie). Mapa jest przechowywana bez podziałów linii, skompresowana i zakodowana w standardzie base64 (wraz z liczbą wierszy mapy, dzięki czemu można ponownie wstawiać podziały linii). Ta kompresja obniża rozmiar do około jednej trzeciej nieskompresowanej mapy, więc mając cień ponad 1000 bajtów, mógłbym przechowywać mapę około 3000 komórek, co z grubsza odpowiada w pełni eksploracji mapy z 18 botami. Tak długo, jak niewiele jest takich zgłoszeń, nie sądzę, żebym miał problem z ustaleniem rozwiązania tej sprawy.
Po kilku testach w stosunku do 5dumbbot
s i 1naivebot
(moje inne poddanie), albo wypadło naprawdę źle (jak 1 lub 2 jajka), albo przewyższyło pozostałe o znaczny margines (7 do 9 jaj). Mogę pomyśleć o lepszej strategii walki i o tym, jak ustalić, czy rzeczywiście się przeprowadziłem, czy nie. Oba mogą nieco poprawić wynik.Aha, a jeśli zastanawiasz się nad nazwą bota, powinieneś przeczytać The Order of The Stick ( ostatni panel tego komiksu ).
EDYCJA: Było kilka błędów w wykrywaniu krawędzi odkrytej mapy. Teraz, kiedy je naprawiłem, ten bot zawsze otrzymuje wyniki około
20
5dumbbot
s i 1naivebot
. Tak już lepiej! Jeśli teraz dodasz$stderr.puts map
do mojego bota, naprawdę możesz zobaczyć, jak systematycznie odkrywa mapę i tymczasem zbiera wszystkie jajka. Postanowiłem także wybraćA
zamiastN
nie wchodzić na jajko, aby zmniejszyć prawdopodobieństwo powrotu do oryginalnej komórki bota (co częściowo psuje mapę).(Nie radzi sobie tak dobrze w porównaniu z 6
naivebot
s, zwłaszcza, że bardzo możliwe jest, aby skończyć w „impasie” z innym botem, gdy obaj wielokrotnie chcą chwycić jajko i wybraćN
. Muszę o tym pomyśleć ... )źródło
Zajączek Java
Królik jeszcze nie skończył dorastać (wciąż planuję wprowadzić zmiany), ale na razie jest to punkt wyjścia. Szuka najbliższego jajka i podchodzi do niego. Nie ma jeszcze wykrywania ścian ani wykrycia poza granicami. Pójdzie po jajko, na które wyląduje, ale w przeciwnym razie spróbuje przepchnąć się i zaatakować cokolwiek innego. Jeśli w pobliżu nie będzie jaj, zacznie podążać za najbliższym króliczkiem. Mogą wiedzieć coś, czego on nie wie. W przeciwnym razie wybierze losowy kierunek. I jest całkiem zapominalski (bez użycia zmiennej pamięci).
Plany na przyszłość:
Aktualizacja 1 Mój króliczek będzie podążał za innymi króliczkami, jeśli nie zobaczy jajka. Zmieniono także kod „znajdź najbliższe jajko” na jego własną metodę.
źródło
N
aiveBot (w Ruby)Oto bardzo uproszczony bot, który zmusza do zrzucenia jaja (chcemy szybko uzyskać 7 zgłoszeń, prawda?). Mój Ruby nie jest bardzo idiomatyczny, więc ten kod może sprawić, że właściwi rubiści zaczną drżeć z bólu. Czytaj na własne ryzyko.
Uruchom z
ruby naivebot.rb
.Po prostu zapisuję kilka przypadków, w których jajko jest widoczne i nie jest zasłonięte przez ścianę. Nie chodzi nawet o najbliższe jajko, ale wybiera pierwszy ruch, który ma sens. Jeśli nie zostanie znalezione takie jajko, bot wykona losowy ruch. Pomija wszystkich innych graczy i nigdy nie atakuje ani nie kontratakuje.
źródło
WallFolower
(celowa gra słów) w Pythonie 3 :
Przechodzi do jajka, jeśli w zasięgu wzroku jest jajko, ale tylko wtedy, gdy jest ono bliżej tego jajka niż inny robot. Jeśli jest remis w oddali, i tak to pasuje. W przeciwnym razie podąża ściana LH (obecnie niezbyt dobrze wdrożona).
Nadal potrzebuje pracy na ścianie, ale i tak to opublikuję.
źródło
sys.exit(0)
naexit(0)
? Ponadto muszę nad tym popracować (w tej chwili zakłada się, że to ``), ale tak naprawdę nie mam czasu. Kiedy będę miał czas, przyjdę i to naprawię.