2進数を用いたセーブデータ軽量化計画(2)

 
なんと即日コメント欄にてアージュさんが別の案を提案して下さいました。
 
ちょっとしたコメントが付いたら嬉しいなと思ってた程度だったので、
実装までして説明してくださったのには驚きと感謝と
その他なんだかよくわからないいろいろな感情が。ありがとうございます。
 
提案していただいた方法の概要は以下のような感じでした。


・108文字からなる文字列を1つのデータとして記録する
・一文字一文字を1つ1つのフラグとみなし、文字列として参照・変更する
 
000000011110100110100000000…
数字としてみれば桁数は2^108の32桁より大幅に大きくなってしまいますが、
計算を一切行わず、終始文字列として処理しているため、昨日のような問題は生じません。
 
また、一人あたりの記憶スペースとして一文字がまるごと与えられるので
0・1以外の文字にも意味を持たせれは複数のフラグを一文字で表現することも可能です。
(数字のみならず、アルファベット、その他まで使えば表現できる値は文字の種類だけ存在)
 
ぱっと見で意味がわかってしまうのでセーブデータ改竄に弱いかなと思ったんですが、
セーブ前に暗号化を施すなどすれば対応は可能ですね(※面倒くさいという致命的な弱点あり)
 
 
よそで、某氏が「フラグ三本を一文字で表現して並べれば」と提案してくれました。
要は昨日のあれの簡易版で、パーミッションのように0〜7の数字を延々と並べるというものです。
 
確かにその程度の数に落ち着かせておけば、オーバーフロー(あるいはアンダーフロー)という問題は間違いなく解決されるんですが
実際のところ、何本を何桁で管理するのが計算可能な範囲では一番効率がいいんだろうか? なんてことをふと疑問に思ったので確認。

1桁 3本まで 一文字当たり 3本
2桁 7本まで 一文字当たり 3.5本
3桁 10本まで 一文字当たり 3.33本
4桁 14本まで 一文字当たり 3.5本
5桁 17本まで 一文字当たり 3.4本
 
X桁 (X * 3 + X \ 2)本まで
 
一文字当たりの最大値 (X * 3 + X \ 2) / X = 3 + (Xが2の倍数のとき最大値0.5) = 最大で3.5
なるべく無駄なくやるなら桁数は2の倍数が良くて、
それなら2桁あるいは4桁あたりが一番扱いやすそうな印象です。
 
 
バグって動かないような昨日の方法ならともかく、
この2案に絶対的な優劣というものは存在しません。
 
フラグが1キャラに対して1本でいいなら下の修正案が効率の面で有効だと思いますが、
フラグを複数本扱う予定があるならアージュさんの提案された方法に切り替えておいたほうが
最終的なメリットは大きくなるでしょう。
 
 
私事で恐縮ですが、実は今のところ扱う予定のあるフラグは1キャラ当たり2本だったりします。
 
二進数法で2つ管理するか…
今後も増えると予想して文字列として管理するか…
かなり億劫なんですが、三進数法の導入に挑戦してみるか…
 
そういう意味でこの件はまだまだ要検討だったりします、はい。
 
こんだけ書き殴っといてオチなしかいというツッコミもあろうかと思いますが、
こういうのは考える過程を楽しむものだと思うので、オチを求めたら負けです。
 
 
アージュさん、某氏、いろいろとものを考えるきっかけを戴き、ありがとうございました。
また何かが頭から漏れ出す日が来るかもしれませんので、その時はまたよろしければお付き合い下さい。