88進数などを作る → できても2桁の省略
2桁の省略とはどういうことでしょうか?
88進数を作るとこんな感じになって37桁から19文字になります。
asciiで問題が起きそうにない文字を利用すると93進数まで作れますがその場合も19文字でした。
python
1data = 1982398471093871098719831489020412341
2
3#t = ' !"#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~'
4t = ' !"#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxy'
5
6def encode(d, r = ''):
7 s = len(t)
8 (d, m) = divmod(d, s)
9 r = t[m] + r
10 if d == 0:
11 return r
12 return encode(d, r)
13
14def decode(d, r = 0):
15 r = t.index(d[0]) + r * len(t)
16 if len(d) > 1:
17 return decode(d[1:], r)
18 return r
19
20print(data, len(str(data)))
21
22s = encode(data)
23print(s, len(s))
24print(decode(s))
あとは冗長性以外では、出現頻度に差があれば、その頻度によってビット長を変えて割り当てるのもありですね。
その場合は辞書を内蔵する必要があります。
例えば、0が他のすべての文字と同じだけ出現する場合には
0 - 0
1001 - 1
1010 - 2
1011 - 3
1100 - 4
1101 - 5
11100 - 6
11101 - 7
11110 - 8
11111 - 9
6,7,8,9が5ビットになるので、もっと良いマッピングはできますが、あくまでイメージです。あとこれだと桁数や終端がないため、それもマッピングする必要があります。
で、その後できたバイナリをbase64などで符号化すれば文字列ができます。
まあ、汎用的にやろうとすると、gzipなどの圧縮プログラムにはとても勝てないですが、独自の規則性があり、それを利用してプログラムに内蔵させれば、よりよい圧縮率になるかもしれません。