COREWAR

/
Step 24: お手本観察と変更:防衛罠「Imp-Gate」でImpを止めろ
🎯プリデクリメント(<)の防壁で敵のImpを撃破する(0/1)

ミッション一覧 (全30ステップ)

第1章:画面とメモリの基本 (1-6)
BASIC★☆☆
Step 1: 時間を進める「STEP」ボタン
🔒
BASIC★☆☆
Step 2: プロセスの停止と「RESET」での復旧
🔒
BASIC★☆☆
Step 3: 「編集できる状態」と「実行中の状態」EDIT
🔒
BASIC★☆☆
Step 4: メモリの箱の3つの部屋(右の部屋 B を変える)EDIT
🔒
BASIC★☆☆
Step 5: 左の部屋(A)と右の部屋(B)を書き換えるEDIT
🔒
BASIC★☆☆
Step 6: 「数値(#)」と「番地($)」の記号の違いEDIT
第2章:代表的な命令とループ (7-13)
🔒
ARITHMETIC★☆☆
Step 7: 足し算の命令「ADD」の観察
🔒
ARITHMETIC★☆☆
Step 8: 足す「数値(A)」を変えてみようEDIT
🔒
ARITHMETIC★☆☆
Step 9: 足す「相手の場所(B)」を変えてみようEDIT
🔒
ARITHMETIC★☆☆
Step 10: 引き算の命令「SUB」を使ってみようEDIT
🔒
BASIC★☆☆
Step 11: 箱を丸ごとコピーする命令「MOV」EDIT
🔒
CONTROL★☆☆
Step 12: 時間を巻き戻すジャンプ命令「JMP」EDIT
🔒
CONTROL★☆☆
Step 13: 簡単なプログラムを作ろう(自動カウンター)EDIT
第3章:ノイマン型とデジタル生命 (14-18)
🔒
BASIC★☆☆
Step 14: なぜ「DAT」が爆弾になるのか?EDIT
🔒
BASIC★☆☆
Step 15: 自分自身の命令をコピーする(コード=データ)EDIT
🔒
BASIC★☆☆
Step 16: お手本観察:最古の生命体「Imp」をSTEP実行する
🔒
BASIC★☆☆
Step 17: Impの簡単な変更(コピー先の観察と実験)EDIT
🔒
ARITHMETIC★★☆
Step 18: 間接参照(@ポインタ)の仕組みを知るEDIT
第4章:伝統的アルゴリズム (19-24)
🔒
STRATEGY★★☆
Step 19: お手本観察:爆撃機「Dwarf」をSTEP実行で解剖する
🔒
STRATEGY★★☆
Step 20: Dwarfの簡単な変更(爆弾の間隔を変える)EDIT
🔒
STRATEGY★★☆
Step 21: 実戦デビュー:爆弾の間隔を調整して標的を破壊せよEDIT
🔒
CONTROL★★☆
Step 22: お手本観察:分裂命令「SPL」と増殖の仕組み
🔒
CONTROL★★☆
Step 23: お手本観察:条件比較命令「SEQ / CMP」で敵を探すEDIT
🔒
STRATEGY★★☆
Step 24: お手本観察と変更:防衛罠「Imp-Gate」でImpを止めろEDIT
第5章:実戦改造と総合演習 (25-30)
🔒
STRATEGY★★☆
Step 25: 【Stone(石)】高速爆撃機の観察とステップ幅の改造EDIT
🔒
STRATEGY★★☆
Step 26: 【Paper(紙)】自己複製スウォーム「Mice」を観察する
🔒
STRATEGY★★★
Step 27: 【Paperの改造】クローン投下距離を変更して増殖せよEDIT
🔒
STRATEGY★★☆
Step 28: 【Scissors(鋏)】索敵スキャナーの観察とスキャン間隔の改造EDIT
🔒
STRATEGY★★★
Step 29: 【Trap(罠)】敵の魂を誘拐する「Vampire」の観察と改造EDIT
🔒
STRATEGY★★★
Step 30: 卒業試験:愛機のチューニングと総合バトルEDIT
🟢 編集モード(セルをクリックして変更できます)
[番地][命令 (Opcode)][A (左の値)][B (右の値)]
📦 データ領域 / 爆弾 (DAT)
0000
▼MOV
#
$
👈 ここを変更
0001
▼MOV
<
<
0002
↺JMN
$
$
0003
❖SPL
@
#
0004
+ADD
#
$
0005
↺JMP
$
$
0006
■DAT
$0
$0
++ 命令を追加
0007
■DAT
$0
$0
0008
■DAT
$0
$0
0009
■DAT
$0
$0
0010
■DAT
$0
$0
0011
■DAT
$0
$0
0012
■DAT
$0
$0
0013
■DAT
$0
$0
0014
■DAT
$0
$0
0015
■DAT
$0
$0
0016
■DAT
$0
$0
0017
■DAT
$0
$0
0018
■DAT
$0
$0
0019
■DAT
$0
$0
0020
■DAT
$0
$0
0021
■DAT
$0
$0
0022
■DAT
$0
$0
0023
■DAT
$0
$0
0024
■DAT
$0
$0
0025
■DAT
$0
$0
0026
■DAT
$0
$0
0027
■DAT
$0
$0
🏟️ARENA (20 ROWS)SCOPE: 0000 - 0019
[メモリ空間 800番地 (20行 × 40列)]左のエディタと1対1で同期
P1: 0
P2: 0
CYC: 0
📖 講義ノート // STEP 24 OF 30第4章:戦闘用Warriorの解剖と並列・知覚制御⏱ 読了目安:約5分
📖 講義ノート:この実験で起きているコンピュータ科学と人工生命の原理

アトミックなポインタ減算(< プリデクリメント)と対Imp防衛工学「Imp-Gate」

なぜ1マスずつ迫り来る不死身のImpを「<」記号1つで粉砕できるのか? 1サイクル内でポインタ更新と書き込みを行う複合アドレッシングの威力

#Pre-Decrement Indirect (<)#Atomic Operation#Imp-Gate Defense#Relative Velocity#Compound Addressing
🔬Step 24: お手本観察と変更:防衛罠「Imp-Gate」でImpを止めろ

敵として1マスずつ前進してくる 「Imp(MOV $0, $1)」 が現れました! 4マスおきに爆弾を投げる普通のDwarfでは、1マスのImpに隙間をすり抜けられてしまいます。

Impを確実に仕留めるには、アドレッシングモードの <(プリデクリメント:参照先のB値を -1 減らしながらアクセスする記号) を使います! 0000 番地の MOV.I $2, $2 のBモードを $ から <(MOV.I $2, <2)に変えると、0002 番地のポインタ(初期値 #415)を1ずつ減らしながら、前進してくるImpの目の前に隙間なく DAT の壁を敷き詰めてすり潰すことができます!

🎯 やってみよう 0000 番地の Bモード(右側の $ 記号) をプルダウンで < に変更し、[PLAY] を押して敵のImpを撃破しましょう!

1. 爆撃機Dwarfの天敵:隙間をすり抜ける1マスの「Imp」

第4章の締めくくりとなるStep 24では、0400 番地から1サイクルに1マスずつこちらへ向かって前進してくる『Imp(MOV.I $0, $1)』を迎え撃ち、アドレッシングモードの記号を『$』から『<(プリデクリメント)』に変えることで撃破する防衛実験を行いました。

まず、なぜ普通のDwarf(4マスおきに爆弾を投げる爆撃機)ではImpを倒すのが難しいのかを考えてみましょう。 Impの身体はたった1マスしかなく、しかも毎ターン1マスずつ下(大きい番地)へと移動し続けています。4マスおきにしか爆弾を落とさないDwarfでは、75%の確率でImpの頭上を爆弾が飛び越してしまいます。さらに悪いことに、たとえImpがすでに通り過ぎた「後ろの足跡(過去のMOV命令)」にDAT爆弾を当てても、Impの実行ポインタ(魂)はすでに先頭へ進んでいるため、痛くも痒くもないのです!

前進し続けるImpを確実に殺す唯一の方法は、「Impの実行ポインタが【これから足を踏み入れようとしているすぐ目の前の番地】に、隙間なくDAT爆弾を叩き込むこと」です。

Advancing Imp  : [0400] ──► [0401] ──► [0402] ──► [0403] (Moves +1 per turn)
"<" Imp-Gate   : [0415] ◄── [0416] ◄── [0417] ◄── [0418] (Sweeps -1 per loop with zero gaps!)
                                  💥 Head-on Collision Guaranteed!

2. 1サイクルで2つの仕事をする「<(B間接プリデクリメント)」

もし普通の『ADD』や『SUB』を使って隙間なく1マスずつ逆方向に爆弾を投げようとすると、「①SUBでポインタを1減らす ➔ ②MOVで爆弾を投げる ➔ ③JMPで戻る」という3行(3サイクル)がかかります。 しかし、アドレッシングモードの『<(Pre-Decrement Indirect:前置デクリメント間接参照)』を使うと、なんと「ポインタを1減らす計算」と「その番地へのデータの書き込み」を、ADD/SUB命令なしで【たった1サイクル(MOV命令1行の中)】で同時にやってのけるのです!

『0000: MOV.I $2, <2』が実行される瞬間のCPU内部の動き(アトミック操作)を見てみましょう。 1. CPUは2つ下のポインタ箱(0002番地:『DAT.F #0, #415』)を見に行きます。 2. 『<』記号のルールに従い、まずそのポインタ箱のB値を自動的に「-1(デクリメント)」して『415 ➔ 414』に書き換えます! 3. その直後(同じ1サイクルの内部で!)、減らしたばかりの新しいポインタ値(0002 + 414 = 0416番地)へ向けて、0002番地のDAT爆弾を投下します!

その結果、『ADD』命令が1行もないたった2行のループ(MOVとJMPだけ)で、2サイクルごとに 0416 ➔ 0415 ➔ 0414 ➔ 0413 番地へと、1マスの隙間も開けずに後ろ向き(逆方向)へDAT爆弾のローラーを転がすことができるのです。

3. 相対速度の物理学と「Imp-Gate(インプ関門)」の完成

なぜポインタを「増やす(+1)」のではなく、「減らす(-1:逆向きに走らせる)」のがこれほど有効なのでしょうか? 幾何学と相対速度で考えてみましょう。敵のImpは 0400 番地から 0401, 0402, 0403... と「下向き(プラス方向)」へ歩いてきます。もしこちらの爆弾もプラス方向へ1マスずつ落としていくと、敵の後ろを追いかけっこすることになりかねません。 しかし、敵の前方(0416番地)から『<(マイナス方向)』に向かって逆向きに爆弾を敷き詰めていけば、前進してくるImpと後退していく爆弾の壁が必ず正面衝突(Head-on Collision)を起こし、Impは絶対にすり抜けることができません!

さらにCoreWarでは、1箇所の番地に対して『SPL $0』や『JMP $-1』を回しながら『<』で絶え間なく値を引き算し続けることで、そこを通過しようとするすべてのImpを自動的に処刑する防衛施設『Imp-Gate(インプ・ゲート/インプ関門)』を作ることができます。C言語の『*(--ptr)』に相当するこの『<』記号は、次の第5章で登場する自己複製体Paperの高速コピーエンジンとしても大活躍します。

🔒

🔒 MISSION CLEAR で講義ノートの全編が解放されます

上段の実験シミュレーターでミッションを達成すると自動的に全編がアンロックされます。(下のボタンから今すぐ全文を先に読むことも可能です)