Asymetryczny KOTH: Catch the Cat
AKTUALIZACJA : Pliki gist są aktualizowane (w tym nowe zgłoszenia), ponieważ plik Controller.java nie wychwytuje wyjątków (tylko błędy). Przechwytuje teraz błędy i wyjątki, a także je drukuje.
To wyzwanie składa się z dwóch wątków, to jest wątek łapacza, można znaleźć wątek kota tutaj .
Kontroler można pobrać tutaj .
Jest to asymetryczna KOTH: Każde poddanie jest albo kotem lub łapacza . Istnieją gry między każdą parą każdego kota i łapacza. Koty i łapacze mają osobne rankingi.
Łapacz
Na sześciokątnej siatce jest kot. Twoim zadaniem jest złapanie go tak szybko, jak to możliwe. W każdej turze możesz umieścić wiadro z wodą na jednej komórce siatki, aby kot nie mógł tam dotrzeć. Ale kot nie jest (może) głupi i za każdym razem, gdy umieścisz wiadro, kot przeniesie się do innej komórki siatki. Ponieważ siatka jest sześciokątna, kot może iść w 6 różnych kierunkach. Twoim celem jest otoczenie kota wiadrami z wodą, im szybciej, tym lepiej.
Kot
Wiesz, że łapacz chce cię złapać, umieszczając wokół ciebie wiadra z wodą. Oczywiście próbujesz uniknąć, ale ponieważ jesteś leniwym kotem (tak jak koty), robisz dokładnie jeden krok naraz. Oznacza to, że nie możesz pozostać w tym samym miejscu, co ty, ale musisz przenieść się do jednego z sześciu okolicznych miejsc. Ilekroć zobaczysz, że łapacz umieścił nowe wiadro z wodą, idziesz do innej komórki. Oczywiście starasz się unikać tak długo, jak to możliwe.
Krata
Siatka jest sześciokątna, ale ponieważ nie mamy heksagonalnych struktur danych, bierzemy 11 x 11
kwadratową tablicę 2d i naśladujemy sześciokątne „zachowanie”, które kot może poruszać się tylko w 6 kierunkach:
Topologia jest toroidalna, co oznacza, że jeśli wejdziesz na komórkę „na zewnątrz” tablicy, zostaniesz po prostu przeniesiony do odpowiedniej komórki po drugiej stronie tablicy.
Gra
Kot zaczyna od określonej pozycji na siatce. Łapacz może wykonać pierwszy ruch, następnie kot i jego łapacz wykonują naprzemienne ruchy, dopóki kot nie zostanie złapany. Liczba kroków to wynik tej gry. Kot stara się uzyskać jak najlepszy wynik, łapacz stara się uzyskać jak najniższy wynik. Średnia suma wszystkich gier, w których uczestniczyłeś, będzie wynikiem twojego zgłoszenia. Istnieją dwa osobne rankingi, jeden dla kota, drugi dla łapaczy.
Kontroler
Dany kontroler jest napisany w Javie. Jako łapacz lub kot, każdy z was musi w pełni zaimplementować klasę Java (istnieją już pewne prymitywne przykłady) i umieścić ją w players
pakiecie (i zaktualizować listę kotów / łapaczy w klasie Controller), ale można także napisać dodatkowe funkcje w tej klasie. Do kontrolera dołączone są dwa robocze przykłady prostych klas cat / catcher.
Pole to tablica 11 x 11
2D int
przechowująca wartości bieżących stanów komórek. Jeśli komórka jest pusta, ma wartość 0
, jeśli jest kot, ma wartość, -1
a jeśli jest wiadro, to jest 1
.
Istnieje kilka podanych funkcji, których możesz użyć: isValidMove()
/ isValidPosition()
służą do sprawdzania, czy twój ruch (kot) / pozycja (łapacz) jest prawidłowy.
Za każdym razem, gdy jest twoja kolej, twoja funkcja takeTurn()
jest wywoływana. Argument zawiera kopię bieżącej siatki i ma metody takie jak read(i,j)
czytanie komórki w (i,j)
, a także isValidMove()/ isValidPosition()
sprawdza poprawność odpowiedzi. To również zarządza zawijaniem topologii toroidalnej, co oznacza, że nawet jeśli siatka ma tylko 11 x 11, nadal możesz uzyskać dostęp do komórki (-5,13).
Metoda powinna zwrócić int
tablicę dwóch elementów, które reprezentują możliwe ruchy. W przypadku kotów {-1,1},{0,1},{-1,0},{1,0},{0,-1},{1,-1}
reprezentują one względną pozycję, w której kot chce iść, a łapacze zwracają bezwzględne współrzędne miejsca, w którym chcą umieścić wiadro {i,j}
.
Jeśli twoja metoda spowoduje nieprawidłowy ruch, Twoje zgłoszenie zostanie zdyskwalifikowane. Ruch uważa się za nieważny, jeśli w miejscu docelowym znajduje się już wiadro lub ruch jest niedozwolony / miejsce docelowe jest już zajęte (jako kot) lub jeśli istnieje już wiadro / kot (jako łapacz). Możesz to wcześniej sprawdzić za pomocą podanych funkcji.
Twoje zgłoszenie powinno działać dość szybko. Jeśli Twoja metoda trwa dłużej niż 200 ms dla każdego kroku, zostanie również zdyskwalifikowana. (Najlepiej znacznie mniej ...)
Programy mogą przechowywać informacje między krokami.
Zgłoszenia
- Możesz przesłać dowolną liczbę zgłoszeń.
- Nie zmieniaj znacząco przesłanych już zgłoszeń.
- Proszę o każde zgłoszenie w nowej odpowiedzi.
- Każde zgłoszenie powinno mieć swoją unikalną nazwę.
- Zgłoszenie powinno składać się z kodu twojej klasy oraz opisu, który mówi nam, jak działa zgłoszenie.
- Możesz napisać wiersz
<!-- language: lang-java -->
przed kodem źródłowym, aby uzyskać automatyczne podświetlanie składni.
Punktacja
Wszystkie koty będą rywalizować ze wszystkimi łapaczami tyle samo razy. Spróbuję często aktualizować bieżące wyniki, zwycięzcy zostaną wyłonieni, gdy aktywność spadnie.
To wyzwanie jest inspirowane starą grą flash
Dzięki @PhiNotPi za testowanie i udzielenie konstruktywnej opinii.
Aktualne wyniki (100 gier na parę)
Name Score Rank Author
RandCatcher 191674 8 flawr
StupidFill 214246 9 flawr
Achilles 76820 6 The E
Agamemnon 74844 5 The E
CloseCatcher 54920 4 randomra
ForwordCatcher 94246 7 MegaTom
Dijkstra 46500 2 TheNumberOne
HexCatcher 48832 3 randomra
ChoiceCatcher 43828 1 randomra
RandCat 77928 7 flawr
StupidRightCat 81794 6 flawr
SpiralCat 93868 5 CoolGuy
StraightCat 82452 9 CoolGuy
FreeCat 106304 3 randomra
RabidCat 77770 8 cain
Dijkstra's Cat 114670 1 TheNumberOne
MaxCat 97768 4 Manu
ChoiceCat 113356 2 randomra