壮絶な回り道

 ターミナルでログを眺めたりソースコードを確認したりしながら出てきた問題点について、あーでもないこーでもないと考え事を膨らませた布団の中「!?」
 いや確かにさっきまで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とか実装されたらどうなっちゃうのか。

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

裏面トライするほど強くないけど

 TIS-100の解法に悩みすぎて、考えながら寝落ちして半分夢の中で解を構築しながらいつのまにか仕事の障害対応の話が紛れ込んでダークブルーな気分で目が覚めた今日この頃ですが皆さん如何お過ごしでしょうか。(いやもう正夢にならないことを祈るしかないよね)

 そんな訳で「TIS-100」
 一応最初の課題一覧はクリアして「100PERCENT_V1」実績も取得。残りは裏面的な.NET(ユーザ公募ステージ)になるのでSpaceChemの感覚で言えば一区切りのところ。
 しかしラスト一個手前の「SEQUENCE SORTER」に思いのほか手こずって、ラストステージは実にあっさり解けてしまったものだから拍子抜け。中ボスにビビってたらラスボスは余裕だったという奴です。
 でもって空けて裏面.NETの1stステージ「SEQUENCE MERGER」は2配列をマージしながらのソート。散々手こずった中ボスがいきなりパワーアップして現れたら流石に凹みますよ(笑)。
 このゲームはただ悪戯にコードを組めばいい訳ではなく、常にコード長制約とノード配置制約との戦いなので、現状の(正直苦し紛れ感の強い)ソート実装の拡張では収まる筈もなく、「どうすんだコレ」と。まずは最初のソートの手直しからだと、ソートアルゴリズムの復習から始めたりと一からやり直しの大改革も考えたのだけれど、それこそ全く見当も付かず途方に暮れる次第。

 そもそもの話として、裏面的な.NETに何処まで手を着けるか。
 SpaceChemでは順次追加されていくオマケステージとしての扱いがはっきりしていて、表側でゲームとしてはひとしきり完成していたので、裏は何面かをプレイしたまま中断してそのまんま忘れてしまっていた。(所詮は「裏・バベルの塔」を途中リタイアしたレベルの実力なので、全国全世界のマニアに敵うとは到底思っていないのです)
 ただこの点、今回のTIS-100は上述の通り若干拍子抜けで終わったし、それに何より内容として正直まだあまり盛り上がらないままの状態。
 SpaceChemはステージが進むごとにコマンドが解放されてそれ相応にパズルも複雑化するという、良い難易度上昇の見本のようなゲーム構成だったので(自分があれを評価している大きな要因)、表側で十分充実したゲームプレイが堪能できた。それに対し、今回はてっきりopcodeの種類が増えていくかと思えばそれもなく、途中でスタックメモリが増えた他は特に無い。他にランダムアクセスメモリの拡張記述もゲーム内CPUマニュアルにはあるのだけど、あくまで「当時のマニュアル」という雰囲気作りの記載なのか否かがまだ分からない状態。
 なので正直に言えば今回はまだ消化不良。

 ここでちょっと実績を見返すと、
img
 hidden opcodeとhidden puzzleとある。
 puzzle(=ステージ)がhiddenって何だよ!って話ですが(笑)。いや隠し通路とかあるゲームじゃないんで、、。せいぜいマニュアルに「??」がついているF2キーが鍵だろうか?というところ。
 一方、hidden opcodeは隠し命令ということで気にはなるけど、crashとあるくらいだから実用的なものではないのかもしれない。
 とはいえこれは解かないとやり終えたと言えないよなー、と。ヒントになりそうなのはゲーム内でステージごとに見られる断片的なテキストコード(機械を修復しながら発掘したという設定)。まぁフル英語なのでかなり解釈は怪しいというか読めてませんが(トホホ)。
 SpaceChemでもストーリーテキストが随時追加されていてそれこそ表側で完結していたんだけど、今回TIS-100ではこれが裏面.NETにも続いている。更に今度はチャットログが掘り返されて、これはって話が展開されたところで丁度切れている。あ、こりゃ続きを読むしかないだろ!と(笑)。すみません、めげずに頑張ってみます。

 パズルゲームのモチベーションの継続としてご褒美というのは重要なのだなぁと。この場合はご褒美って程じゃないですが、何かしらの継続の切っ掛けというものとして。それこそFC時代、ゲームデザイン上全く脈絡のない女の子絵(非エロ)が出てくるパズルゲームの紹介記事を読んで、「エロゲーじゃあるまいし何だこれ」と思っていた若い頃の記憶が蘇りました。今なら分かってしまう自分が悲しい(笑)。っていうかその手のご褒美要素とパズルの組み合わせがむしろ昔からの定番か。

 ともあれ、よくよく思い返すとやっぱりソートコードは「これ何かわざわざ面倒な組み方してないか?」と思い始めたところ。まぁコーディングにはよくある話ですね。
 ただ一度始めると夜が更けてしまうのでまた来週かな、ということで経過報告までに。

