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 Flagdi 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+3o2+C - Una riga di codice, che viene designata utilizzando il
#segno (#4rappresenterebbe la quinta riga, mentre#C+2rappresenterebbe la riga calcolata daC+2). - È possibile utilizzare un
$labelinvece 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. (*Brappresenta ilBvalore del tuo avversario , mentre*#9rappresenta 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 degreessenso orario.
Copia VW
Copia tutto ciò che è Vdentro W. Se Vè un numero di riga, Wdeve essere un numero di riga. Se Vè una variabile o un valore, allora Wdeve 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 Valla fine di questo turno.
Lock V
Impedisci che la linea o la variabile Vvengano utilizzate in alcun modo tranne che dal thread che ha chiamato Lock. Viene Locksbloccata 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=Yverifica se due righe sono dello stesso tipo e dello stesso bot oppure verifica se due valori equivalgono allo stesso importo.X<Yverifica se il valore diXè inferiore aY.!Xverifica se la variabile o la rigaXè bloccata (restituisce true se bloccata)?Xverifica 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
Ifpuò 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 Dvariabile
Ricorrere con un If(avendo Ifun'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