Witamy spowrotem! Jestem podekscytowany, że mogę zaprezentować trzecie wyzwanie CodeBots. Ten był od dawna w trakcie tworzenia. Wyzwanie zostanie podzielone na 3 części: krótką, długą i dodatkowe szczegóły.
Krótka wersja
Każdy zawodnik napisze program z 24 poleceniami. Boty te będą się przemieszczać na całym świecie i kopiować swój kod do innych botów, jednocześnie próbując uniemożliwić innym botom zrobienie tego samego. Jednym z możliwych poleceń jest brak operacji Flag
. Jeśli bot ma więcej twoich Flag
niż jakikolwiek inny bot Flag
, dostajesz punkt. Wygrywasz, mając najwięcej punktów.
Wszystkie powyższe dotyczyły dwóch ostatnich wyzwań. Tym razem boty będą mogły uruchamiać wiele linii kodu jednocześnie.
Wersja długa
API
Każdy bot będzie miał dokładnie 24 linie, przy czym każda linia ma następujący format:
$label command parameters //comments
Etykiety i komentarze są opcjonalne, a każde polecenie ma inną liczbę parametrów. Wszystko nie rozróżnia wielkości liter.
Parametry
Parametry są wpisane i mogą mieć następujące formaty:
- Wartość od 0 do 23.
- Zmienna:
A
,B
,C
,D
- Wartość wykorzystująca dodatek:
A+3
lub2+C
- Wiersz kodu, który jest oznaczony za pomocą
#
znaku (#4
reprezentuje piątą linię, a#C+2
reprezentuje linię obliczoną przezC+2
). - Możesz użyć
$label
zamiast oznaczenia linii kodu. - Zmienna lub linia kodu przeciwnika, wyznaczona przez
*
. Twój przeciwnik jest botem na kwadracie, przed którym stoisz. (*B
reprezentujeB
wartość przeciwnika , a*#9
reprezentuje 10. linię przeciwnika). Jeśli na tym kwadracie nie ma nikogo, polecenie nie zostanie wykonane.
Polecenia
Przesuń V.
Porusza bota North+(V*90 degrees clockwise)
. Ruch nie zmienia kierunku.
Skręć w V.
Obraca bota w V*90 degrees
prawo.
Skopiuj VW
Egzemplarzy, co jest w V
w W
. Jeśli V
jest to numer linii, to W
musi to być numer linii. Jeśli V
jest zmienną lub wartością, to W
musi być zmienną.
Flaga
Nic nie robi.
Gwiazda telewizyjna
Rozpoczyna nowy wątek dołączony do zmiennej V
. Natychmiast i przy każdej kolejnej turze wątek wykona polecenie on-line V
.
Jeśli V
jest już dołączony do wątku, to polecenie nie działa. Jeśli V
jest zmienną przeciwnika, przeciwnik rozpocznie wątek dołączony do tej zmiennej.
Stop V.
Zatrzymuje nić dołączoną do zmiennej V
na końcu tej tury.
Zablokuj V.
Zapobiegaj V
używaniu linii lub zmiennej w jakikolwiek sposób, z wyjątkiem wywoływanego wątku Lock
. Kolejne wywołanie Lock
tego samego wątku odblokowuje się V
. Blokad nie można wywoływać na zmiennych lub liniach przeciwnika.
Jeśli Cond VW
To przetestuje Cond
. Jeśli warunek jest spełniony, wówczas wskaźnik nitki przesunie się na numer linii V
, w przeciwnym razie na numer linii W
. Ta linia zostanie natychmiast wykonana.
Warunkowe może być X=Y
, X<Y
, !X
, lub ?X
:
X=Y
sprawdza, czy dwie linie są tego samego typu i od tego samego bota, lub testujesz, czy dwie wartości są równe tej samej wartości.X<Y
sprawdza, czy wartośćX
jest mniejsza niżY
.!X
sprawdza, czy zmienna lub liniaX
jest zablokowana (zwraca true, jeśli zablokowana)?X
sprawdza, czy dana zmienna ma dołączony wątek
Dodatkowe Szczegóły
Interakcje wielowątkowe
Działania tego samego typu są wykonywane jednocześnie. Akcje są wykonywane w następującej kolejności:
Zamek. Jeśli kilka wątków spróbuje zablokować zmienną, wszystkie zawiodą. Jeśli wątek odblokowuje zmienną, podczas gdy inny próbuje ją zablokować, zmienna pozostanie odblokowana.
Początek. Jeśli kilka wątków podejmie próbę uruchomienia wątku na zmiennej, będzie to liczone jako pojedynczy początek.
Kopiuj. Jeśli dwa wątki zostaną skopiowane do tej samej zmiennej, zmienna zakończy się losową wartością. Jeśli oba zostaną skopiowane do tej samej linii, żadne z nich nie będzie działać. Jeśli wątek kopiuje do tej samej zmiennej, z której kopiuje inny wątek, to ten drugi wątek skopiuje losową wartość. Jeśli oba wątki kopiują z tej samej zmiennej, oba będą działać poprawnie.
Gdyby. Wszystkie warunki warunkowe będą testowane jednocześnie, a następnie zmienne wątku zostaną zaktualizowane po. Wykonanie
If
może spowodować dodanie akcji o wyższym priorytecie. Działania o wyższym priorytecie zostaną wykonane przed przejściem dalejIf
, natomiast działania o niższym priorytecie zostaną wykonane poIf
.Ruszaj się. Wiele ruchów tego samego bota spowoduje przesunięcie bota o sumę wszystkich ruchów. Jeśli wiele botów znajdzie się w tym samym miejscu, zostaną one przywrócone do miejsca początkowego.
Skręcać. Suma wielokrotnych włączeń tego samego bota.
Zatrzymać. Wiele poleceń zatrzymania dla tej samej zmiennej będzie liczonych jako pojedynczy zatrzymanie.
Inne szczegóły
Twój początkowy wątek zaczyna być dołączany do D
zmiennej
Ponowne użycie polecenia If
(o If
skierowanej do siebie instrukcji) spowoduje, że bot nie będzie nic robił
Jeśli wątek zostanie zatrzymany po zablokowaniu, zamki te zostaną odblokowane
Działania polegające na użyciu zablokowanej zmiennej lub linii nic nie zrobią.
Jeśli bot ma mniej niż 24 linie, pozostałe linie zostaną wypełnione Flag
Wykonanie zapisu na zmiennej, która jest również dołączona do wątku początkowego, spowoduje, że wątek rozpocznie wykonywanie nowej wartości, gdy wątek rozpocznie następną turę.
Boty są umieszczane w świecie toroidalnym według następującego wzoru:
B...B...B...
..B...B...B.
B...B...B...
Dodałem kilka przykładowych botów, które zostały skomentowane jako odnośniki językowe.
Kontroler znajduje się tutaj . Pracowałem nad tym przez długi czas, ale prawdopodobnie nadal zawiera błędy. Gdy specyfikacja i kontroler są ze sobą sprzeczne, specyfikacja jest poprawna.
Tablica wyników
1. 771 LockedScannerBot
2. 297 CopyAndSelfFlag
3. 289 DoubleTapBot
4. 197 ThreadCutterBot
5. 191 TripleThread
6. 180 ThickShelled
7. 155 Attacker
8. 99 RandomMover
9. 90 BananaBot
10. 56 LockedStationaryDoubleTap
źródło
Odpowiedzi:
Zablokowany skaner Bot
Skanuje wroga tak szybko, jak to możliwe i zastępuje linie flagami.
źródło
DoubleTapBot
Ten bot ma 3 wątki: jeden do poruszania się (A), dwa pozostałe do oznaczania (B i D). Flaga B 1/2 obrotu, flaga D 1/3 obrotu. Więc w pewnym momencie podwoi flagę przeciwnika :).
Zakładam, że C powróci do 0, jeśli przekroczy 23.
Powinno być całkiem bezpiecznie, jeśli ma trochę czasu na przygotowanie się (8 zwojów), ponieważ zawsze będzie działał normalnie co najmniej 2 wątki (A i B).
Nie mogę tego teraz wypróbować, więc zrobię test, kiedy wrócę do domu :)
źródło
Zablokowane stacjonarne podwójne dotknięcie
Zainspirowany DoubleTapBot @ Katenkyo, ten rezygnuje z kilku flag i wszelkiej nadziei na ruch w zamian za całkowite zablokowanie własnych wątków, więc nigdy nie będzie można go przeprogramować. Nadal jednak podatne jest na pisanie flag wroga w niepętlących obszarach kodu.
źródło
Random Mover
Porusza się w kierunku psuedorandom
źródło
Grube łuskane
Blokuje jego rzeczy tak bardzo, jak tylko może
źródło
Bot atakującego
Kopiuje flagi do różnych lokalizacji
źródło
Potrójny wątek
Ten prosty bot uruchamia trzy wątki, wszystkie z tym samym kodem. Każdy wątek atakuje o 1/3 obrotu, porusza się o 1/6, obraca o 1/6 i wykonuje księgowość 1/3.
źródło
Banana Bot
Próbuje wrzucić banany w koło wroga, zanim wróg będzie mógł cokolwiek zrobić. Skłonny do zgniecenia.
źródło
Obcinacz nici Bot
Zatrzymaj wszystkie wątki wroga przed wypełnieniem kodu.
źródło
Kopiowanie i samodzielna flaga
Ten bot uruchamia trzy wątki. Wątek D porusza się, dopóki nie trafi na wroga, a następnie próbuje skopiować do niego flagę, a następnie przesuwa się w losowym kierunku. Wątek A kopiuje własną flagę przez niepotrzebne wiersze kodu bota. Wątek B to tylko licznik. Zmienna, flaga i wiersze kodu używane przez każdy wątek są całkowicie zablokowane w pierwszych 15 zwojach, a bot zastępuje prawie cały kod startowy własnymi flagami. Nie sądzę, że po 15. rundzie można przekonwertować tego bota na baner innej drużyny bez dedykowanego bota atakującego, który napisałby do niego flagi.
źródło
Move 0
przesuwa się na północ, a nie do przodu.