Jesteś globusem szlamu. Oczywiście, będąc szlamem, chcesz przesiąkać jak najwięcej powierzchni. Ale są jeszcze 3 inne szlamy, które chcą zrobić dokładnie to samo. Kto będzie lepszym szlamem?
Opis
Wszystkie szlamy zostaną zebrane w jedną arenę. Sędziowie (tj. Program kontrolny) przejrzą wyczerpującą listę wszystkich możliwych kombinacji 4-szlamowych, umieszczą je na rogach stołu i zobaczą, który szlam wydziela się na największym obszarze.
Twoje szlamy mogą wykonywać jedną z 3 akcji w każdej turze: rozłożyć, skakać lub łączyć. Dalszy opis ich znaczenia zostanie podany w części Wyjście .
Board / Arena
Arena będzie kwadratową planszą (obecnie 8x8, ale może się to zmienić w przyszłości). Oto przykładowa arena trwającej gry:
11111222
11111444
11.22444
.1222.4.
333.3244
33333.44
333...44
333....4
Szlam jest reprezentowany przez liczby od 1 do 4 (gracze od 1 do 4), a puste miejsce jest reprezentowane przez kropkę ( .
). Początkowo plansza zaczyna się od pustej przestrzeni z wyjątkiem jednej jednostki szlamu gracza 1 w lewym górnym rogu, gracza 2 w prawym górnym rogu, gracza 3 w lewym dolnym rogu i gracza 4 w prawym dolnym rogu.
Współrzędne są reprezentowane przez indeks wierszy i kolumn oparty na 0, dla czytelności w kodzie. Na przykład współrzędne (3, 6) reprezentują 7. kwadrat w 4. rzędzie (w powyższym przykładzie a 4
). (Ułatwia to dostęp do kwadratów:. board[coords.x][coords.y]
) Oto wizualna ilustracja:
(0, 0) (0, 1) (0, 2)
(1, 0) (1, 1) (1, 2)
(2, 0) (2, 1) (2, 2)
Wejście
Dane wejściowe twojego programu będą to, kim jesteś (1, 2, 3 lub 4), przecinek ( ,
), a następnie zawartość planszy / areny (z nowymi liniami zastąpionymi przecinkami). Na przykład, jeśli byłeś graczem 3 w powyższym scenariuszu, Twój wkład byłby następujący:
3,11111222,11111444,11.22444,.1222.4.,333.3244,33333.44,333...44,333....4
Wynik
Twój program musi wypisać 4 liczby całkowite. Pierwsze dwa to odpowiednio indeks wiersza i kolumny szlamu, który chcesz przenieść, a następne dwa to indeks wiersza i kolumny, w którym chcesz je przenieść.
W każdej turze masz do wyboru trzy opcje: Rozłóż, skacz lub scal.
Rozpiętość
Aby rozprzestrzeniać się, współrzędne celu muszą znajdować się dokładnie o jeden kwadrat od przesuwanego szlamu, a kwadrat na współrzędnych celu musi być pustym miejscem. Podczas rozprzestrzeniania powstaje nowy szlam na współrzędnych docelowych, a stary szlam nie jest usuwany. Po utworzeniu nowego szlamu wszystkie wrogie szlamy na 8 polach wokół tego nowego szlamu są konwertowane na gracza, który się poruszył.
Na przykład, jeśli plansza na ryc. 1, jeśli gracz 1
0 1 1 2
miałby generować , wynikiem byłaby plansza na ryc. 2.1. 2. 11.22 11.12 1..22 1.112 ..22. ..11. ..... .....
Skok
Aby skoczyć, współrzędne celu muszą znajdować się dokładnie dwa kwadraty od przesuwanego szlamu, a kwadrat na współrzędnych celu musi być pustym miejscem. Podczas rozbijania powstaje nowy szlam na współrzędnych docelowych, a stary szlam jest usuwany. Po utworzeniu nowego szlamu wszystkie wrogie szlamy na 8 polach wokół tego nowego szlamu są konwertowane na gracza, który się poruszył.
Na przykład, jeśli plansza na ryc. 1, jeśli gracz 1
0 1 2 3
miałby generować , wynikiem byłaby plansza na ryc. 2.1. 2. 11..2 1...2 1...2 1...1 ....2 ...11 ...22 ...11
Łączyć
Aby się połączyć, współrzędne celu muszą znajdować się dokładnie o jeden kwadrat od przesuwanego szlamu, a kwadrat przy współrzędnych celu musi być śluzem tego samego gracza. Podczas łączenia stary szlam jest usuwany. Następnie wszystkie puste miejsca na 8 polach wokół docelowego szlamu są konwertowane na gracza, który się poruszył (nie wliczając przenoszonego starego szlamu).
Na przykład, jeśli plansza na ryc. 1, jeśli gracz 1
0 1 1 2
miałby generować , wynikiem byłaby plansza na ryc. 2.1. 2. 11..2 1.112 1.1.2 11112 ....2 .1112 ..222 ..222
Możesz także przekazać, po prostu wysyłając nieprawidłowe współrzędne (np. 0 0 0 0
).
Zasady i ograniczenia
Dodatkowe zasady to:
- Możesz odczytywać i zapisywać pliki we własnym folderze, aby zachować dane (zgłoszenia będą przechowywane
players/YourBotName/yourBotName.language
), ale nie możesz modyfikować ani uzyskiwać dostępu do niczego poza nim. Dostęp do Internetu jest zabroniony. - Twoje zgłoszenie może nie zostać zakodowane specjalnie w celu pomocy lub zranienia innego zgłoszenia. (Możesz mieć wiele zgłoszeń, ale nie mogą one w żaden sposób współdziałać ze sobą w żaden sposób).
- Zgłoszenie nie może zająć więcej niż 0,1 sekundy na turę. Jeśli od czasu do czasu przesłanie trwa 0,105 sekundy, to dobrze, ale może nie trwać znacznie dłużej niż ten limit czasu. (Jest to głównie kontrola poczytalności, aby uniknąć zbyt długiego testowania).
- Twoje zgłoszenie nie może być dokładnym duplikatem (tj. Używać tej samej logiki) innego, nawet jeśli jest w innym języku.
- Twoje zgłoszenie musi być poważnym przesłaniem. Jest to oparte na opiniach, ale jeśli twoje zgłoszenie wyraźnie nie próbuje rozwiązać wyzwania (np. Jeśli zdasz co turę), zostanie zdyskwalifikowane.
Jeśli Twoje zgłoszenie łamie którekolwiek z tych zasad lub nie wynika ze specyfikacją, zostanie zdyskwalifikowany, usunięty z playerlist.txt
, a gra uruchomi się ponownie od początku. Jeśli Twoje zgłoszenie zostanie zdyskwalifikowane, zostawię komentarz do Twojego wpisu wyjaśniający dlaczego. W przeciwnym razie zgłoszenie zostanie dodane do tablicy wyników. (Jeśli nie widzisz swojego zgłoszenia na tablicy wyników, nie masz komentarza wyjaśniającego do swojego postu i opublikowałeś swoje zgłoszenie przed upływem czasu „Ostatnia aktualizacja” poniżej, proszę powiedz mi! Mogłem go przypadkowo przeoczyć).
W swoim wpisie proszę podać:
- Imię.
- Polecenie powłoki, aby uruchomić program (na przykład
java MyBot.java
,ruby MyBot.rb
,python3 MyBot.py
, itd.).- Zauważ, że dane wejściowe (odtwarzacz i mapa) zostaną do tego dołączone jako argument wiersza poleceń.
- Programy będą testowane na Ubuntu 14.04, więc upewnij się, że Twój kod może być na nim uruchamiany (swobodnie).
- Numer wersji, jeśli kod działa inaczej w różnych wersjach języka.
- Kod twojego bota.
- Instrukcje, jak skompilować kod, jeśli to konieczne.
Kod kontrolera / testowanie, przykładowy bot
Kod kontrolera jest napisany w C ++ i można go znaleźć na Github . Dalsze instrukcje dotyczące uruchamiania i testowania kodu można znaleźć tutaj.
simplebot.rb
, bardzo prosty bot, który co turę rozprzestrzenia lub przeskakuje losowy szlam do losowej lokalizacji, jest również publikowany na Github .
Punktacja i liderów
Gdy wszystkie kwadraty na planszy zostaną wypełnione, gra się kończy i obliczane są wyniki. Ostateczny wynik gracza to liczba kwadratów, które zawierają śluz na końcu gry. Jeśli minęło 2000 tur (500 dla każdego gracza), a gra wciąż się nie kończy, gra i tak się zakończy, a wyniki zostaną zgłoszone, jakby gra się zakończyła.
Na koniec turnieju wyniki ze wszystkich gier zostaną uśrednione, aby obliczyć końcowy wynik każdego gracza, który zostanie opublikowany na tablicy wyników. Nie ma terminu składania wniosków; Będę okresowo aktualizować tabelę wyników, gdy pojawią się nowe zgłoszenia.
Wymagane są 4 zgłoszenia, aż pojawi się prawdziwa tabela wyników.
+--------------------------+-----------+--------------------+
| Name | Avg Score | Last Updated (UTC) |
+--------------------------+-----------+--------------------+
| GreedySlime | 47.000 | Jul 22 10:27 PM |
| Jumper | 12.000 | Jul 22 10:27 PM |
| ShallowBlue | 5.000 | Jul 22 10:27 PM |
| Lichen | 0.000 | Jul 22 10:27 PM |
+--------------------------+-----------+--------------------+
Ostatnia aktualizacja: 22 lipca 22:27 (UTC).
źródło
Odpowiedzi:
GreedySlime
Po prostu wykonuje ruch, który daje największy zysk netto jednostek szlamu.
Zauważ, że jest napisany w Pythonie 2.x .
Przykład uruchomienia (korzystając z przykładu podanego w opisie wyzwania i zakładając, że kod zostanie zapisany w pliku o nazwie
slime.py
):źródło
Shallow Blue
Płytki niebieski próbuje dowiedzieć się, co może się wydarzyć w przyszłości, wykonując
n wyczerpująceprzeszukiwanie drzewa możliwych ruchów, niestety nie dociera on dalej niż do następnej tury. Po następnej turze klepie po połowie wynik na każdym możliwym stanowisku, oblicza wynik dla każdej gałęzi z równie niedorzeczną formułą i: voila, idealny ruch jest znany!EDYCJA: Oryginalny kod działał zbyt wolno, więc zmodyfikowałem go tak, aby pobierał losową próbkę wszystkich możliwych ruchów. Spróbuje wykonać prawie wszystkie ruchy, gdy możliwe są małe ruchy, i mniejszy procent, gdy jest możliwe więcej ruchów.
źródło
Skoczek
Lubi skakać, tym bardziej w kierunku środka.
Przejdzie, jeśli żaden szlam nie będzie mógł skoczyć.
C ++ , Powinien po prostu się skompilować
g++ jumper.cpp -o jumper
Przepraszam, ukradłem weryfikację twojego ruchu. Zrezygnowałem też z prawidłowych praktyk kodowania zaraz po uruchomieniu, więc nie patrz. Wydaje się jednak, że działa na dowolnym rozmiarze płyty.
źródło
DeathSlime :
Opis : Próbuje upolować najsłabszego wroga i zniszczyć go. Powtarzać.
Jak uruchomić : ruby DeathSlime.rb
Wersja Ruby : 2.1.2
źródło
Porost
Jest to bot napisany w języku R. Należy go uruchomić za pomocą
Rscript Lichen.R
.Algorytm ma na celu zasłonięcie prostokątnego obszaru (wypełnienie pustego miejsca za pomocą
spread
). Po ukończeniu prostokątamerges
dwa szlamy w jednym z jego narożników (tym najbardziej oddalonym od narożnika planszy) rozszerzają obszar „nadający się do zamieszkania”, a następnie wypełniają nowo zdefiniowany prostokąt itp. Nie używajump
.Jeśli wróg znajduje się w obszarze mieszkalnym, a także w tym obszarze jest pusta przestrzeń, wypełnia pustą przestrzeń obok niej. Jeśli śluz, który powinien zostać scalony podczas powiększania obszaru zamieszkałego, jest otoczony przez wrogów, jeden szlam po prostu
spread
zamiast tego się połączy.źródło
0 0 0 0
gdy na pokładzie nie pozostanie śluz.CornerSlime
Ten szlam ma pojęcie narożników, a przynajmniej tak było, kiedy pisałem go po raz pierwszy w C #, nie jestem już pewien.
Napisany w C ++ prawdopodobnie skompiluje się dobrze z gcc i nie będzie żadnych argumentów; mam nadzieję, że przypadkiem nie użyłem niczego specyficznego dla MSVC.
Testowany wyłącznie na sobie na zmodyfikowanym serwerze (bez fantazyjnego nowego kompilatora C ++ tam, gdzie jestem), więc nie mam pojęcia, jak będzie działać, mam nadzieję, że nie zostanie zdyskwalifikowany za zbyt wolne. Ten bot nie ma obecnie losowości, ale mogę dodać trochę później.
To jest C # przeniesiony do C ++ (z powodu problemów z prędkością) przez kogoś, kto tak naprawdę nie zna C ++ i jest przerażający. Zaczyna się od zbudowania tablicy komórek, którą następnie wypełnia wszelkiego rodzaju nieprzydatnymi informacjami o otaczających ją komórkach (liczba moich komórek, liczba moich szlamów, tego typu rzeczy). Następnie wykorzystuje te informacje, aby zdecydować, czy musi przyjrzeć się bliżej informacjom, które wykorzystał do ich utworzenia, a następnie potencjalnie wykorzystuje te informacje do uzyskania znaczących wyników.
źródło