Wprowadzenie
Utknąłeś na bezludnej wyspie z kilkoma sługami i poszukujesz skarbów. Im dłużej ktoś szuka, tym więcej znajduje skarbu. Im mniej osób szuka, tym więcej znajdzie każda osoba.
Ze względu na ograniczone zapasy przywódca zdecydował, że kilka osób, do jednej czwartej grupy, pozostanie na śmierć każdej nocy. Postanowił nie mówić nikomu dokładnie, ilu ludzi umrze w danym dniu przed czasem.
Masz kontrolę nad niewielką grupą 5 osób, które wyruszą z obozu, aby znaleźć dla ciebie skarb.
Cel
Celem tego konkursu jest zgromadzenie jak największej ilości skarbów. Za każdym razem, gdy twoi słudzy nie podejmą próby powrotu do obozu, znajdą określoną liczbę skarbów. Twoi słudzy mogą wrócić do obozu o różnych porach.
Za każdym razem, gdy robotnik przebywa w poszukiwaniu skarbu, robotnik znajduje 1+R
skarby, w których R
jest liczba robotników (spośród wszystkich botów), którzy są już w obozie. Martwe boty nie uwzględniają tego obliczenia.
Na początku każdego dnia zostanie wybrana losowa liczba ( n
) od 2
do max(3, floor(num_live_players/4))
. (W przypadku 10 graczy w dniu 1 jest 2
to możliwemax(3,50/4)=12
. Przez 20 graczy na dzień 1, byłoby to 2
do max(3,100/4)=25
). Ta liczba oznacza liczbę graczy, którzy będą pozostawione na śmierć w tym dniu, a nie zostaną podane do programu .
Jeśli sługa jest jednym z ostatnich n
osób, które powrócą, umrze i nie będzie w stanie przenieść znalezionego skarbu na twój własność. Ponadto sługa nie będzie mógł uczestniczyć w poszukiwaniu skarbów przez resztę przygody.
Twój końcowy wynik to średnia ilość skarbu, którą zdobyłeś na przygodę (przebieg kontrolera).
Jeśli więcej osób spróbuje wrócić do obozu w tej samej turze, niż jest dostępnych wolnych miejsc, losowe liczby określą, kto wchodzi i kto umiera.
Dzień na tej wyspie od wschodu do zachodu słońca trwa 30 tur. Ponieważ w nocy jest wiele niebezpiecznych zwierząt, brak powrotu przed zachodem słońca oznacza, że nie zostaniesz wpuszczony do obozu.
Wejście wyjście
Twój program powinien działać przez całą symulację.
Na początku symulacji INDEX I
zostanie wprowadzony, gdzie I
jest indeks twojego bota (ten indeks jest liczony od 1 w górę).
Na początku każdego dnia START_DAY D/N
zostanie wprowadzony do twojego programu, gdzie D
jest numer dnia (począwszy od 1
), i N
jest równy max(3, floor(num_live_players/4))
, co jest maksymalną liczbą osób, które mogą umrzeć w tym konkretnym dniu.
Na początku każdej tury START_TURN T
zostanie wprowadzony do twojego programu, gdzie T
jest numer tury (od1
).
Gdy twój program to otrzyma, powinien odpowiedzieć listą ruchów twoich sług, oddzielonymi przecinkami.
Prawidłowe ruchy to:
R
: Spróbuj wrócić do obozu.S
: Szukaj skarbu.N
: Sługa już nie żyje lub jest w obozie.
Wprowadzenie nieprawidłowego ruchu będzie interpretowane tak, S
jakby bot żył, a nie w obozie, i N
inaczej.
Na koniec każdej tury ciąg zostanie przekazany do twojego programu:
END_TURN [Turn #] [Bot 1 Moves] [Bot 2 Moves] ...
gdzie ruchy każdego bota są oddzielone przecinkami.
Te ruchy będą jednym z następujących:
R
: Pomyślnie wrócił do obozu w tej turze.r
: Nie udało się wrócić do obozu w tej turze.S
: Wciąż szukam skarbu.D
: Zmarł we wcześniejszej turze.N
: Już wróciłem do obozu.
Boty i słudzy pozostają w tej samej kolejności przez całą symulację.
Na przykład:
INDEX 2
....
END_TURN 8 N,N,N,N,N r,r,r,r,D D,D,D,N,R S,D,D,N,D
Jesteś drugim botem ( r,r,r,r,r
), który próbował zwrócić wszystkich czterech służących, którzy wciąż żyją (i niestety nie udało im się wszystkich czterech). Słudzy Bota 1 wszyscy wrócili do obozu. Bot 3 ma trzech martwych sług, jeszcze jednego z powrotem w obozie i piątego służącego, któremu udało się powrócić. Bot 4 ma jednego sługę, który został (i umrze, ponieważ jest to ostatnia kolejka dnia), jednego sługę w obozie i trzech martwych sług.
Po każdym z tych ciągów, o ile nie zostanie również wypisany ciąg znaków sygnalizujący koniec dnia (patrz poniżej), twój program ma wypisywać kolejne ruchy twoich sług, oddzielone przecinkami. Wszyscy słudzy muszą zostać rozliczeni ( N
jeśli jest już w obozie, a D
jeśli już nie żyje). Nieprawidłowe ruchy będą traktowane tak, S
jakby sługa nie był jeszcze w obozie / martwy. Przykład:
N,N,S,S,R
co znaczy:
Servant # | Action
1 | Do nothing.
2 | Do nothing.
3 | Stay put (keep looking for treasure).
4 | Stay put (keep looking for treasure).
5 | Try to return to camp.
Pod koniec dnia po sznurku ostatniej tury zostanie przekazany następujący ciąg END
informujący wszystkich o tym, kto żyje:
END_DAY [Day #] [Bot 1 Status] [Bot 2 Status]
gdzie status to oddzielona przecinkami lista A
(żywych) lub D
(martwych). Następny dzień zaczyna się natychmiast po.
Symulacja kończy się, gdy jest mniej niż 6 żywych sług. Twój program otrzyma następujące dane wejściowe na końcu symulacji:
EXIT
Zasady / Szczegóły
- Tylko na turach, w których jest twoja akcja
S
, znajdziesz skarb. - Liczba uruchomionych symulacji: 1000 razy
- Twój program nie powinien zająć więcej niż 1 sekundę na określenie ruchów.
- Twój program nie powinien wyjść wcześniej; rozpocznie się dokładnie raz.
- Upewnij się, że bufor wyjściowy (jeśli dotyczy) jest opróżniany po każdym wyjściu.
- Pliki mogą być zapisywane w folderze twojego bota (
./players/BotName/
). Nazwa twojego bota to jakkolwiek nazwiesz swojego bota, ze wszystkimi niealfanumerycznymi znakami usuniętymi i zapisanymi w CamelCase. Wpisy mogą zapisywać dane między przebiegami sterownika, ponieważ przebiegi są wykonywane sekwencyjnie. - Twój program musi wyjść po otrzymaniu
EXIT
. - Programy, które nie skompilują się lub nie wyrzucą błędów lub nie wyświetlą niepoprawnego tekstu (nie w formacie 5 znaków oddzielonych przecinkami) mogą zostać wykluczone z konkursu. Nowa linia musi następować po każdym wyjściu.
- Kontroler można znaleźć na GitHub .
Podaj nazwę bota, język + wersję, kod i polecenie, aby skompilować (jeśli dotyczy) i uruchomić bota.
Przykład
Tekst wyprowadzany przez program jest tu poprzedzony znakiem >
. Twój program nie powinien wypisywać tego znaku.
INDEX 2
START_DAY 1/3
START_TURN 1
>S,S,S,S,S
END_TURN 1 S,R,S,S,S S,S,S,S,S
START_TURN 2
>S,S,S,S,S
END_TURN 2 S,N,S,R,S S,S,S,S,S
START_TURN 3
>R,R,S,S,S
END_TURN 3 R,N,R,N,R R,R,S,S,S
START_TURN 4
>N,N,S,S,S
END_TURN 4 N,N,N,N,N N,N,S,S,S
START_TURN 5
>N,N,R,R,R
END_TURN 5 N,N,N,N,N N,N,r,r,R
END_DAY 1 A,A,A,A,A A,A,D,D,A
START_DAY 2/3
START_TURN 1
>S,S,N,S,N
END_TURN 1 R,R,R,R,R S,S,D,D,N
END_DAY 2 A,A,A,A,A D,D,D,D,D
EXIT
Wyniki dla powyższego przykładu są następujące:
Bot# Day 1 Day 2 Total
1 10 0 10
S1 1+2 0 3
S2 0 0 0
S3 1+2 0 3
S4 1 0 1
S5 1+2 0 3
2 20 0 20
S1 1+2 0 3
S2 1+2 0 3
S3 0 0 0
S4 0 0 0
S5 1+2+3+8 0 14
Zwycięzcą zostaje więc gracz, bot 2. Pamiętaj, że zwycięzca nie musi przeżyć do absolutnego końca. (Pamiętaj również, że gracz mógł pozostać do 30 rundy pierwszego dnia, ponieważ obóz nie byłby pełny, dopóki gracz nie odeśle jeszcze jednego bota).
Wyniki
Bot Score
Bob 2939.422
Statisticians 2905.833
Morning Birds 1652.325
Evolved 1578.285
Slow Returners 1224.318
Wandering Fools 1065.908
Randomizers 735.313
Drunkards 0
Plague 0
Dzienniki są dostępne na GitHub . Wyniki poszczególnych prób są dostępne w tym arkuszu kalkulacyjnym Google .
źródło
Odpowiedzi:
Bob - C ++
Kompilować:
Biegać:
źródło
Statystyka, Python 3
Statystyki zawsze pracują razem. W pierwszej turze wracają do obozu, gdy zrobiły to dwie trzecie przeciwników. W kolejnych turach polegają na danych zebranych w poprzednich turach, aby przewidzieć nawyki innych służących i spróbować wrócić do obozu w ostatniej bezpiecznej chwili.
Program
Jak widać bezwstydnie ukradłem strukturę programu @Mike Sweeney.
Komenda
EDYCJA: Naprawiono błąd w czeku na powrót do domu. Powinny teraz działać nieco lepiej.
EDYCJA 2: Statystyki są teraz mądrzejsze niż wcześniej: śledzą, którzy słudzy wrócili do obozu w bieżącym dniu i odpowiednio dostosowują swoje prognozy. Ponadto podejmują większe ryzyko, wracając do obozu, gdy pozostanie 3/4 maksymalnej liczby umierających sług. To popycha ich z powrotem na szczyt (ledwo; Bob stał się bardzo niebezpieczny).
źródło
Pijacy, Perl 5
Trochę za dużo alkoholu i nigdy nie znajdą drogi do obozu.
Ten wpis jest przede wszystkim przykładem, ale będzie brać udział.
Program
Komenda
źródło
$status[$i] eq 'A' ? 'S' : 'D';
powinien$status[$i] eq 'A' ? 'S' : 'N';
spełniać specyfikację?Poranne Ptaki
Kto rano wstaje temu Pan Bóg daje!!!
Edycja: Stworzono go, aby każdy mógł go łatwo podklasować. Po prostu przedefiniuj
doMove(int playerNumber)
swojego bota. Dodałem kilka pomocnych pól i metod. Dokładnie go przetestowałem. To nie nie zapisywać stany z poprzednich symulacji. Powiedz mi, czy są jakieś problemy.Połącz z:
javac ./players/MorningBirds/MorningBirds.java
Biegnij z:
java players.MorningBirds.MorningBirds
źródło
R
) w danym dniu, zawsze umiera tego dnia.Randomizery - Ruby
Aby zepsuć boty oparte na statystykach, randomizatory są dość nieprzewidywalne. Wszyscy wracają od razu, losowo, próbując osierocić innych.
(Nie ma wpływu na innych graczy.)
źródło
Wędrujący głupcy, Python 2
Jest to prosty bot Pythona, który wysyła służących, aż do osiągnięcia ustawionego czasu „gobacka”, a następnie próbują wejść do obozu i zostać do następnego dnia.
Jest to również podstawowa platforma dla bardziej złożonych botów, z których inni mogą chcieć korzystać. Nie jest to jednak testowane w silniku sędziego, więc daj mi znać, jeśli popełniłem błąd.
Program
Komenda
Edycja: Zmieniono kod decydujący o akcji po wyjaśnieniu reguły.
źródło
Ewoluował
Użyłem programowania genetycznego (przez JGAP), aby stworzyć tego bota. Wyszedł z prostą odpowiedzią, która bije wszystkie inne (ledwo).
Połącz z:
javac players/Evolved/Evolved.java
Biegnij z:
java players.Evolved.Evolved
Edycja: Grrr ... Bob pomieszał mnie !!!
Edycja: Yay !!! Bob, został zabity przez paskudną zarazę !!!
źródło
SlowReturners - Ruby
Odsyła jednego sługę co 5 tur.
źródło
Plaga
Dżuma jest chorobą. To nie jest racjonalne. To jest przewidywalne. Choroby nie mogą zbierać skarbów, nie dbają też o skarb. Zaraza powoduje choroby u innych graczy. Mądrzy zostają w domu i zapominają o skarbie. Głupi są zawsze głupi i nigdy nie zdobędą wiele skarbów. Ewolucja jest (na szczęście) odporna na zarazę. On też jest mądry. Idzie i zbiera skarb, i nie umiera.
Połącz z:
javac players/Plague/Plague.java
Biegnij z:
java players.Plague.Plague
Bob i statystycy są teraz odporni na zarazę.
źródło