●第255話●システムエンジニアの腕の見せ所
複数の連続する角度と進んだ距離情報を使って、出発地点の方角と距離を割り出すのは、作業としては割と単純だ。
ごく簡単に言えば、進んできた角度と距離の情報を全て三角関数を使って東西成分と南北成分に分解して足し合わせればよい。
高校生程度の数学知識は必要だが、パソコンを使用すれば容易に計算できる。
しかし異世界ではそうもいかないので、少々手間が必要だった。
「今手元にある情報はこんな感じで、進んだ角度と速さと時間――まぁこれは距離ですね。それが連続して出発地点であるA地点から到達地点であるB地点まで記録されている感じです」
そう言いながら勇は、テーブルに広げた紙に書き込まれた図の一つを指し示す。
そこには左下から右上に向けて、斜めの矢印が二本と数字が描かれていた。書かれている数字は、矢印の傾きを表す角度と長さを表す距離だ。
「ふむ」
「なるほど」
「こうして線を引いていただくと分かりやすいですね」
それを覗き込むエト、ヴィレム、アンネマリーは、それぞれ小さく頷く。
航海ログの内容を把握した勇が、その“手間”としてこれからやろうとしている計算の考え方を皆に説明し始めたところだ。
三角関数やら地球の数学的な話がメインになるので説明する気は無かったのだが、好奇心と学習意欲旺盛な三人に詰め寄られ急遽の授業と相成った。
口頭だけでの説明は不可能とみて、ひとまずログの内容を矢印にして図示しながら説明をしていく。
「で、出発地点の場所を特定して、こうやって一直線の最短距離で逆算できるのが理想です」
皆が頷くのを確認した勇は、最初の図の隣にもう一つ図を描き加えた。
こちらは右上から左下へ一本の直線が引かれている。B地点からA地点へ向かう最短距離を表す直線だ。
「ただ、この直線ルートをいきなり計算するのは難しいんですよ。この例だとログは二つだけですけど、実際はとんでもない数あって複雑ですしね」
「ああ、全部写すだけでも半日以上かかる量だったからねぇ……」
勇の言葉にヴィレムが、延々と壁に映し出されていた数字を思い出して渋面する。
「いきなりは難しい、という事は、いきなりでなければ複雑でも計算できるのでしょうか?」
「さすがはアンネ、その通り。手間をかけて計算したら割り出すことは出来る」
アンネマリーの質問に笑顔で答えながら、勇が更に図を描いていく。
「この斜めの動きは、それぞれこんな感じで“東西方向にどれだけ進んだか”と“南北方向にどれだけ進んだか”に分けることが出来るから、まずはそれを計算する」
斜めの線を斜辺とした直角三角形に、それぞれ距離を表す数字を書き込みながら勇が続ける。
「私のいた世界では、この斜めの線の角度と長さが分かれば、この左右の長さと上下の長さを求めることが出来る数式があったんだ」
いわゆる三角比とか三角関数のサインとコサインだ。
地球では古くより使われている数学で、現代でも計算こそ自動化されているが測量などには欠かせないものである。
「で、計算された東西方向の数字と南北方向の数字を全部足せば……」
そう言いながら勇が、計算された数字を足し合わせて新たな図を描いていく。
「なるほどのぅ」
「おおっ!」
「凄い!」
図と数字を見た三人が再び感嘆する。
今回勇がサンプルとしたログは、六十度の方角に二キロ、四十五度の方角に一キロ進んだと想定したものだ。
それぞれ東へ一キロ、北へ一・七キロと東へ〇・七キロ、北へ〇・七キロに分解できる。
それを足し合わせた数値、即ち東へ一・七キロ、北へ二・四キロが、A地点からB地点までのベクトル成分となる。
「この東西南北への距離が分かれば、とりあえず出発地点へは辿り着くことが出来ることになります」
今回のケースであれば、ゴールであるB地点から、真南に二・四キロ進んでから真西に一・七キロ進めば、スタート地点であるA地点へ辿り着けるだろう。
「ただ、それだと遠回りする事になるので出来れば直線距離で行きたい……」
そしてまた一つ図を描いていく。
「最初に言ったとおりいきなりは計算できないんですが、この上下左右の距離が分かれば、さっきとは逆に計算して、っと……。こうやって角度と距離をもとめられるという訳です」
そう言って勇は途中の計算式を書いて計算しつつ、A地点とB地点を結ぶ直線に二・九キロという数字と三十六度という角度を書き加えた。
「ただこの計算式の元になる数字って、切りの良い数字はほとんど無いので、距離が離れるほどどうしても誤差は大きくなりますけどね」
勇の言う通り三角比は極一部(三十度とか四十五度とか)を除いてほぼ無限小数だ。
プログラムにおける関数などが使えない現状、手計算で求めた近似値を使うしかないので、どうしても誤差が出るだろう。
「まぁ今回は海の先じゃからの。島なり陸なりがあるんなら、多少誤差があっても問題無いじゃろ」
「おおよそは正確なんだよね?」
「ええ。何キロ先の話かにもよりますけど、ある程度の精度は出るはずです」
「だったら良いんじゃないかな。そもそも絶対そこへ行く必要があるわけでもないんだし」
「そうですね。半分は浪漫みたいなもんですからね」
そんな話をしながら皆で笑い合う。
こうして思わぬ数学のレクチャーを終えた勇は、いよいよ実際の計算に取り掛かった。
◇
「ふぅ~、ようやく関数表が出来たぞ」
レクチャーを終えて個室に籠る事半日。黙々と何かを計算していた勇がペンを置いて、大きく伸びをした。
関数表とは、特定の数値に対する計算結果を表に一覧化してまとめたものだ。
一個百円のリンゴの売値の関数表であれば、一個で百円、二個で二百円、三個で三百円……といった具合に数字を並べれば出来上がりである。
今回勇が作っていたのは、三角関数表と呼ばれるものだ。
前述の通り、進んだ距離と角度が分かっている場合、その角度に対する三角比の値が分かれば、どれだけ東西と南北に真っすぐ進んだのかを計算する事が出来る。
しかしこの三角関数の値は、極一部の角度を除いて残念ながら整数でも無ければ一定の規則で増減するようなものでもない複雑な値だ。
一度角度が増える度に〇・一増えるとかであれば良かったのだが、その増え方はまちまちである。
なので勇は、〇・五度刻みでその値がいくつなのかを地道に手計算して一覧表にまとめた三角関数表を手作りすることにしたのだ。
アナログな表とはいえ馬鹿には出来ない。実際に地球でも、パソコンや関数電卓が一般的になる二十世紀の後半までは、三角関数表は技術者の必携ツールの一つで、測量や弾道計算、航海などに使われていた実用品である。
ちなみに〇・五度刻みなのは、今回の航海ログが七百二十段階、すなわち〇・五度刻みで方角を表しているためだ。
そして次の課題に向き合う。
「問題はログの数だなぁ……。見るだけで半日かかるんだから、手で計算してたら終わる前に寿命が先に来そうだ……」
そう勇が苦笑する通り、課題になるのは膨大な量のログである。
量もさることながら、表示させた場合に流れていく速度が速いため、書き留めるのでさえ難易度が高い。
「んん? これ、よく見たら直接無属性魔石から一件ずつ取り出して表示してる訳じゃないのか? あ、配列が使えるのか!!」
どうやって対応しようかとログの表示を行っている魔法陣をあらためて詳しく見ていた勇が、驚きの声を上げる。
配列――テーブルとも言われるそれは、ほとんどのプログラム言語に採用されている概念だ。
通常の変数が、一つの変数に対して一つの値だけを保存できる単体の箱なのに対して、配列は駅にあるコインロッカーのようにいくつもの値を保存できる。
その管理方法もコインロッカーと同じように、番号で行われるのが一般的だ。
100個の値を通常の変数で同時に扱う場合は変数も100個用意しなければならないが、配列を使えばbox(1)、box(2)……box(100)といった具合に一つの配列+数字で管理可能になる。
今回のように大量のデータを扱う場合など、色々と便利な仕様だ。
「おお、しかもこれ可変長だ!! これは捗るぞ……」
もう一段読み込んだ勇が、またも声を上げる。
配列には大きく分けて固定長と可変長の二つがある。
固定長はその名の通り、最初にそのロッカーの数を決める必要がある配列だ。最初に100個分と定義したら、100個しか値は格納できない。
対して可変長は最初にその数を決める必要が無く、後から値を格納した分だけ動的に大きさが変わっていく。
最初から格納するおおよその数や最大値が分かっていれば、固定長の方が分かりやすかったりもするが、今回のように数が未知数なケースでは可変長が便利だ。
なお、可変長の場合は厳密には配列と呼ばない事もあるが、今回それは横に置いておく。
こうして配列と言う強力な武器をまた一つ獲得した勇は、無属性魔石の中に保存されている航行ログを解析する魔法陣作りを開始した。
今回作る魔法陣の流れは大まかに以下のようになっている。
①無属性魔石から全てのログを配列に読み込む
②配列から一件分のログを取り出す
③角度の数字を確認して、それに対応する三角比の値を関数表から引用(三角関数表も別の配列にセット済み)
④三角比の値から東西・南北の移動距離を求める
⑤東西・南北の移動距離を積算
⑥ログのデータが無くなるまで②から⑤を繰り返す
⑦積算された移動距離から、スタート地点の方角と距離を逆算
⑧最終結果を壁に投影
処理――プログラムとしては非常にシンプルなものなので、勇は一時間ほどで魔法陣を描き上げた。
ポイントとなるのは⑥の処理だろう。
以前に発見し、これまでも幾度となく使ってきたGOTO文のおかげで⑥の処理を行う事が出来るため、一度起動したら放置しておけば計算が終わるので非常に効率が良いのだ。
もしGOTO文が無かったら、手作業で全てのログを計算するのと手間はほとんど変わらなかったに違いない。
単純な処理を、高速で間違えることなく繰り返し行う事が出来る、まさにプログラムの真骨頂だ。
また配列を発見したお陰でログも一気に取り出すことが出来るし、三角関数表をセット出来るのもありがたかった。
おそらく似たような方法で航海ログが解析されることを見越して、旧文明の者たちはこの仕様としたのだろう。
魔法陣を起動させたあと勇はしばらくその様子を見ていたが、終わりそうな気配はない。
自動で処理が行われるとはいえ処理するデータの量が膨大なので、やはり時間がかかるのだろう。
この日は魔法陣を起動させたまま一度館に戻り、翌朝再び勇がアンネマリーと共に研究室を訪れると、壁面にいくつかの数字が映しだされていた。
「どうじゃ? 計算は終わっとるか?」
「見た感じは終わってる?」
勇達のすぐ後に研究室にやって来たエトとヴィレムから声がかかる。
まだいつもよりだいぶ早い時間なのだが、二人も気になって仕方が無いのだろう。
「あはは、おはようございます。終わってますね。えーーっと……」
勇は笑いながら映し出された数字をメモしてから読み上げていく。
「ここから南に約二〇〇〇キロ、東に約一三〇〇キロ、直線距離で約二四〇〇。方位は……南から東寄りに三十三度なので、南南東と南東の間くらいですかね」
「二四〇〇か……」
「南東方向か……」
「遠いですね……」
その内容に、三者三様の答えが返ってくる。
反応はまちまちだが、皆一様にその遠さに少々呆然としているようだ。
「確か東京からグアムまでが二五〇〇キロくらいだったから、同じくらいかぁ。飛行機なら三~四時間だから、そこまで遠くは無いのかな?」
対する勇の感想は、まぁそんなもんかな、だった。
「え? この距離で遠くないのですか?」
その反応に驚いたアンネマリーが思わず尋ねる。
「うん。前にも言った空を飛ぶ乗物ならすぐ行ける距離だからね。決して近くは無いけど、遠くも無いかなぁ」
「「「……」」」
あっさり遠くは無いと答える勇に三人が絶句するが、無理からぬことだろう。
クラウフェンダムから王都まで直線距離にして約二〇〇キロ強。馬車で五日間の道のりだ。
最近でこそ魔動車のおかげで二、三日で行けるようになったが、この世界の人たちにとって移動とは、とにかく時間がかかるものという認識が強い。
ましてや二四〇〇キロメートル。これまでの最長移動距離であるクラウフェンダムから隣国プラッツォのメラージャまででも七〇〇キロほどなのだ。
想像もつかない距離と言ったところだろう。
「あ~~いや、でも今回は船だしなぁ。確か沖縄まで船で行ったときは結構時間がかかったな……。一日以上かかったよな?」
そんな三人の反応をよそに、勇はお金を節約するため片道を船にした卒業旅行の記憶を思い出していた。
「そういえば、ここからと言うか王国のある大陸から南東方面って、何があるんですかね?」
貧乏旅行の思い出から帰って来た勇が尋ねる。
「この辺りは湾になっていて、ほぼ真南に大きめの島がありますね。お隣のアルクメイヤー伯爵領です。それ以外ですと少し沖合に小さな島がある事は確認されていますね」
「うん。奥様の言う通りだね。逆に湾の外、大陸の東側は、ほとんど何も分かっていない。魔物が多いのと風が複雑らしくて、調査が難しいらしいよ」
貴族の娘らしいアンネマリーの回答を肯定したヴィレムが、遺物採掘者らしい回答を付け加える。
「なるほど、未知の領域なわけか……。まぁいずれにせよ長距離、長期間になるので、それに耐えうる船が出来てからの話ですね」
「そうじゃな。ひとまずは今作っとる漁船サイズを完成させんとな」
「ええ。食料の保存とか水上での魔物との戦闘とか色々と準備が必要ですし、慌てず一つずついきましょう」
「うむ」
「そうだね」
「そうですね」
こうして当面の大きな目的地を定めた勇は、その位置を大きく認めた紙を研究室の目立つところへ貼り付けた。
そして再び、マツモト男爵領の発展施策を進めていく。
次の施策は、驚異の万能素材“メタルリーチ”の安定確保についてだ。
ちょっと説明回です……
図無しでこの内容をまともに説明出来る自身が無かったので、初の図入りです!
週1~2話更新予定予定。
ブックマーク、評価いただけると喜びます!
↓お時間ある方、よろしければコチラもご覧いただければ……↓
https://ncode.syosetu.com/n4705if/
万年課長の異世界マーケティング ―まったり開いた異世界広告代理店は、貴族も冒険者も商会も手玉に取る