もしマイナンバーがひらがなだったら
マイナンバーカードが健康保険証として使えるようになるが問題が起きているという記事がありました。
健康保険証 「誤り3万件」が映すマイナンバーの不思議: 日本経済新聞
データの不整合があり、その原因の多くはマイナンバーの誤入力ではないかというものです。
12桁もある数字の入力なので誤入力はありえます。チェックデジットはあるもののそれも10件に1件の割合でスルーしてしまいます。
もしマイナンバーがひらがなだったら桁数が減って入力ミスも減るのではないか。
試してみました。
ひらがなは五十音と言われますが重複がありますので次の46音とします。
あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん
「あ」を0、「い」を1、「ん」を45としてこれらの順列で数を表すことを考えます。
つまり46進数です。
999999999999の対数(底46)は7.0107ですので桁は8になります。
12桁の10進数は8桁の46進数で表せます。
実際に変換するプログラムを書いてみました。Pythonです。
def num2kana(num):
kana_text = "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん"
base = len(kana_text)
print("base", base)
n = num
ks = []
while n > 0:
amari = n % base
k = kana_text[int(amari)]
ks.append(k)
n = (n - amari) / base
return "".join(ks)
kana_text = "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん"
base = len(kana_text)
print("base", base)
n = num
ks = []
while n > 0:
amari = n % base
k = kana_text[int(amari)]
ks.append(k)
n = (n - amari) / base
return "".join(ks)
これを使うと「999999999999」は「やうきかしはせう」で表せます。
12桁の数が8桁のひらがなになりました。大した短縮にはなりませんでした。
ついでに復号用のコードも書いてみました。
def kana2num(kana):
kana_text = "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよわをん"
base = len(kana_text)
num = 0
for i, k in enumerate(list(kana)):
num += base ** i * (kana_text.find(k))
return num
kana_text = "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよわをん"
base = len(kana_text)
num = 0
for i, k in enumerate(list(kana)):
num += base ** i * (kana_text.find(k))
return num
[ 2021年4月8日 | カテゴリー: ニュース | タグ: マイナンバー ]
« チーム別の記録をグラフ化する「プロ野球チーム別記録」 | ターミナルの表示を変える方法 »
コメントを残す