Boty kodowe
Nienawidzę zmiennych prywatnych i chronionych. Chcę tylko uzyskać dostęp do wszystkiego i wszystkiego!
Jeśli jesteś podobny do mnie, to wyzwanie jest dla Ciebie!
Napisz bota, który współpracuje w harmonii z innymi botami, dzięki czemu inne boty będą robić to, co chcesz. Jesteś programistą i wiesz, jak mają działać. Twoim zadaniem jest konwersja jak największej liczby innych botów na twoje sposoby.
Kod
Będziesz miał 24 linie kodu do napisania swojego bota. W każdej turze każdy bot wykona kolejno 1 linię.
Każdy bot przechowuje 5 zmiennych A
przez E
. A
i B
są do użytku osobistego, C
przechowuje następny wiersz do wykonania, D
zapisuje bieżący kierunek i E
jest liczbą losową. Zmienne zaczynają się od 0, z wyjątkiem D
, które zaczynają się od losowej wartości. Wszystkie zmienne przechowują tylko 0–23. Liczby większe lub mniejsze będą modulowane przez 24.
W tym poście użyję przeciwnika jako sąsiadującego bota, z którym się zmierzysz
Każda linia musi zawierać jedno z następujących 5 poleceń:
Flag
nic nie robi. Z wyjątkiem tego, jak wygrywaszMove
przesuwa twojego bota wD
kierunku th. Jeśli bot już zajmuje to miejsce, nie nastąpi ruchCopy Var1 Var2
kopiuje zawartość Var1 do Var2If Condition Line1 Line2
Jeśli warunek jest spełniony, wykonuje wiersz 1, w przeciwnym razie wiersz 2Block Var1
blokuje następny zapis zmiennej
Zmiennej można użyć w następujący sposób:
#Var
użyje zmiennej jako numeru linii. Jeśli A
jest 17, Copy #8 #A
skopiuje zawartość linii 8 do linii 17.
*Var
użyje zmiennej twojego przeciwnika. Copy 5 *C
ustawi C
zmienną przeciwnika na 5
Var+Var
dodanie dwóch zmiennych. Copy D+1 D
obróci bota w prawo
Gdy D
zostanie użyty jako kierunek, [North, East, South, West][D%4]
zostanie użyty
Te modyfikatory mogą być powiązane: Copy *#*C #9
skopiują kolejną linię, którą przeciwnik wykona do twojego własnego kodu w linii 9. **D
odnosi się do D
zmiennej przeciwnika przeciwnika .
Stan zostanie oceniony w następujący sposób:
- Jeżeli
Var
:- Jeśli Var jest
A
przezC
, zwróci true jeśli Var jest niezerowe, inny fałszywy. - Jeśli Var jest
D
, zwróci true, jeśli w tymD
kierunku jest bot, w przeciwnym razie false - Jeśli Var jest
E
, zwróci true, jeśli E jest nieparzyste, w przeciwnym razie false - Jeśli Var jest linią, zwróci true, jeśli jest linią Flag
- Jeśli Var jest
- Jeżeli
Var1=Var2
:- Zwraca true, jeśli oba są
A-E
i są równe tej samej liczbie - Zwraca true, jeśli oba są liniami, a typ linii jest równy
- Zwraca true, jeśli oba są
- Jeżeli
Var1==Var2
:- Zwraca true, jeśli oba są
A-E
i są równe tej samej liczbie - Zwraca true, jeśli oba są liniami i są identyczne (flagi z różnych botów nie będą równe)
- Zwraca true, jeśli oba są
50 botów każdego typu zostanie umieszczonych w świecie toroidalnym według następującego wzoru:
B...B...B...B...
..B...B...B...B.
B...B...B...B...
..B...B...B...B.
Po każdej grze w 5000 tur, flagi każdego bota zostaną policzone. Dostajesz punkt, jeśli bot ma więcej twojej flagi niż jakikolwiek inny rodzaj flagi. W przypadku remisu między N
botami punkty nie są przyznawane.
Będzie 10 gier, a wyniki zostaną zgromadzone na końcu.
Notatki dodatkowe
Komentarze na końcu linii są dozwolone i są oznaczone symbolem //
Próba zrobienia czegoś, co nie ma sensu, takiego jak dodanie do linii, nic nie da
Próba zrobienia czegoś na nieistniejącym bocie nic nie da
Nieskończona rekurencja w If
testamencie zakończy się bez wykonania linii
If
nie zmienia wartości C
A Block
nie wygasa, dopóki ktoś nie spróbuje do niego napisać
Wiele zmiennych i linii może być blokowanych jednocześnie
Block
wprowadzenie zmiennej wiele razy będzie blokować wiele razy, dopóki druga instrukcja blokowa będzie w innym wierszu kodu niż pierwsza
Spacje są dozwolone tylko między argumentami (i po poleceniu)
Jeśli bot ma mniej niż 24 linie, flaga będzie resztą linii.
Przykładowy program
Copy 2 C //Skip to the If line
Flag //Where I'm storing my flag
Move //Move in the D'th direction
If D #5 #2 //If there's a bot, copy code, otherwise, move!
Copy #1 *#E //Copy my flag onto a random spot in my bot's code
Copy 2 C //Skip back to the If line
Program będzie prowadzony przez mojego kontrolera Python tutaj .
Kontroler Java jest tutaj Jest szybki i wygląda znacznie lepiej niż Python.
Tablica wyników:
- 6837 $ Kopiuj
- 3355 Lockheed
- 1695 MindControl
- 967 bizantyjskie
- 959 AttackOrElse
- 743 Cadmyllion
- 367 Grypa
- 251 TheCommonCold
- 226 Mag
- 137 HideBlockAttack
- 129 RowBot
- 123 FastMoveCloneDodge
- 112 FastForwardClone
- 96 QuickFreeze
- 71 RepairAndProtect
- 96 SuperFreeze
- 93 RovingVirus
- 80 ForwardClone
- 77 FreezeTag
- 68 Palimpseste
- 62 BlockFreezeAttack
- 51 RushAttackDodge
- 46 Blocker
- 40 TurretMaker
- 37 Copycat
- 37 Kamikaze
- 35 FlagInjector
- 33 RandomCopier
- 31 Podstępny
- 29 HappyAsAClam
- 25 NanoVirus
- 21 Nullifier
- 19 Nanoviris
- 17 BoringCopybot
- 16 Movebot
- 14 Flagbot
- 13 Neutralizator
- 12 Rak
- 9 DNAbot
- 9 Pasożyt
- 8 MetaIndidious
- 8 Zmiana marki
- 8 AdaptiveBot
- 8 ReproducingBot
- 8 KungFuBot
- 5 QuickFreezerbot
- 4 Atakujący
źródło
Odpowiedzi:
Flagbot
Po co zawracać sobie głowę robieniem czegokolwiek, skoro inne boty będą na tyle miłe, by dać mi swój kod?
źródło
Freeze Tag
Uwięź przeciwnika w pętlę, wypełnij go flagami, przejdź do następnego przeciwnika.
źródło
Copy C+23 C
To musi być najbardziej złośliwa linia kodu xD.Or would that not count as your flags?
. Ponieważ jeśli nie liczą się one jako twoje własne flagi, zdecydowanie nie jest to dobre rozwiązaniePasożyt
Po co zabijać innych botów? Ten bot przegląda kod przeciwnika i zastępuje tylko flagi.
źródło
$ Kopiuj
Ten bot używa wielu takich samych technik jak Lockheed COTO, więc bezwstydnie pożyczę i poprawię.
Wykorzystuje to
C
lukę w łamaniu bloków, a nawet odwraca neutralizator. Z tego powodu jest również napisane w absolutach. Myślę, że może się toC
zmienić, jeśli zmiana zostanie przywrócona, ale dopóki zmiana jest stała, można ją przepisać, aby z nią walczyć.Z jakiegokolwiek powodu brak pętli na końcu sprawił, że ten bot był bardzo dobry.
źródło
C
wartościami. W ten sposób blok może być ustawiany w stos, gdy zostanie wywołany zIf
instrukcji, która jest wykorzystywanym exploitem. $ Copy łamie bloki (jak małże), wykonującCopy
w kółko tę samą linię, aż się powiedzie, co daje przewagę nad Lockheed.Lockheed
Moje trzecie (i prawdopodobnie ostateczne) poddanie się tej konkretnej wojnie z botami: reaktor Lockheed lub w skrócie „Lockheed”.
Specjalne podziękowania należą się @Wasmoo, który podzielił się swoim odkryciem: „Wielokrotne blokowanie zmiennej będzie blokować wiele razy, dopóki druga instrukcja blokowa będzie w innym wierszu kodu niż pierwsza”. po prostu nieprawda ”. Korzystam z tego w szerokim zakresie.
Podziękowania należą się również Nathanowi Merillowi za zarządzanie konkurencją i opublikowanie symulatora. Symulator jest całkowicie nieoceniony w tuningu botów. Nie uwierzyłbym, gdybym nie symulował tego na własne oczy, ale dodanie lub usunięcie najbardziej koncepcyjnie mniejszej funkcji bota może oznaczać różnicę między wielkim sukcesem a całkowitą porażką. Jestem rozdarty, czy to dobrze, czy nie.
źródło
If
wskazanie na tej linii nie zawiedzie), Blokujesz tę samą wartość (Pojedyncza linia może blokować linie 1-24 ze zmienną inkrementacyjną), a blok nie został jeszcze zwolniony (ktoś próbował zmodyfikować tę zmienną)C
,<block target>
) jeszcze nie obowiązuje”. Oznacza to, że wiersz, w którym znajduje się instrukcja bloku, nie ma znaczenia przy stosowaniu, z wyjątkiem tego, że jeśli blok jest wykonywany bezpośrednio,C
= adres instrukcji bloku.Atak lub jeszcze raz
Widząc, że roboty defensywne, takie jak Bizancjum, mają się tak dobrze, postanowiłem również stworzyć robota obronnego.
Ma dwa zestawy wzorów, w zależności od tego, czy wróg jest obecny, czy nie.
przemian kopiuje swoją flagę i kopiuje kod, który spowoduje, że wróg skopiuje tę flagę (słaby replikator), skopiuje swoją flagęWięcej testów wykazało kilka ważnych koncepcji:
A+7
pokazany jako bardziej efektywny niż jakikolwiek inny przyrost (+200 w stosunku do następnego najlepszego)Bardzo pomocne było graficzne obserwowanie symulacji za pomocą interfejsu Java. Dziękuję Ci! Poniżej znajduje się nowy i ulepszony kod. Nie sądzę, żebym mógł zrobić nic więcej.
źródło
C
który ją zablokował. Ponieważ ten bot ma oparty na obrotach blokC
, będzie gromadził wiele bloków na każdym ze swoich poleceń. To sprawia, że ten bot jest wyjątkowo defensywny.If
linię do listy, wpisującC
zmienną, która ją wywołała . Tak więc z 1 Blokiem i 9 Jeśli wykonujesz instrukcję Blok, bot może uzyskać do 10 Bloków dla każdej linii (co najmniej 24 * 10 * 10 obrotów) Być może OP nie przeprowadził poprawnie symulacji.Row Bot
Porusza się, dopóki nie znajdzie robota.
Ustawi robota w tym samym kierunku co on sam.
Następnie skopiuje swój kod do robota.
To powinno zrobić rząd robotów „Row Bot”. :)
źródło
If
wyciągi muszą być pisane wielkimi literami. Po drugie, nie powinno być miejsca na każdej stronie=
, podobnie jakD=*D
.Super Freeze
Ten bot próbuje zamrozić robota przed sobą, dopóki nie zadziała, a następnie zapisuje kilka flag do losowych linii, a po 8 obrotach obraca się i przechodzi do innego przeciwnika.
źródło
Bizantyjski
Wysoce defensywny bot, który tworzy wiele bloków na swoich flagach i najbardziej wrażliwe instrukcje, w tym meta-bloki (tj. Bloki na krytycznych instrukcjach bloków).
Porusza się również stale w nieprzewidywalny sposób i umieszcza flagi w wielu miejscach na przeciwnikach na zasadzie najlepszych starań.
Nie jestem pewien, jak to będzie działać, ponieważ nie mogę symulować. Ale spróbujemy. ;)
Zrzeczenie się
Napisałem to przed uprzejmym poinformowaniem przez PhiNotPi, że logika warunkowa jest bezpłatna. Jednak zdecydowałem się to zostawić, ponieważ nigdy nie można mieć zbyt wielu botów.
źródło
Cadmyllion
„Właśnie wszedłem do bota w Battle Royale” - mówię. „Porusza się co kilka tur, aby zapobiec atakom wolniejszych botów”.
„Co rozumiesz przez wolniejsze boty?” Pyta PhiNotPi.
„Boty, które utknęły, oceniając długie łańcuchy logiki warunkowej” - odpowiadam.
„Instrukcje„ Jeśli ”przekierowujące do innych instrukcji --- w tym inne instrukcje„ jeśli ”--- są wykonywane w tej samej turze”, mówi PhiNotPi.
„Słodka zmasowana zasada kodeksu asemblacyjnego!” Płaczę. „Kto wpadł na ten pomysł?”
... i tak oto historia powstania Cadmyllionu.
Cadmyllion: bot, który z radością wykorzystuje surrealistyczną zdolność do oceny nieskończenie wielu wyrażeń warunkowych w pojedynczej instrukcji ... poprzez uzależnienie praktycznie wszystkiego, co robi.
Kod
źródło
Meta Podstępna
Ten bot zawiesza się, a następnie przekształca przeciwników w mniej wydajne wersje Podstępnego Sparra , co z kolei zamieni przeciwników w boty, które spamują dla mnie flagi. Jest to prawdopodobnie najbardziej złożony bot, który napisałem, i dlatego spodziewam się, że będzie on działał okropnie, nie było miejsca na blokowanie i tylko jedna flaga została dopasowana w kodzie. Przekształcenie bota w podstępny klon również zajmuje zbyt dużo czasu.
Największym wyzwaniem było napisanie kodu dla podstępnych klonów w taki sposób, aby działał niezależnie od jego pozycji w bocie. Zamrożenie zostaje usunięte, gdy wklejam od drugiego do ostatniego kodu dokładnie w miejscu, w którym znajduje się zamrożenie, to uruchamia przeciwnika w samą porę.
źródło
Napraw i chroń
Ten bot naprawia własny kod, jednocześnie chroniąc nowo naprawione linie.
Wyjaśnienie:
Wartość początkowa
A
to0
, a linie są ponumerowane 0–23. JeśliIf
instrukcja jest wykonana i jest fałszywa, próbuje ponownie wykonać tę samą linię. Kontroler nie zezwala botowi na dwukrotne wykonanie tej samej linii, więc tura jest zakończona iC
zwiększa się1
.Następny wiersz
Copy #A #A+8
jest faktycznie wykonywany niezależnie od wartościIf
instrukcji. Różnica polega na tym, że jest on wykonywany dwukrotnie, jeśli jest prawdziwy, i raz, jeśli jest fałszywy. Jeśli linia#A+8
jest zablokowana (co się ostatecznie zdarza), wówczas wykonanie jej dwukrotnie z faktycznym kopiowaniem, a wykonanie tego tylko raz spowoduje jej odblokowanie. Następnie nowo skopiowana linia jest blokowana, aby ją zachować.źródło
A
? Nie jest to0
? Jeśli tak, to twoja pierwsza linia porównuje linię 0 do linii 16, ale jak zrozumiałem z przykładowego bota OP, pierwsza linia to linia 1, prawda? Dodatkowo, wciąż w pierwszym wierszu,#C
odnosi się do tej właśnie linii, więc czy to oznacza, że jeśliIf
instrukcja zwróci fałsz, utkniesz w nieskończonej pętli?Neutralizator
Ten bot zmusza ofiarę do przepisania całego programu, dzięki czemu jest wart 0 punktów. Gdy wirus jest na swoim miejscu, przechodzi dalej. To jest wypalona ziemia podejście do zwycięstwa.
Porównanie
*#*C==#7
nie wydaje się odpowiednio dostosowywać do przesunięcia przeciwnika, ale bot ostatecznie się porusza.źródło
Copy C+1 C
to wszystko, czego potrzeba, aby pominąć jedną linię.Copy 23 C
tam wrócić, aby przejść z powrotem do pierwszej linii.Podstępny
Zainspirowany @Cruncherem, ten bot infekuje inne boty małym blokiem kodu, wypełniając drugiego bota flagami tego bota. Te boty następnie siedzą kaczki do dalszego ataku, ale będą w większości pełne moich flag, kiedy zostaną ponownie zainfekowane przez kogoś innego.
Edycja: dzięki @PhiNotPi za pomoc w golfie, @overactor za porady dotyczące wydajności
źródło
Szczęśliwy jak małż
To ćwiczenie z blokowania. Działał wyjątkowo dobrze, dopóki się nie
$Copy
pojawił.Małż ma 22 polecenia blokowania. Ponieważ
A
jest przesuwana w każdej pętli, będą one odnosić się do różnych linii za każdym razem w pętli. Pozwala to każdemu poleceniu układać bloki w każdej innej linii, maksymalnie 22 bloki na linię. Tak więc, aby przełamać w pełni opancerzony małż, trzeba by pisać do linii 22 razy.Na przykład
#10
będzie chroniony za każdym razem przez pętlę następującymi liniami:#10
chronione linią 7 (7+0+3
= 10)#10
chroniona linią 0 (0+7+3
= 10)#10
chroniona linią 17 (17+14+3
= 34 = 10)#10
chroniona linią 10 (10+21+3
= 34 = 10)Więc po 10 linii Loop 3
#10
został zablokowany 4 razy, wymagając 4 zapisów,#10
aby przełamać bloki, a piątego, aby faktycznie nadpisać linię.Zauważ, że bloki są kluczowane według ich
C
wartości i nie będą się układać, jeśli chroniona linia została już zablokowana przez tę samąC
wartość. Więc po ustanowieniu 22 bloków dla każdej linii, bloki nie będą się już kumulować.źródło
Kontrola umysłu
Chyba nigdy nie jest za późno?
MindControl wywodzi się z mojego pomysłu, że skopiowanie całego programu do przeciwnika zajęłoby sporo czasu, podczas którego mój bot jest podatny na ataki z innych kierunków. Dlaczego więc nie zmusić przeciwnika do skopiowania mojego programu podczas skanowania w poszukiwaniu wrogów?
Gdy znajdzie wroga, MindControl natychmiast zamraża go, aby zapobiec ucieczce. Następnie przesyła downloader do przeciwnika i pozwala ofierze pobrać sam program MindControl. Program pobierający wykorzystuje fakt, że niewiele botów używa
B
i zapętla się, dopóki nie pobierze wszystkich 24 linii. Gdy program pobierający przepisuje#19
odCopy 16 C
doCopy 23 C
, oznacza to, że ofiara pobrała wszystkie linie i uruchomi się ponownie.Pierwsze wersje mojego bota nie zawierają bloków. I był tak wrażliwy, że prawie każda zmiana jest paraliżująca. Postanowiłem więc dodać bloki w oparciu o kopię $ Wasmoo (opartą na Lockheed COTO). Minusem, który znalazłem, jest to, że oryginałowi trudno jest poprawić błędy w kopiach. Ale to jest dalekie od kalectwa, a wynik znacznie wzrósł, więc zachowałem bloki.
AKTUALIZACJE
Ulepszyłem program do pobierania, aby kontynuować pobieranie, aż do pomyślnego przepisania w celu obejścia bloków. Oznacza to, że przesłanie downloadera zajmuje jeszcze jedną turę, ale mój wynik podwoił się po tej zmianie !! Nie mogę się kłócić z liczbami.
Kolejna aktualizacja. Jak zapewne zauważyłeś, MindControl decyduje, czy zaatakować cel, porównując losową linię między sobą a celem. Jeśli się zgadzają, MindControl po prostu zakłada, że cel jest już zainfekowany i zostaw go w spokoju. (Uwaga dodatkowa: Kiedyś używałem linii statycznej do porównania, ale daje to dużo fałszywych wyników pozytywnych i negatywnych). Okazuje się, że daje wiele fałszywych negatywów. Więc postanowiłem wykorzystać
==
i wprowadzić pewne zmiany, jak trywialneC+23
do23+C
. Program jest funkcjonalnie identyczny, ale różni się w oczach==
. Teraz, gdy MindControl nie ma linii identycznej z żadną linią w żadnym innym bocie, w 100% uderzy w nietkniętego bota. Ponownie wynik znacznie wzrósł.Ponownie poprawiłem Downloader. Teraz działa w krótszej pętli. (który wydaje się mieć dużą korelację z moim wynikiem)
Jeszcze raz ulepszony Downloader. Używa oryginalnego kodu bota, dzięki czemu ładuje się szybciej. Dodano również 2 losowe bloki, które wydają się poprawiać wynik
źródło
Napastnik
źródło
Movebot
Podobnie jak Flagbot, ale poruszaj się, przyjmując prezenty z kodem, aby pasowały do wszystkich naszych flag.
źródło
Odtworzenie bota
Ten bot próbuje zamrozić przeciwnika, a następnie skopiować cały kod do tego bota przed ponownym uruchomieniem drugiego bota. Powinno to również działać (głównie), jeśli przeciwnik korzysta z blokowania, ale to sprawia, że wszystko jest jeszcze wolniejsze niż jest już.
źródło
Mag
Mag jest prostą próbą rozprzestrzeniania się wirusa. Próbuje skopiować się do programów innych botów. (Edytowane w celu usunięcia liczb ujemnych, ustalenia stanu, przycięcia linii).
źródło
for (int i = 1; i < 25; i++)
.. .DNAbot
Ten bot naprawia własny kod podczas ruchu i ataku.
źródło
Blocker
źródło
Copycat
źródło
Szybki zamrażalnik
Próbuje skopiować flagi w linii, która zostanie wykonana obok jego przeciwnika, porusza się, jeśli nie ma wroga do ataku.
źródło
Blokowanie, zamrażanie, atak
Blokuje wszystkie 24 linie, następnie zapętla 24 razy, poruszając się lub atakując, a następnie powtarza. Atak obejmuje próbę zamrożenia przeciwnika, następnie skopiowanie czterech flag do losowych lokalizacji, a następnie obrócenie.
źródło
Ukryj, Zablokuj, Atakuj
Ten bot jest oparty na Block Freeze Attack. Zmieniłem rozmieszczenie niektórych
If
instrukcji, aby były bardziej kompaktowe, co pozwala mi na umieszczenie większej liczby flag. Mam też ucieczkę na początku gry, żeby zyskać trochę czasu na zablokowanie.źródło
Wędrujący wirus
Ten bot błąka się, dopóki nie znajdzie wroga, a następnie zamraża go, zamienia cały swój kod na własny, odblokowuje go, a następnie wędruje ponownie.
źródło
Przeziębienie
Zaraża cię praktycznie natychmiast i rozprzestrzeniasz go. w oparciu o pasożyty PhiNotPi , zwykłe przeziębienie sprawdza niemal natychmiast, czy może skopiować swoją flagę na twoim. Blokuje losową wartość, jeśli nie może. Porusza się trochę, jeśli nie ma przeciwnika.
źródło
Grypa
Jest to ściśle oparte na zwykłym przeziębieniu (które było oparte na moim pasożycie) z nieznacznie zwiększoną prędkością.
źródło
Rebranding
Ten bot próbuje losowo zlokalizować flagi w botach wroga i zastąpić je przyjaznymi flagami, odwracając się po wykryciu sukcesu. Zainspirowany botem Cancer.
źródło