Witamy w Code Bots 2!
Nauczyłeś się tej lekcji od ostatnich botów Code. Próbowałeś wymyślić więcej sposobów dopasowania większej liczby akcji w mniejszej liczbie linii, a teraz w końcu to masz. Stworzysz Code Bot sterowanego zdarzeniami.
Twój bot musi składać się z 24 linii. Każda linia ma jeden z dwóch formatów:
Condition:Action
lub
Action
Twój bot posiada również wystarczającą pamięć do przechowywania liczb całkowitych 5 nazwanych A
przez E
. Liczba całkowita może przechowywać wartości od 0 do 23.
W każdej turze wykonasz linię C
, chyba że jeden z warunków jest spełniony. Jeśli tak, wówczas C
będzie zawierał numer wiersza warunku, który jest prawdziwy, a następnie wiersz zostanie wykonany. Pod koniec każdej tury C
będą zwiększane.
Dostępne są warunki:
Start
dotyczy tylko pierwszej tury. Musisz to mieć w swoim kodzie dokładnie razBotAt(N)
jest prawdą, jeśli w miejscu zdefiniowanym przez N znajduje się botEquals(A,B)
jest prawdziwe, jeśli A jest równe B. Mogą być różnych typów, jeśli tak, to nie będą równe.Modified(A)
jest prawdziwe, jeśliA
zostało skopiowane podczas ostatniej tury.A
musi być nazwą zmiennej, linią lub warunkiemAny(C1,C2,...)
jest prawdziwe, jeśli spełniony jest dowolny z warunkówNone(C1,C2,...)
jest prawdziwe, jeśli żaden z warunków nie jest spełnionyAll(C1,C2,...)
jest prawdziwe, jeśli wszystkie warunki są spełnioneNot(C)
jest prawdziwe, jeśli C jest fałszywe.C
musi być warunkiem.
Zmienne mogą mieć jeden z następujących formatów. Pierwszych 9 jest numerycznych i można z nich korzystać za każdym razem, gdy na tej stronie użyto N.
A
,B
,C
,D
,E
- Liczba od 0 do 23
This
zwróci numer linii, na której się aktualnie znajdujeAdd(N1,N2,...)
zwróci sumę wszystkich wartościSub(N1,N2)
zwróci N1 minus N2Mult(N1,N2,...)
zwróci iloczyn wszystkich wartościDiv(N1,N2)
zwróci N1 podzielone przez N2Mod(N1,N2)
zwróci N1 mod N2OVar(N)
zaakceptuje nazwę zmiennej i zwróci zmienną przeciwnikaLine(N)
zwróci N-tą linię w twoim kodzieType(N)
zwróci N-ty typ linii w twoim kodzie (typy to nazwy akcji)Cond(N)
zwróci warunek w N-tej liniiCondType(N)
zwróci typ warunku w N-tej linii (typy to nazwy warunków)OLine(N)
zwróci N-tą linię w kodzie przeciwnikaOType(N)
zwróci N-ty typ linii w kodzie przeciwnikaOCond(N)
zwróci warunek w N-tej liniiOCondType(N)
zwróci typ warunku w N-tej linii
A
i B
są do użytku osobistego, C
służą do określania, która linia ma zostać wykonana w kodzie i D
służy jako kierunek. Każda wartość D
odnosi się do innej pary kwadratów i kierunków. E
za każdym razem tworzy losową wartość. D
i E
zostanie zainicjowany na losową wartość, w przeciwnym razie 0
.
Zastosowany kierunek będzie [North,East,South,West][D%4]
. Twój przeciwnik jest botem na bezpośrednim polu w tym kierunku.
Dostępne są 4 akcje:
Move
przesunie cię o 1 pole do przodu w tymD
kierunku. Jeśli jest tam bot, nie będziesz się ruszać.Copy(A,B)
skopiuje zmiennąA
doB
.B
nie może być wartością liczbową, z wyjątkiem nazwy zmiennej.A
iB
nie mogą być różnych typów. Kopiowanie linii nie kopiuje warunku.Flag
nic nie robi. Bot z największą liczbą flag w twoim kodzie dostanie punkt. Bot z największą liczbą punktów wygrywa.If(C,L1,L2)
wykona wiersz,L1
jeśliC
jest prawdą, w przeciwnym razie wykonaL2
.C
jest warunkiemL1
iL2
musi być liniami.
Wielkie zdjęcie
50 kopii każdego bota zostanie umieszczonych na świecie. Twoim celem jest doprowadzenie flagi do jak największej liczby botów. Za każdego bota, który ma więcej typów flag niż jakikolwiek inny typ flagi, otrzymasz punkt.
Boty zostaną umieszczone w następujący sposób:
B...B...B...B...
..B...B...B...B.
B...B...B...B...
Rozegranych zostanie 10 gier, a punkty zostaną uśrednione we wszystkich grach, określając, kto jest zwycięzcą.
Notatki dodatkowe
Jeśli ma zastosowanie wiele warunków, Start
zostanie wykonany ten, który nastąpi bezpośrednio
Boty będą ściśle zapakowane, ale nie zaczniesz sąsiadować z innym botem. (Technicznie będzie to ten sam format, co ostatnie CodeBots)
Ponieważ to wyzwanie nie zostało opublikowane w piaskownicy (aby dać nikomu przewagę), zastrzegam sobie prawo do zmiany drobnych szczegółów w celu zapewnienia uczciwości lub dodatkowych możliwości. Ponadto, jeśli w programie Run CodeBots występuje błąd, zmienię go, nawet jeśli bot odniósł sukces. Staram się być jak najbardziej sprawiedliwy .
If
Instrukcje rekurencyjne nie będą wykonywane
Jeśli twój bot ma mniej niż 24 linie, pozostałe linie zostaną wypełnione Flag
Pamiętaj, gdy kopiujesz do własnego C
, który C
jest zwiększany pod koniec twojej tury.
Interpretator CodeBots można znaleźć tutaj . Zawiera plik .jar dla łatwego wykonania. Po prostu dodaj swojego bota do folderu botów
Wyniki
- 893,9 Borg
- 1.3 Leniwy
- 0,9 obrońca
- 0,5 Flagger
- 0.4 CliqueBot
- 0.4 Podstępny
- 0.3 Atakujący
- 0,3 Gard
- 0.3 SingleTarget
- 0.2 FreezeBot
- 0.2 Sentinel
- 0.2 Driveby
- 0.0 Przeciwnie do podejrzeń
- 0.0 MoveBot
- 0,0 CliqueBorg
- Kalkulator 0,0
- 0.0 TestBot
- 0.0 Imitator
AKTUALIZACJA
Linie kodu są teraz obracane podczas przeglądania kodu przeciwnika. Oznacza to, że linia 1 przeciwnika może być linią 14 (lub dowolną linią). Bot będzie miał stałe przesunięcie, które spowoduje przesunięcie jego linii o X
kwotę, gdy ogląda go przeciwnik . C
Zmienna przeciwnika również zostanie zrównoważona o tę samą X
kwotę. X
nie zmieni się w tej samej grze, ale zmieni się z gry do gry.
źródło
Odpowiedzi:
Borg
Przekształca wszystkie inne boty w klony samego siebie. Opór jest bezcelowy.
Edycja: Mała poprawka, aby zresetować A, jeśli przeciwnik poruszy się, zanim skończę z nim. Wydaje się, że nie wpływa to na wynik, ale sprawia, że czuję się lepiej.
Edycja nr 2: Dodano bardziej kompletną kontrolę, aby upewnić się, że proces klonowania został poprawnie zakończony (linia 3)
Edycja # 3: Zaktualizuj, aby obsługiwał nowe losowe przesunięcia. Trudność polegała na tym, że nowe klony miałyby swój kod umiejscowiony w przypadkowych przesunięciach, co oznacza, że nie znają lokalizacji własnych linii. Oznacza to, że wszystkie odniesienia do moich własnych linii muszą być względne (do
This
). Numery linii przeciwnika nadal mogą być bezwzględne, ponieważ i tak są losowe.źródło
Flagger
Strzelaj do księżyca
A reszta zostaje automatycznie wypełniona flagą.
źródło
Kalkulator
Ten bot nie rozumie celu tego wyzwania, więc postanowił obliczyć pewne liczby dla wroga.
źródło
OVar(D)
nieA
!CliqueBot
Rozpoznaje znajomych po ich
B
wartości, wypełnia linie wszystkich innych flagami. Dąży również do zachowania integralności jednej z własnych flag (ta część jest urocza, ale prawdopodobnie niezbyt przydatna).Edycja: Nic dziwnego, że wydaje się, że gdzieś tutaj jest błąd, sądząc po wyniku.Podejrzewam, że linie są indeksowane 0, a mój kod ma indeks 1. Naprawdę powinienem to sprawdzić wcześniej. Dodano flagę na początku, aby podnieść wszystko jeden.
źródło
Obrońca
źródło
MoveBot
źródło
Copy(23,C)
?Napastnik
źródło
BotAt(D):Copy(Line(X),OLine(E))
gdzie linia X zawieraEquals(1,1):Flag
... dla zabawyLine
kopiuje tylko akcję, a nie warunek.Pojedynczy cel
Poluje na ciebie i wypełnia cię flagami!
źródło
All
Stan potrzebuje)
Podstępny
Podobny pomysł do bota o tej samej nazwie w poprzednim konkursie. Poruszaj się, dopóki nie uderzę innego bota, a następnie zamroź go w pętlę, nadpisując własny kod moimi flagami. Tym razem zainfekowane boty nadpisują losowe linie zamiast linii sekwencyjnych, dzięki czemu proces infekcji jest nieco mniej skuteczny, ale znacznie szybszy.
źródło
Line(4)
można trochę uprościć.Add(OVar(C),0)
jest taki sam jakOVar(C)
iAdd(This,Add(4,Mod(E,14)))
jest taki sam jakAdd(This,4,Mod(E,14))
.Gard
Atakuje dowolnego robota obok niego.
źródło
OCon
musi byćOCond
Freeze Bot
Uwięzia cię w pętli Obciążanie własną
A
zmienną, a następnie wypełnia cię flagami i przechodzi do następnej ofiary.źródło
Imitator
Przewiduje, co byś zrobił, a następnie robi to.
źródło
OLine
lubLine
Line
je2
iAdd(D,1)
zamiastD+1
Leniwa lwica
Pierwotnie po prostu „Lwica”, moje pierwsze zgłoszenie do konkursu zyskało tytuł „leniwy”, dosłownie nic nie robiąc po wprowadzeniu do symulatora.
Jej letarg jest w rzeczywistości spowodowany błędem (lub być może moim niezrozumieniem modelu zdarzenia), w którym warunki w pierwszych trzech wierszach (zwykłe sprawdzenie parzystości w celu upewnienia się, że flagi nie zostaną zastąpione) czasami, w niewytłumaczalny sposób oceniają
true
, blokując Leo w pętli lemniscate . Kilka innych warunków (szczególnie tych, które opierają się na tymBotAt()
stanie) również ocenia siętrue
w czasie, gdy nie ma sąsiadujących botów. Wreszcie,Move
iCopy
dyrektywy są wyraźnie ignorowane przy przechodzeniu symulatora. Ponieważ moje łańcuchy logiki warunkowej są dość epickie, w moim kodzie i symulatorze jest dużo miejsca na błędy . ;)W każdym razie przesyłam Lazy Lioness jako przypadek testowy do diagnozy błędów lub debugowania symulatora, co, miejmy nadzieję, doprowadzi do pojawienia się niezbyt leniwej lwicy, którą będę mógł symulować i udoskonalać jako moje pierwsze bona fide poddanie się botom zawody v2.
Nic nie robi
źródło
Modified
warunku zamiast niektórychEquals
Modified
warunkiem jest zaproszenie do nieskończonej pętli. Jeśli nie mogę użyć kontroli parzystości, po prostu całkowicie usunę linie. Wymyśl coś jeszcze przydatnego do włożenia w nie. ;)strażnik
poprawa na
Gard
. Trafia pobliskich botów flagami na pierwszych 8 liniach. (czyli wszystkie najczęściej używane)źródło
All(BotAt(D),Not(Equals(OLine(Mod(E,8)),Line(0))),Not(BotAt(Add(D,1,Mod(E,3))))):
CliqueBorg
Próba połączenia technologii CliqueBot i Borg w celu stworzenia bota, który rozpoznaje kopie samego siebie pomimo przesunięcia linii. Zaczyna także proces kopiowania od ostatniego wykonanego wiersza kodu na przeciwnym bocie, zamiast wiersza 0, co z większym prawdopodobieństwem zamrozi go w miejscu, ale także bardziej prawdopodobne, że spowoduje uszkodzenie kopii (w rzeczywistości nie jestem na pewno to działa, nie testowałem tego i jest to dość skomplikowane).
źródło
Przejeżdżać obok
Ostatnia próba przed terminem.
źródło