お帰りなさい!3つ目のCodeBotsチャレンジを紹介できることを嬉しく思います。これは、作成に長い時間がかかりました。この課題は、ショートバージョン、ロングバージョン、および追加の詳細の3つのセクションに分割されます。
ショートバージョン
各競技者は24コマンドプログラムを作成します。これらのボットは世界中を移動し、コードを他のボットにコピーしますが、他のボットが同じことを実行できないようにします。可能なコマンドの1つはno-op Flag
です。ボットがFlag
他のボットよりも多くのボットを持っている場合、Flag
ポイントを獲得します。最も多くのポイントを獲得して勝ちます。
上記のすべては、過去2つの課題に当てはまりました。今回は、ボットは複数行のコードを同時に実行できます。
ロングバージョン
API
すべてのボットには24行あります。各行の形式は次のとおりです。
$label command parameters //comments
ラベルとコメントはオプションであり、各コマンドには異なる数のパラメーターがあります。すべて大文字と小文字は区別されません。
パラメーター
パラメーターは入力され、次の形式にすることができます。
- 0〜23の値。
- 変数:
A
、B
、C
、D
- 加算を使用した値:
A+3
または2+C
- 符号を使用して指定されたコード行
#
(#4
5行目#C+2
を表し、で計算された行を表しますC+2
)。 $label
コード行を指定する代わりにを使用できます。- で指定された相手の変数またはコード行
*
。対戦相手は、あなたが直面している広場のボットです。(*B
対戦相手のB
価値を*#9
表し、敵の10行目を表します)。その正方形に誰もいない場合、コマンドは実行されません。
コマンド
Vを移動
ボットを移動しNorth+(V*90 degrees clockwise)
ます。動きは方向を変えません。
Vを回す
ボットをV*90 degrees
時計回りに回転させます。
VWをコピー
にあるものをにコピーV
しW
ます。V
が行番号の場合、行番号であるW
必要があります。V
が変数または値の場合、変数でW
なければなりません。
国旗
何もしません。
Vを開始
変数にアタッチされた新しいスレッドを開始しますV
。すぐに、そして将来の各ターンで、スレッドはlineでコマンドを実行しますV
。
V
が既にスレッドに接続されている場合、このコマンドはノーオペレーションです。場合はV
、相手の変数であり、その後、相手はその変数に添付スレッドを開始します。
停止V
V
このターンの終わりに変数に接続されたスレッドを停止します。
ロックV
を呼び出したスレッド以外の方法で、行または変数V
が使用されないようにしますLock
。Lock
同じスレッドによるの後続の呼び出しでロックが解除されV
ます。ロックは、相手の変数またはラインで呼び出すことはできません。
Cond VWの場合
これはテストしCond
ます。条件が真の場合、スレッドポインターを行番号V
に移動しますW
。それ以外の場合は、行番号に移動します。その行はすぐに実行されます。
条件文をすることができX=Y
、X<Y
、!X
、または?X
:
X=Y
2つのラインが同じタイプで同じボットのものであるかどうかをテストするか、2つの値が同じ量に等しいかどうかをテストします。X<Y
の値X
が未満かどうかをテストしますY
。!X
変数または行X
がロックされているかどうかをテストします(ロックされている場合はtrueを返します)?X
指定された変数にスレッドが接続されているかどうかをテストします
追加の詳細
マルチスレッドの相互作用
同じタイプのアクションが同時に実行されます。アクションは次の順序で実行されます。
ロック。複数のスレッドが変数をロックしようとすると、それらはすべて失敗します。スレッドが変数をロック解除しているときに、別のスレッドがそれをロックしようとすると、変数はロック解除されたままになります。
開始。複数のスレッドが変数でスレッドを開始しようとすると、単一の開始としてカウントされます。
コピー。2つのスレッドが両方とも同じ変数にコピーする場合、変数はランダムな値になります。両方が同じ行にコピーされる場合、どちらも機能しません。スレッドが別のスレッドがコピーしている同じ変数にコピーする場合、後者のスレッドはランダムな値をコピーします。2つのスレッドが両方とも同じ変数からコピーしている場合、両方とも正常に機能します。
もしそうなら。すべての条件が同時にテストされ、その後スレッド変数が更新されます。を実行する
If
と、より高い優先度のアクションが追加される場合があります。優先度の高いアクションはを通過する前に実行されIf
、優先度の低いアクションはの後に実行されますIf
。移動します。同じボットでの複数の動きは、すべての動きの合計でボットを動かします。複数のボットが同じ場所に到着する場合、それらは開始地点に戻ります。
順番。同じボットを複数回ターンすると合計されます。
やめる。同じ変数に対する複数の停止コマンドは、単一の停止としてカウントされます。
その他の詳細
最初のスレッドはD
変数に添付され始めます
If
(If
自分自身を指すステートメントを持つ)で再帰すると、ボットは何もしません
ロック後にスレッドが停止した場合、それらのロックはロック解除されます
ロックされた変数または行を使用するアクションは何もしません。
ボットが24行より短い場合、残りの行は Flag
開始スレッドにもアタッチされている変数で書き込みを実行すると、スレッドは次のターンを開始するため、実際には新しい値で実行を開始します。
ボットは、次のパターンでトロイダル世界に配置されます。
B...B...B...
..B...B...B.
B...B...B...
言語リファレンスとしてコメントされているいくつかの サンプル ボットを追加しました。
コントローラーはここにあります。長い間取り組んできましたが、おそらくまだバグが残っています。仕様とコントローラーが矛盾する場合、仕様は正しいです。
スコアボード
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