Core War / Redcode では、**「コアサイズ N の円環上で、敵と自分の相対距離 d をどう作るか」**が、そのまま生存率になります。理由は、命令が実行される場所も、爆発(DAT など)が撒かれる場所も、全部 **アドレス差分(オフセット)**で決まるからです。
1) 距離 d は「当たり判定の座標」
コアは 0..N-1 の円。自分のコードがある位置を 0 とすると、相手はどこかの d にいます。
-
スキャナは「一定ステップで読む」ので、読む点列が当たりやすい d がある
-
ボムは「一定間隔で撒く」ので、撒く点列に乗る d がある
-
インプは「一定周期で進む」ので、周期の上で追いつく/追えないが決まる
つまり、距離は「運」ではなく、相手の周期列と自分の周期列が重なるかの問題です。
2) 周期(step)とコアサイズ N の最大公約数が本体
一定ステップ s でコアを巡回すると、訪れる位置集合は
-
訪問数 = N / gcd(N, s)
-
同じ場所に戻る周期 = N / gcd(N, s)
gcd が 1 なら「全域を舐める」
gcd が大きいと「特定の剰余類しか踏まない(穴が空く)」
これが「距離が戦略になる」最短の説明です。相手の撒く点列・読む点列に、こちらの本体(または分身)が乗ると死にます。
3) 距離が効く代表パターン
Stone(爆撃): 間隔 k の“地雷原”
Stone 系は 一定間隔 kで DAT を撒くことが多いです。
このとき、安全か危険かは「相手本体がその剰余類にいるか」で決まります。
-
相手の爆撃列が「0, k, 2k, …」なら
自分の本体位置がその列に乗った瞬間に被弾します。 -
逆に言うと、自分は k と相性の悪い距離へ逃げる(または分散する)と生き残りやすい。
Scanner: 探索ステップ s の“探知レール”
Scanner は「s ずつ離れた場所」を見ていく(or 二点比較)ので、
-
gcd(N, s) が 1 なら理論上は全域を見られる(時間はかかる)
-
gcd が大きいと、見ないレーンができ、そこに潜ると見つかりにくい
距離設計=「相手の見ているレーンから外れる」発想になります。
Imp: 周期 p の“追いつけない列”
Imp は典型的に一定の進み方(例:+1)をし、これもまた周期列です。
コアサイズや相手の罠の配置が その周期列に刺さるかどうかで勝敗が変わります。
4) 実務的な“距離設計”の意思決定
記事としては、以下の 3 つを押さえると「なるほど」が出ます。
-
自分の移動(コピー/分身)で作る距離の分布
固定距離に偏るか、散らせるか。 -
相手の周期列(爆撃間隔、スキャンステップ)との gcd 観点
「穴が空く」設計は刺さると強いが、外されると弱い。 -
分散(複数拠点化)で“距離当たり判定”を薄める
一撃死を避け、相手の周期列に同時に乗りにくくする。
5) この記事の結論
-
コアは円環、攻撃も探索も「一定ステップの点列」
-
距離 d は「その点列に乗る/乗らない」の判定
-
したがって距離は運ではなく **周期設計(gcd)**の問題