はじめに
『ちいかわぽけっと』というゲームが先日配信された。
蓋を開けてみたら討伐を放置することがメインのゲームだったわけだが、パラメータの表示などに違和感があった。
数字の後ろに「a」などのアルファベットがついている。
ゲームを進めていくと、このアルファベットはどんどん進んでいった(この記事を書いている時点ではf
まで確認した)。
今回はこのアルファベットについて調べてみることにした。
挙動の調査
とりあえず数字の表示について調べてみた。
記事を書いている今もちいぽけを放置しているので、画面に表示されている数値を列挙してみる。
- 107e
- 79.4d
- 4.13e
なるほど、おそらくは有効数字三桁+アルファベットという形式で表示されているようだ。
つまり、ちいぽけの数値表示は以下のような表現を取ることができると思われる。
A[a-z]
ここで、A
は有効数字三桁の数値、a-z
はアルファベットの小文字を表す。
また、A
については$1 \leqq A < 1000$が成り立っている。
これらの事実から、アルファベットが切り替わるタイミングで、数値部分が$1/1000$されることが分かる。
つまり、実際の数値は有効数字部分に$10^3$をアルファベットの分掛けたものになるというわけである。
変換プログラム
簡単だが、ちいぽけ表記を実際の数値にするには以下のようなプログラムを組めばよい。例としてPythonの関数として実装してみた。
def convert_chipoke_number(chipoke_number: str):
if 'a' <= chipoke_number[-1] <= 'z':
# 末尾がアルファベットならその部分を取得
alpha = chipoke_number[-1]
else:
# 末尾がアルファベットでなければそのまま返す
return chipoke_number
# 数字の部分を取得
number = chipoke_number[:-1]
# アルファベットの数値を計算
alpha_value = ord(alpha) - ord('a') + 1
# 実際の数値を計算
actual_value = int(float(number) * (10 ** (3 * alpha_value)))
return actual_value
コメントにある通り、ord
関数を使ってアルファベットの順番を取得し、実際の値の計算に利用したものである。
以下のリポジトリに使用できる状態で置いておく。
考察
ちいぽけ表記では、数値が大きくなるにつれてアルファベットが進んでいくだろう。しかし、アルファベットは26文字しかないわけで、このままだと999z
でカンストしてしまうだろう。
似たようなゲームではab, ac, ...
と続くようなので、おそらくこのような形式になると思われる。
ただ、少しTwitterで調べた限りz
まで到達している人は見当たらなかった。z
の次がab
となるかについての真偽は調査中である。
とりあえずアルファベットの仕組みは分かったのだが、なぜこのような形式なのだろうか、そこを少し考察してみる。
以前『カイジ 闇の黙示録』というゲームをやったが、そのゲームは稼いだ金額を通常の10進数で表示していた。
そのため、int
型の最大値すなわち$2^{31}-1$(約21億)。までしかお金が稼げなかった。24億脱出編の再現が不可能である。
他のゲームでもカンストといえば$2^{31}-1$が多いと聞いたことがある。
ちいぽけで採用された「アルファベットを使う」という形式は、このようなカンストを回避することに有用だと考える。仮にz
までしかなかったとしても、これは$999\times (10^3)^{26}$までの数字を表現できる。おおよそ$10^{81}$であり、無量大数よりも巨大である。『ガンダムトライブ』も真っ青の数値だ。
以上のことから、ちいぽけで採用されているこの記法は、巨大な数を扱いやすくするための工夫であると考えられる。