Tekrar hoşgeldiniz! Ben 3 CodeBots meydan okumak için heyecanlıyım. Bu yapımda çok uzun zaman oldu. Bu zorluk 3 bölüme ayrılacaktır: kısa versiyon, uzun versiyon ve ek detaylar.
Kısa Versiyon
Her yarışmacı 24 komutlu bir program yazacaktır. Bu botlar dünya çapında hareket edecek ve diğer botların da aynısını yapmasını engellemeye çalışırken kodlarını diğer botlara kopyalayacaktır. Olası komutlardan biri no-op Flag
. Eğer bir bot Flag
diğer botlardan daha fazlasına sahipse Flag
, bir puan alırsın. En yüksek puanı alarak kazanırsınız.
Yukarıdakilerin hepsi son iki zorluk için doğruydu. Bu sefer, botlar aynı anda birden fazla kod satırı çalıştırabilecek.
Uzun Versiyon
API
Her bot tam olarak 24 satıra sahip olacaktır, burada her satır aşağıdaki formattadır:
$label command parameters //comments
Etiketler ve yorumlar isteğe bağlıdır ve her komutun farklı sayıda parametresi vardır. Her şey büyük / küçük harfe duyarlı değildir.
Parametreler
Parametreler yazılmıştır ve aşağıdaki biçimlerde olabilir:
- 0 ile 23 arasında bir değer.
- Bir değişken:
A
,B
,C
,D
- Toplama kullanan bir değer:
A+3
veya2+C
#
İşaret kullanılarak belirlenen bir kod satırı (#4
5. satırı#C+2
temsil ederken , hesaplanan satırı temsil ederC+2
).- Bir
$label
kod satırı belirtmek yerine kullanabilirsiniz . - Rakibiniz tarafından belirtilen değişken veya kod satırı
*
. Rakibiniz karşı karşıya olduğunuz karedeki bottur. (*B
rakibinizinB
değerini,*#9
rakibinizin 10. çizgisini temsil eder). Bu karede kimse yoksa, komut yürütülmez.
Komutları
Hareket V
Botu hareket ettirir North+(V*90 degrees clockwise)
. Hareket yön değiştirmez.
V dönüşü
Botu V*90 degrees
saat yönünde çevirir.
VW kopyala
Ne varsa kopyalar V
içine W
. Eğer V
bir satır numarası, sonra W
bir satır numarası olmak zorundadır. V
Bir değişken veya değer ise , bir değişken W
olmalıdır.
bayrak
Hiç birşey yapmıyor.
Star TV
Değişkene bağlı yeni bir iş parçacığı başlatır V
. Hemen ve gelecekteki her dönüşte, iş parçacığı komutu çevrimiçi olarak yürütür V
.
Eğer V
zaten bir iş parçacığı bağlı, o zaman bu komut no-operasyon. Bir V
rakibin değişkeni ise, rakip bu değişkene bağlı bir iş parçacığı başlatacaktır.
Durdurma V
V
Bu dönüşün sonunda değişkene eklenen iş parçacığını durdurur .
Kilit V
Çizginin veya değişkenin çağrılan iş parçacığı dışında herhangi bir şekildeV
kullanılmasını önleyin . Aynı iş parçacığına yapılan bir sonraki çağrı kilidi açılır . Kilitler rakibin değişkenleri veya hatlarında aranamaz.Lock
Lock
V
Cond VW ise
Bu test edecek Cond
. Koşul doğruysa, iplik işaretçisini satır numarasına V
, aksi takdirde satır numarasına taşır W
. Daha sonra bu hat hemen yürütülür.
Şartlı olabilir X=Y
, X<Y
, !X
, veya ?X
:
X=Y
iki satırın aynı türde ve aynı botta olup olmadığını ya da iki değerin aynı miktara eşit olup olmadığını test edin.X<Y
değeri test ederX
az olanY
.!X
değişkenin veya satırınX
kilitli olup olmadığını test eder (kilitliyse true değerini döndürür)?X
belirli bir değişkenin kendisine bağlı bir iş parçacığı olup olmadığını test eder
ek detaylar
Çok iş parçacıklı etkileşimler
Aynı türde eylemler aynı anda yürütülür. Eylemler aşağıdaki sırayla yürütülür:
Kilit. Birkaç iş parçacığı bir değişkeni kilitlemeye çalışırsa, bunların tümü başarısız olur. Bir iş parçacığı başka bir değişkeni kilitlemeye çalışırken değişkenin kilidini kaldırıyorsa, değişkenin kilidi açık kalır.
Başlat. Birkaç iş parçacığı bir değişken üzerinde iş parçacığı başlatmaya çalışırsa, tek bir başlangıç olarak sayılır.
Kopya. İki iş parçacığı aynı değişkene kopyalanırsa, değişken rastgele bir değer olarak sonuçlanır. İkisi de aynı satıra kopyalanırsa, ikisi de çalışmaz. Bir iş parçacığı başka bir iş parçacığından aynı değişkene kopyalanıyorsa, ikinci iş parçacığı rastgele bir değer kopyalar. İki iş parçacığı aynı değişkenden kopyalanıyorsa, ikisi de iyi çalışır.
Eğer. Tüm şartlar aynı anda test edilecek ve daha sonra evre değişkenleri daha sonra güncellenecektir. Bir'in çalıştırılması,
If
daha yüksek önceliğe sahip bir eylemin eklenmesine neden olabilir. Daha yüksek önceliğe sahipIf
eylemler , geçmişine geçmeden önce , daha düşük önceliğe sahip eylemler iseIf
.Hareket. Aynı bot üzerindeki çoklu hareketler, botun tüm hareketlerin toplamını hareket ettirir. Birden fazla bot aynı noktaya gelirse, başlangıç noktalarına geri döneceklerdir.
Çevirin. Aynı bot üzerinde çoklu dönüşler toplanır.
Dur. Aynı değişken üzerindeki birden fazla durdurma komutu tek bir durdurma olarak sayılır.
Diğer detaylar
İlk iş parçacınız D
değişkene eklenmeye başlar
If
( If
Kendisine işaret eden bir ifadeyle) tekrarlamak botunuzun hiçbir şey yapmamasına neden olur
Bir iplik kilitlendikten sonra durdurulursa, bu kilitlerin kilidi açılacaktır
Kilitli bir değişken veya satırı kullanma eylemleri hiçbir şey yapmaz.
Bir bot 24 satırdan daha kısaysa, kalan satırlar Flag
Bir başlangıç iş parçacığına da bağlı olan bir değişken üzerinde yazma işlemi iş parçacığının sonraki dönüşü başlattıkça iş parçacığının yeni değerde yürütülmesine başlamasını sağlar.
Botlar aşağıdaki desende toroidal bir dünyaya yerleştirilir:
B...B...B...
..B...B...B.
B...B...B...
Bir dil başvurusu olarak yorumlanan birkaç örnek bot ekledim .
Denetleyici burada bulunur . Üzerinde uzun süre çalıştım, ama muhtemelen hala hataları var. Teknik özellik ve denetleyici çeliştiğinde, teknik özellik doğrudur.
sayı tahtası
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