開閉UIに切替

リハビリ

 アイリが居た模様。ワンフェスかな。
 考えてみれば今年のこのタイミングこそこういう所に顔を出してみるべきだったのかなとちょっと思いました。(基本、人込みとか避けてしまう人ですが)

 まぁ今年の夏は「この星もう駄目だ」レベルなので、
 バイタルゲージとメンタルゲージの維持にこそ気を向けないといけないですが。
 それどころか先日のブチ切れ金剛ゲージの振り切れっぷりで色々と大誤算が発生してしまい。出遅れる間に書く内容まで変わってしまいましたよ。

 さて、先月は「折角だからPS4を活かそうキャンペーン」で休息を兼ねて幾つかゲームに手を着けたものの、実に触れづらい中途半端感(巻き込まれるようにEDF5も、キリ良く締めておきたかったんだけどもうプレイを忘れてしまった、、)。やはり甘い気持ちで半端にやるよりも、ここはもっと自分に向いたやるべき物をやらないと駄目だよなということで、リハビリをしようかと。
 以前に途中でご無沙汰になってしまっていたTIS-100を再開。
 「リハビリでエベレストに登るような真似をするな」と突っ込まれましたけどね。
 あ、はい、このネタが是非使いたくて持ち出しました(笑)。
 実のところは昨年末、PS4の前に本当にゲームリハビリとして手を着けていて。しかし一度書こうとする間に想定外の予定が舞い込んできたり、また忙しくなったりですっかりご無沙汰に。今度こそと申しますか。

 前回はきちんと一から復習したのに、半年経ったところでまた一からやるのもなぁと、何とかなるだろ的に突撃したのでそれこそリハビリにすらなっていない荒療治。
 しかもTIS-NET=公募ステージともなるとやはりマニアックな題材が多くなってくる訳で。
 SIGNAL AVERAGER、「平均値を出す」というお題では、理屈は「足して2で割る」だけだけれども、本作ではADDとSUBの加減算しか持たないCPU、除算はおろかシフト演算も持ち合わせてはおりません。ともなれば除算はひたすら除数を引いた回数をカウントする原始的アルゴリズムというのが前半ステージでの通常のお題だったけど、こちとら3桁の数を2で割るという最悪のループ数。当然ごく平凡に組んでも「ですよね」のスコアしか出ないので、如何に工夫して効率的なロジックを組むか、とやったところで初めて平均スコア(ヒストグラムの最頂点)に到達。
 いやぁ、本当にもうこれマニアしかやってないんじゃないかな?(笑)
 普段から「平均スコアかそれ以上」くらいを目安にプレイしていたけれども、皆こんな調子なのか。
 上記は分かり易い例を挙げただけで、実際もっと面倒くさいお題も当然出てきて、果たしてこんな調子でクリアまでにどれくらい掛かるんでしょうかね。

 などと書こうとしていた所でこの前気を削がれてしまったので、気分を変える為にもう一面くらい進めてみるかと思ったのが、正に運の尽きとなろうとは、、。

 いやぁ、見事に遭難しました。
 誰も助けてもくれないから自力で彷徨い続けて休日丸潰れの勢いで「俺何やってるんだろ」と早速挫け始めた自分が居りますよ(苦笑)。

 そもそも本当はこういう時には時間を置いてじっくりやるべきだったのだろうけど、ロジックは思い付いたけどコードが収まらないという状況故にいつまでも足掻いてしまった。
 折角自分のケツを叩く意味で「再開した」と書き残すと決めた矢先のこれでは二進も三進も行かず。「諦めたら試合終了」感が半端ないし、こういう時に下手に時間だけはあったのが災いして、意地になって片付けざるを得ない心境に。

 どうにも昔からSTACK MEMORYを使うステージは苦手というかすっきりしない。自分が知らない使い方があるのだろうかと不安になるほど。その仕様上、制御フローにコードを割かれるのでどうにも、ロジックを考えることよりもそれを実現する為のコード領域との格闘に時間を費やしてしまう。
 ただまぁ、どうにかこうにか終えたら(「SEQUENCE MODE CALCULATOR」)平均スコアから察するに「命令数を絞った代わりに低効率」のギチギチコードを先に作ってしまったっぽいので、つまりは本来はもっと素直な書き方、ないしは全く別のロジックがあるということか。
 しかし今回は他に使えそうなロジックがまるで思い浮かばないのが辛い。

 元々ギチギチのアセンブラ職人ではなくて、回路職人でもない。(強いて言えば今は可搬性とか可用性を重視したロジック・フローを考える時代だと思っているので)、ここまで頭の良いというか頭の構造の違う人達にはちょっと敵わない領域かなぁという思いが湧き出てしまったのが今回。

 まぁ一通り凹んだ後に、改めて情報収集。
 STACK MEMORYに関して、マニュアルで言及されている別紙(Patterns of Node Communication)なんてものは実際は存在しないので(謎の古いPCを拾ったというゲーム内設定の味付け文章に過ぎず)有志が作った解説サイトを覗いてみた。(Github
 どうやらやはり機能的には知っている範囲内。
 LASTとか、解説はされてるけど結局誰も使ってないじゃないかと。
 ただ以前にも同じくしっくりこなかったSORTERの解法例をちょろっと見てみたところ、成る程、これは実に頭の良い分散ロジックですね(笑)。
 まんま影響を受けても意味が無いので大筋の方向性を見るに留めたけど、こういうレベルで発想の転換が必要と。まぁ最大の問題はノード配置という気もするけど。今回悩んだのはそこで。

 まぁ今の力で足掻くしかないことははっきり分かったので、また躓く面も出てくるだろうけども、素直に後回しにするなり何なり、長い目ででもやっていければと思う。
 そもそもこのゲームの本番はこっちだよね。これは序章であって。
 っていうかそれからまた次のも出てるのか。他のもやってないし。
 躓いている場合ではない、、。

壮絶な回り道

 ターミナルでログを眺めたりソースコードを確認したりしながら出てきた問題点について、あーでもないこーでもないと考え事を膨らませた布団の中「!?」
 いや確かにさっきまで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=命令数、の各評価項目で、高速化したり、効率を犠牲にしてノード数を削ってみたりの突き詰め遊び。今回はちゃんと複数セーブできるよ!(笑)

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

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