壮絶な回り道

 ターミナルでログを眺めたりソースコードを確認したりしながら出てきた問題点について、あーでもないこーでもないと考え事を膨らませた布団の中「!?」
 いや確かにさっきまでPC弄ってたんですけど、、。今これナチュラルに夢の中から繋がってませんか(汗)。

 いよいよ夢と現実の境目があやふやになってきたのか。記憶の混濁が激しい今日この頃。
 精一杯解釈するなれば、夢を見ながら整理された脳内の記憶が濃厚に積み重なった状態でそのまま半覚醒状態に至って考え事を継続した、と言ったところでしょうか。
 でもって先程は、似たようなデバッグ作業をあれやこれやと進んでいたところで目が覚めたり。あかん、今度は完全に夢の中で仕事しとる、、、。

 まぁ別に忙しさアピールするほど厳しい状況ではないけれど、余裕がある訳ではないのも事実。明らかに「疲れは溜まっている」状態なのできちんと休まないといかんのですけども。
 因みに先程の件は、アセンブラパズル「TIS-100」の解法を考えながらの寝落ちの際の出来事でした。いやだから、わざわざそんな知恵熱発生させるような真似すんなよと(笑)。

 という訳で、前回から大分日も経ってしまったのですが、別に数ヶ月悩んで詰まっていたという訳ではなく単に続きがプレイ出来ていなかった訳で。
 しかし流石にこのまま放置してフェードアウトするのは格好悪いよ!ってことで、どうにか気張って再開してみました。「TIS-100」。明らかに今の自分には地雷原への突入行為。

 さて、件の「SEQUENCE MERGER」。
 改めてチャレンジした「SEQUENCE SORTER」もコードは比較的素直にはなったもののパフォーマンスは却って落ちたという、何とも釈然としない展開。
 ただそれでも2配列ソートには応用できる形になったので、バグと戦いながらもどうにかこうにか組み上げて「これでどうだ・・・!」とリザルトを見たら、あまりにも全世界平均から遠く懸け離れた無残なスコアに、文字通りの惨敗。
 「もうダメもうムリ」とyoutubeで参考動画を見たというか、滅茶苦茶使える隠しコードでもあるのか?と確認してみたもののごく普通の命令のみで構成している。というか(方向性を確認しただけで詳しい実装は読んでないけど)、処理の流れ的にもあまりにもおかしすぎる。「いやこの流れって各配列がソート済みとかなら分かるけど・・・」「!?」
READ A SORTED SEQUENCE FROM IN.A
READ A SORTED SEQUENCE FROM IN.B
MERGE THE SEQUENCES INTO A SORTED SEQUENCE …
 問題文を読み間違えてました、、、。“SORTED” SEQUENCE同士のMERGEでした(苦笑)。
 ええ、そりゃね、無茶でしたよ、うん。

 まぁお陰様で求められてもいないランダム2配列のマージ&ソートを「あの厳しいコード領域で(最重要)」実現した、とドヤ顔でキャプチャを貼り付けてもいいのですが、あいにく一部バグが残っておりまして。両方長さ0の配列が来るとスタックする(ハマる)。
 っていうか他のデバッグ中に関連バグ(実装漏れ)に気付きつつも「これもうコード入らない」、とひとまずそのまま流したらクリアしちゃって「あれ?」と。入力データ次第でおかしくなるのは分かってたけど、それが発生するのは3テストをパスした後のランダムテストで「たまに」のみだった。
 こういうのは大抵、1テスト目を抜けた後の2・3で想定外パターンでコケて「ですよねー」と、プログラマあるあるトラップ的なステージデザインが出来ているものだと思ってたんですが。そこはユーザ公募のステージデザイン故の甘さかなぁ?と思って調べてみたら、どうやらデータ生成に使うrandomのseedはユーザでは決められない(非推奨)ということらしい。つまり3テストで確実にいじめケースを網羅させられるようなステージデザインには出来ないのか。うーん、そこはちょっと残念。(まぁ狙ったデータの作れるseedを探す作業もラクではないけども)
 >参考:Introduction – TIS-100 Hacker’s Guide

 まぁそんな訳で、以前のボスのパワーアップ版かと思ったら全然違った、あるいは「そもそも倒し方を根本的に間違えていた」パターン。無駄な倒し方でえらい苦労することってよくあるよね。光明が見えてしまうと人間って諦めずにやっちゃうものだよね、と(笑)。
 ここでゲーム回想話に結びつけようかと思ったんですが、ちょっとピンポイントの例がすぐに出てこず、無念。
 強いて言うなればどんなに頑張っても倒せなかったボスというと、ハイドライド3のラスボス。職業を「怪物」にしてしまったが為に最後の最後でパワーアップされていたという無情極まりないオチ(狙って使った裏技ではあるけども、あれランダム発生だったよなぁ、酷いトラップだ(笑))

 ともあれ、件のMERGERの方は、その後も多少の紆余曲折はありつつも最終的にかなりすっきり収まった。何より何より。(基本的に平均スコアと同レベルか上に立つくらいを目標にプレイ)

 因みに言うと、hidden opcodeもhidden puzzleも、その他条件付き解法の実績も、正直に言えば大したこともないものばかりだった。SpaceChemではどれもそれ相応に歯応えがあって、ゲームプレイの「より一層のステップアップ」にきちんと繋がっていて良かったのだけれども。今回はなかなか活用の場を見出せない命令コードの紹介サンプルみたいな収まりどころでしかない。まぁことJROについてはサブルーチン化などのアイデアが出ることはあっても、それを実現・活用出来るほどのコード領域が足らない、というジレンマに悩まされている段階。
 他にも複数ノードを連携させての分散処理的なアイデアを出しても何かとコード制約に悩まされがち。もう少し柔軟性・拡張性のある仕様でも良かったんじゃないかなぁ?などとプレイしている最中に考えてしまったりも。ことSpaceChemが「一見して無限に発散してしまいそうな状況を、如何に収束に導いていくか」の案配が物凄く心地良かっただけに。
 正直に言えば今回はどうしても「アセンブラコードのガチガチな最適化」の色合いが濃すぎて、もうちょっと広がりがあっても良さそうに感じてしまった次第。

 なんだけれども、最終的に詰めたMERGERのコードというのは、「改めて振り返ると無駄な設計だった」コードが、制限上なかなか実現に至らなかったが為に、詰めに詰めて、遂には仕切り直したことで辿り着けたものではある。これが緩ーい制約だったら「やっつけコード」で終わってしまっていたのかもね。そういう意味では必要な制約だった、のだろうか。
 ただ、そういう「狭き門を潜り抜ける達成感」、いわゆるところのカタルシスは、今回は正直に言えば本当に微妙かな。マニアックすぎて自分ですらたまに引くかも(笑)。綺麗に収まった時はよくやったと思うんだけどね(表ラストステージは実にすっきり狙い通りにはまった思い出)。でもやっぱりある程度色々なコードを書ける幅があって「こんなコードも書いてみたぜひゃっほう」(?)みたいな遊びが出来ても良かったのではないかな、と思ってみたり。
 まぁそういう所は是非「TIS-200」に期待しましょう(笑)。
 RANDOM ACCESS MEMORYとか実装されたらどうなっちゃうのか。

 ともあれ最後まで頑張ります。