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