2026年1月28日水曜日

Core War / Redcodeコアサイズと距離の設計(なぜ“距離”が戦略になるか)

 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 つを押さえると「なるほど」が出ます。

  1. 自分の移動(コピー/分身)で作る距離の分布
    固定距離に偏るか、散らせるか。

  2. 相手の周期列(爆撃間隔、スキャンステップ)との gcd 観点
    「穴が空く」設計は刺さると強いが、外されると弱い。

  3. 分散(複数拠点化)で“距離当たり判定”を薄める
    一撃死を避け、相手の周期列に同時に乗りにくくする。

5) この記事の結論

  • コアは円環、攻撃も探索も「一定ステップの点列」

  • 距離 d は「その点列に乗る/乗らない」の判定

  • したがって距離は運ではなく **周期設計(gcd)**の問題