EXAPUNKS日記1
0.はじめに
Cyberpank2077のDLCが一向にこないので今はセールで安くなってたEXAPANKSをゆったりプレイしてます。
EXAPANKSはZactronicsという(ほぼ)プログラミングパズルゲーしか作らないイカれたゲーム屋さんが作った、アセンブリっぽい言語でプログラミングした機械を使って課題をクリアするパズルです。
同じとこが作ったOpus Magnum(神ゲーなのでみんなやれ)と比べると最低限プログラミング的な基礎がわかってないとサッパリなので万人にお薦めはできませんが、クッソ面白いのは間違いないので興味がある人はやりましょう。やれ。
各ステージのクリア時にランキングとかスコアの上位1%とか上位10%が表示されるので、スコアアタックがとても熱いゲームとなっています。redditの海外兄貴のスコアは頭おかしい。
というわけでスコアアタックの攻略日記的なやつです。専門用語ガンガン出るので基本的に既プレイの人向け。
基本サイクルアタックしかしないのでまぁそういう感じの内容です。
あとTop Parcentileシャクってる解法のGIFが出るので一応ネタバレ注意です。
1.攻略メモ
Top Percentileは記事作成時のものです。3年前のゲームなので無いとは思いますがシャクられてたらまた詰めに行きます。
・Trash World News(Tutorial 1)
難易度:☆☆☆☆☆
ファイル移動のチュートリアル。いきなりチュートリアルに書いてないことをやらされる。いやリファレンスをよく読むとしっかりと書いてあるんですが。
掴んでるファイルは死んだら落とす仕様なのでDROPを省略してサンプルコードから-1。EXAはEOFで自爆するのでついでにHALTも省略してサイズ-1。
・Trash World News(Tutorial 2)
難易度:☆☆☆☆☆
ファイルアクセスと演算のチュートリアル。またチュートリアルに書いてないことをやらされる。
ファイルアクセスは引数に指定した分だけちゃんと行われるので、いい感じにFレジスタを指定してコード圧縮すればいい。
・Trash World News(Tutorial 3)
難易度:☆☆☆☆☆
サンプルコードが消えた。並列処理とEXA間通信のチュートリアル。
レジスタをバッファにして2つめの値を先に書き込むだけ。
・Trash World News(Tutorial 4)
難易度:★★★★★
制御命令とラベルのチュートリアル。いきなり難易度が跳ね上がった。
Mレジスタへの書き込みは必ず2サイクル消費(書き込み->送信)するけどMレジスタからの読み込みは1サイクル(受信のみ)なのでREPLで複製したやつをうまく同期させて書き込み周期を1サイクルにする。
「送信(2サイクル)、デクリメント、ループ終了条件チェック、終了処理、ループ復帰」で6サイクルだけどループ内に同じの2つ書いて11サイクルで2回処理できるようにする。
これをあと4つ複製して、11サイクル中に送信を10回できるようにする。受け取り側は受信コード10回のループで11サイクル。サイズ制限の都合上これが限界と思われる。
こんなわけわからん解法がチュートリアルのTop Percentileなワケがないと思ったらredditで普通に公開されてた(半ギレ)
・Euclid's Pizza(Order System)
難易度:☆☆☆☆☆
急に難易度が下がった。(適正な難易度曲線に戻ったとも言う)
テストケースが全部長さ同じなのでループ書かないでベタ書き。実際の業務でこんなコード書かれたら僕はキレます。
テストケースハックするのは基本テクなのである意味チュートリアル。
12にするのはさらに一工夫。書き込み元の3つめが全部同じ値というナメたテストケースなのでそこだけ固定値を書き込む。実際の業務でこんなテストケース書かれたら以下略。
・Mitsuzen HDI-10(Left Arm)
難易度:★★☆☆☆
Tutorial 4の応用。#CNS側のEXA3つで同期取って#ARM側のEXA3つに順に値を読ませて1サイクル送受信をする。
それだけだと足りなくてどうするんだよと思ったら、どうやら数値は4桁が限度で溢れた分は切り捨てらしいのでそれを使うと値の丸め込みがコンパクトになった。
・Last Stop Snaxnet(Factory 11)
難易度:★☆☆☆☆
一致チェック -> 分岐をテストケースの最大分だけベタ書き。足りない分にはEOFアクセスで勝手に死ぬので問題無し。
書き換え対象の送受信については「Mレジスタの値を一時保存->保存した値をあとで使用」よりも処理のたびにMレジスタ読み込むほうが一時保存分短縮できる。
そのためにMレジスタに逐次書き込むEXAを用意する。そのままだと処理が止まらないので最長パターンに合わせて時限停止用のEXAも用意する。
タイマーは4~5行で書けてNOOP並べるよりお得なのでよく使う。
奇数の場合:
COPY [(待ち時間-1)/2] T
MARK LOOP
SUBI T 1 T
TJMP LOOP
偶数の場合:
NOOP
COPY [(待ち時間/2)-1] T
MARK LOOP
SUBI T 1 T
TJMP LOOP
・Zebros Copies(Point-of-Sale System)
難易度:★★☆☆☆
検証に使わないところはSEEKで読み飛ばせばファイル探索はポインタ+2、検証、ループ終端で3サイクル。
ループの最初だけポインタ移動しないのでそこだけループの前に書く。
2.おわりに
たーのしー
この記事が気に入ったらサポートをしてみませんか?