コンテスト終了!ブロブのコメントを読んでスコアを表示します。
このKoTHは、プライマーのナチュラルセレクションシミュレーションに大まかに影響を受けています。ボットはblobです。生き残るためには、移動に使用されるエネルギーを取り戻すためにペレットを食べる必要があります。追加のエネルギーにより、ブロブは2つに分割できます。
エネルギーと運動
ブロブは100エネルギーで各ラウンドから始まり、収集できるエネルギー量に制限はありません。各ラウンドは交互に実行され、各ブロブには、任意のターンで北、東、南、または西に移動するか、静止するオプションがあります。移動は1エネルギーを使用し、静止は0.25エネルギーを使用します。マップの辺の長さはceil(0.25 * blobCount) * 2 - 1
単位、最小9単位。すべてのブロブはマップの端から始まり、各コーナーに1つ配置され、後続のすべてのブロブは他のブロブから2ユニット離れて配置されます。30ターンごとに、ペレットの波がマップの周りのランダムなスポットに配置されます。エッジから少なくとも1ユニット離れています。ペレットの波が現れるたびに、次の波のペレットの量(最初はブロブの数の2倍またはマップの幅のいずれか大きい方)が1ずつ減少し、ブロブの数は時間とともに減少します。各ペレットは5〜15のエネルギーを回復します。ブロブのエネルギーが0以下の場合、ブロブは消滅します。
食べる
2つ以上のブロブが同じ場所を占有しようとすると、エネルギーが最も多いブロブが他のブロブを食べ、エネルギーを受け取ります。両方のエネルギーが等しい場合、両方とも消えます。
検出と情報
ブロブは、4ユニット以内の距離にあるペレットや他のブロブを見ることができます。それらの関数が呼び出されると、ブロブには以下が提供されます:
- マップの横の長さ
- 地図上のブロブの位置
- 検索範囲内のすべてのペレットの位置とその値
- 検索範囲内のすべてのblobの位置、およびそれらのエネルギーとUID
- 関数が実行されているblobのエネルギー、UID、および場所
- blobに固有のストレージオブジェクト
- スプリットを通じてblobに関連するすべてのblobによって共有されるストレージオブジェクト
分割
ブロブに50を超えるエネルギーがある場合、分割を選択できます。分割には50のエネルギーがかかり、残りのエネルギーは2つの塊の間で均等に分割されます。すべてのblobは、元のコピーまたは分割されたコピーであり、すべてのコピーは元のトレースに戻ります。これらはすべて「親戚」です。すべての親戚には1つの共有ストレージオブジェクトがあります。親戚は依然としてお互いを食べたり、分裂したり、自分のストレージオブジェクトを使用したり、他の人に影響を与えずにエネルギーを収集したりできます。
エネルギー移動
2つの塊が隣接している場合(移動後)、ボットの1つが他のボットにエネルギーを転送できます。これは戻すことにより行われSendNorth(amt)
、SendEast(amt)
、SendSouth(amt)
、またはSendWest(amt)
でamt
ある量を表す数値が送信しました。これは、すべてのエネルギーを含む、送信者が余裕のある任意の金額にすることができます。エネルギーを受け取っているブロブは、エネルギーが転送されているときに移動しないように、共有ストレージを介して静止するように指示することをお勧めします(ただし、この場合、エネルギーは送信者の合計から差し引かれません)。
関数、ストレージ、およびUID
より複雑な学習動作を可能にするために、すべてのblobには整数のUID(Unique Identifer)が与えられます。これらのUIDは各マップにランダムに生成され、個々のターゲットに基づく戦略を防ぎます。blobの関数が呼び出されると、4つの引数が渡されます。
- 整数としてのマップの辺の長さ
- 二つの配列を持つオブジェクト:
pellets
およびblobs
。どちらの配列にもオブジェクトが含まれており、どちらにもpos
としてフォーマットされたペレットまたはブロブの位置を含むプロパティがあり[x,y]
ます。ペレットにはenergy
プロパティがあり、ブロブにはuid
プロパティとプロパティがありenergy
ます - ブロブのさまざまなプロパティを含むオブジェクトは、それに渡される:
energy
、uid
、およびpos
。pos
アレイは次のようにフォーマットされています[x,y]
- blobの2つのストレージオブジェクトを含むオブジェクト。
self
プロパティは、しかし、BLOBが(渡されたオブジェクトのプロパティを操作することによって)適合を見て変更することができる個々のストレージオブジェクトを含み、communal
任意の相対によって改変することができるプロパティ。
Blobはすぐには移動されず、前後のターンが有利になるのを防ぎます。すべての動きはグループで処理されます(すべての衝突/食事、次にすべてのペレット、次に分割など)。ブロブがペレットまたは小さなブロブに着地し、そのプロセスで最後のエネルギーを使用しても、ブロブは引き続きペレット/総エネルギーが0を超えるかどうかに関係なく、エネルギー。
相対BLOBがお互いを認識するためには、各BLOBがそのUIDを配列に記録するため、または他のシステムを介して共有ストレージを使用する必要があります。
戻り値
移動または分割するには、関数の戻り値を使用します。まず、座標の観点からの基本的な方向の意味:
- 北= -Y
- 東= + X
- 南= + Y
- 西= -X
注[0,0]
ある左上隅あなたがダウンして行くように、とYが増加。関数の戻り値は次の規則に従う必要があります。
- 何もしない:何も返さない、0、null、未定義、false、またはfalseに等しいその他の値
- 移動するには:「北」、「東」、「南」、または「西」(戻り値として使用することもできます)と同じである北、東、南、または西の4つのグローバル変数のいずれかを返します。
- 分割するには:グローバル変数SplitNorth、SplitEast、SplitSouth、またはSplitWestを返します。方向は、新しいBLOBを配置する場所を示します。
分割コマンドが返され、必要なエネルギー量がblobのエネルギー以上である場合、何も起こりません。Blobはマップから離れることができません。
定義済みのライブラリ関数
時間を節約するために、デフォルトでいくつかの基本機能が利用可能です。
taxiDist(pt1、pt2)
2点間のタクシー距離を返します(X距離+ Y距離)。
taxiDist([0, 0], [2, 2]) //4
taxiDist([3, 4], [1, 5]) //3
taxiDist([1.25, 1.3], [1.3, 1.4]) //0.15
taxiDist([0, 0], [5, 2.5], 2.5) //3
taxiDist([0, 0], [2, 4], 2.5) //2.4
hypotDist(pt1、pt2)
ピタゴラスの定理に従って2点間の距離を返します
hypotDist([0, 0], [5, 12]) //13
hypotDist([4, 6], [8, 9]) //5
hypotDist([0, 1], [2, 1]) //2
hypotDist([1, 1], [2, 2]) //sqrt(2)
modDir(dir、amt)
入力された方向を取り、時計回りに90度回転しamt
、新しい値を返します。
modDist(North, 1) //East
modDist(East, 2) //West
modDist(West, 3) //South
modDist(South, 4) //South
Blobの例
この塊は、近くにペレットが見つかるまで移動しません。次に、報酬を与える可能性が最も高いと思われる方向に移動します。そのエネルギーが150を超えると、分割されます。
function(map, near, me, storage) {
if (me.energy > 150)
return SplitNorth;
if (!near.pellets.length)
return null;
var dirs = [0, 0, 0, 0];
for (let p, i = 0; i < near.pellets.length; i++) {
p = near.pellets[i];
dirs[0] += me.pos[1] - p.pos[1];
dirs[1] += p.pos[0] - me.pos[0];
dirs[2] += p.pos[1] - me.pos[1];
dirs[3] += me.pos[0] - p.pos[0];
}
return [North, East, South, West][dirs.indexOf(Math.max(...dirs))];
}
ルール
- 標準の抜け穴は禁止されています。また、非標準の抜け穴はありません。
- blobは、パラメーターを介して渡されていないデータを変更または読み取ろうとすることはできません。
- 他のblobを妨害するためにblobが戻り値変数を変更しようとすることはありません
- ラウンドは、残りのブロブのみが親戚になるまで続きます
this
キーワードを使用して値を変更する関数をパラメーターに挿入することで、Blobがデータを変更することはありません。- すべての提出物は、JavaScriptまたはJavaScriptとそれほど変わらない言語(Pythonなど)である必要があります。すべての回答は、コンテストのJavascriptに変換されます。
- 勝者は、すべてのラウンドで合計で最も高いエネルギー量を収集したブロブです(ペレットから、または親類ではない小さなブロブを使用して)。
コントローラー: https : //gist.github.com/RedwolfPrograms/1facc0afe24c5dfd3ada8b8a2c493242
チャットルーム: https : //chat.stackexchange.com/rooms/93370/hungry-blobs-koth