Ben tornato! Sono entusiasta di presentare la terza sfida di CodeBot. Questo è da molto tempo in preparazione. Questa sfida sarà suddivisa in 3 sezioni: la versione corta, la versione lunga e ulteriori dettagli.
La versione breve
Ogni concorrente scriverà un programma a 24 comandi. Questi robot si sposteranno in tutto il mondo e copieranno il loro codice in altri robot, mentre cercano di impedire ad altri robot di fare lo stesso. Uno dei possibili comandi è il no-op Flag
. Se un bot ha più del tuo Flag
di qualsiasi altro bot Flag
, ottieni un punto. Vinci vincendo il maggior numero di punti.
Tutto quanto sopra era vero per le due precedenti sfide. Questa volta, i robot saranno in grado di eseguire più righe di codice contemporaneamente.
La versione lunga
L'API
Ogni bot avrà esattamente 24 righe, dove ogni riga è nel seguente formato:
$label command parameters //comments
Etichette e commenti sono opzionali e ogni comando ha un numero diverso di parametri. Tutto non distingue tra maiuscole e minuscole.
parametri
I parametri vengono digitati e possono essere nei seguenti formati:
- Un valore compreso tra 0 e 23.
- Una variabile:
A
,B
,C
,D
- Un valore usando l'addizione:
A+3
o2+C
- Una riga di codice, che viene designata utilizzando il
#
segno (#4
rappresenterebbe la quinta riga, mentre#C+2
rappresenterebbe la riga calcolata daC+2
). - È possibile utilizzare un
$label
invece di designare una riga di codice. - La variabile o la riga di codice del tuo avversario, designata da
*
. Il tuo avversario è il robot nel quadrato che stai affrontando. (*B
rappresenta ilB
valore del tuo avversario , mentre*#9
rappresenta la decima linea del tuo avversario). Se non c'è nessuno in quel quadrato, il comando non viene eseguito.
comandi
Sposta V
Sposta il bot North+(V*90 degrees clockwise)
. Il movimento non cambia direzione.
Girare V
Ruota il robot in V*90 degrees
senso orario.
Copia VW
Copia tutto ciò che è V
dentro W
. Se V
è un numero di riga, W
deve essere un numero di riga. Se V
è una variabile o un valore, allora W
deve essere una variabile.
Bandiera
Non fa nulla.
Stella della tv
Avvia un nuovo thread associato alla variabile V
. Immediatamente e in ogni turno futuro, il thread eseguirà il comando on line V
.
Se V
è già collegato a un thread, questo comando è no-op. Se V
è una variabile di un avversario, allora l'avversario inizierà un thread attaccato a quella variabile.
Stop V
Ferma il thread attaccato alla variabile V
alla fine di questo turno.
Lock V
Impedisci che la linea o la variabile V
vengano utilizzate in alcun modo tranne che dal thread che ha chiamato Lock
. Viene Lock
sbloccata una chiamata successiva a dallo stesso thread V
. I blocchi non possono essere chiamati su variabili o linee dell'avversario.
Se Cond VW
Questo metterà alla prova Cond
. Se la condizione è vera, sposta il puntatore del thread sul numero di riga V
, altrimenti sul numero di riga W
. Quella riga verrà quindi immediatamente eseguita.
Condizionali possono essere X=Y
, X<Y
, !X
, o ?X
:
X=Y
verifica se due righe sono dello stesso tipo e dello stesso bot oppure verifica se due valori equivalgono allo stesso importo.X<Y
verifica se il valore diX
è inferiore aY
.!X
verifica se la variabile o la rigaX
è bloccata (restituisce true se bloccata)?X
verifica se a una determinata variabile è associato un thread
dettagli aggiuntivi
Interazioni multi-thread
Le azioni dello stesso tipo vengono eseguite contemporaneamente. Le azioni vengono eseguite nel seguente ordine:
Serratura. Se diversi thread tentano di bloccare una variabile, falliranno tutti. Se un thread sblocca una variabile mentre un altro sta tentando di bloccarla, la variabile rimarrà sbloccata.
Inizio. Se più thread tentano di avviare un thread su una variabile, verrà conteggiato come un singolo avvio.
Copia. Se due thread vengono entrambi copiati nella stessa variabile, la variabile finirà come valore casuale. Se entrambi copiano sulla stessa riga, nessuno dei due funzionerà. Se un thread copia nella stessa variabile da cui un altro thread sta copiando, quest'ultimo thread copia un valore casuale. Se due thread copiano entrambi dalla stessa variabile, funzioneranno entrambi correttamente.
Se. Tutti i condizionali verranno testati simultaneamente e successivamente le variabili del thread verranno aggiornate. L'esecuzione di un
If
può causare un'azione con una priorità più alta da aggiungere. Le azioni con priorità più alta verranno eseguite prima di passare oltre ilIf
, mentre le azioni con una priorità inferiore verranno eseguite dopo ilIf
.Mossa. Mosse multiple sullo stesso bot sposteranno il bot della somma di tutte le mosse. Se più robot finissero nello stesso punto, verranno riportati al punto di partenza.
Girare. Si sommano più turni sullo stesso bot.
Fermare. I comandi di arresto multipli sulla stessa variabile verranno conteggiati come arresto singolo.
Altri dettagli
Il thread iniziale inizia in allegato alla D
variabile
Ricorrere con un If
(avendo If
un'affermazione puntata su se stesso) non farà nulla al tuo bot
Se un thread viene interrotto dopo il blocco, tali blocchi verranno sbloccati
Le azioni per usare una variabile o una linea bloccate non faranno nulla.
Se un bot è più corto di 24 righe, le righe rimanenti verranno riempite Flag
Eseguendo una scrittura su una variabile che è anche collegata a un thread iniziale, il thread inizierà effettivamente la sua esecuzione sul nuovo valore mentre il thread inizia il turno successivo.
I robot sono collocati in un mondo toroidale nel seguente schema:
B...B...B...
..B...B...B.
B...B...B...
Ho aggiunto diversi bot di esempio che vengono commentati come riferimento di lingua.
Il controller si trova qui . Ci ho lavorato a lungo, ma probabilmente ha ancora dei bug. Quando le specifiche e il controller sono in contraddizione, le specifiche sono corrette.
tabellone segnapunti
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