TIS-100

 歪んだ絵をさっさと直して仕上げるとか色々やるべきことはあるんですが。
 まぁようやく節目に辿り着いて放心状態からの障害対応みたいなところで結局心の安まる時がなかなか見出せておりません。
 強いて言うなれば、「やっぱり人は信用しちゃいけねえな」という語弊のありまくる表現を言い換えれば、「如何に担当者のポカをきちんと洗い出せるか」が今後の課題ということになりますか。
 ただ、大掛かりなプロジェクト管理体制を作る余裕があるのならまだしも、こちとら1から100まで面倒見てる余裕なんてないし、そこまで面倒見なきゃならんのならバイトで十分なんだよと言いたい本音はありつつも。
 まぁ一番害も少ないところで言えば、ド素人並みのゴリ押しロジックコードにブチ切れ金剛、ってなところでしょうか。

 そんな訳で本日のお題。

 我が敬愛するSpaceChemのZachtronics製作の新作が出たというので見てみました。
 > TIS-100

 こ、これは、、、、。
 手っ取り早く言えばアセンブラ。というかそのまんま。
 前作から「プログラマの思考が求められる」等と言われてはいましたが、よもや「プログラミングそのもの」を出してこようとは。
 無論、ただのアセンブラなら既存のCPUでコーディングすればいい訳で、架空の機械を仕立ててちょっと特殊ルールのアセンブラを構築してみたので、それで色々な処理のロジックを考えてみましょうねと言ったところ。うん、プログラミングそのものですね(笑)。(昔の機械をフリーマーケットで入手したとかいう設定だったと思う。こういう設定には心くすぐられる。)

 特徴としては、非常に単機能な演算ノードを幾つも組み合わせて並列処理を行う構造。
 レジスタはACC一個と保存専用のBAKしかなく、各ノードの命令数(プログラムの長さ)はたった15。
 入力値の条件分岐も、数値の加減算も、ループのカウントを行うのも、何をするにもACCしかない。なので単純な繰り返し処理を組むところから自分でコーディングのセオリーを考えて行かないといけない。加えて長々と処理を記述している余裕もないので、効率を求めるなり可能であれば分散するなど考えていく必要がある。
 単にアセンブラ知ってりゃ書けてしまう、というのでは意味がないからね。「こうすりゃいいのにどうすんのよ」という、パズルゲームとしての基本的な悩ませ方は押さえていると思う。

 とはいえ、本当に「ただのプログラミング」なので(大笑)、ぶっちゃけこれを人に勧めたらパーフェクトに基地外扱いされる自信はあります。友人の言葉を借りれば、「数学者がフーリエ変換おもしろいよと言うようなもの」。


 以下、具体例として、
img
(もちろん、取り敢えずクリアしたレベルのまだ煮詰めてない物ですが)
 入力された数字列を、0区切りで、それまでの個数と合計値を計算して出力する、という例題。
 単に0が出るまで加算してカウントするだけなんですが、そこは先のACC1個+BAKのみの問題がありまして。入力値、合計値、カウント、の3つを保持する事ができないので、手っ取り早く加算とカウントでそれぞれを並列処理。
 後はここにZachtronics社お馴染み?としてCycles=処理時間や、Nodes=ノード数、Instructions=命令数、の各評価項目で、高速化したり、効率を犠牲にしてノード数を削ってみたりの突き詰め遊び。今回はちゃんと複数セーブできるよ!(笑)

 そんな訳で、今回本当に分かり易いまでのそのまんまプログラミングパズルなので、ある意味プログラミングのロジックの鍛錬にはいいんじゃないかな、とかふと思ったりするんですけどね。いっそ技術系大学生の教材にしてみては如何でしょうか(ぉ)。

 いやほんと最初の話に戻りますが、ぶっちゃけ「これを最低限解ける人と仕事したい(仕事振りたい)」とちょっと思いましたとさ。やるやらないから出来る出来ないまで、そもそも真面目に取り組まないと解けないくらいの制限はあるので。
 ま、言うほど自分も得意でも何でもないぶっちゃけ凡族の一人なんですが。これくらいは出来る技術者でありたいよね、と思いたく。