理系母の趣味はプログラミング

理系院卒、メーカー技術職の二児の母が、PythonやVBAで色々と作ってアップしていくブログです。

基本情報技術者アルゴリズムの問題をPythonでコーディングしてみた【平成29年秋】

過去問コーディング。
今回の問題は、文字列の誤りを検出するプログラムです。

過去問PDF「出典:平成29年度 秋期 基本情報技術者試験 午後 問8」

プログラム

#表1の文字と数値の辞書を生成
char_dict = {'_':0,'.':1,',':2,'?':3}
for i,c in enumerate(range(ord('a'),ord('z')+1)):
    char_dict[chr(c)] = i + 4

#関数getValueを定義   
def get_value(char):
    return char_dict[char]

#関数getCharを定義
def get_char(val):
    keys = [k for k, v in char_dict.items() if v == val]
    if keys:
        return keys[0]
    return None
    
def calc_check_character(input):

    l = len(input)

    N = 30
    sum = 0
    is_even = False
    
    for i in range(l,0,-1):
        value = get_value(input[i-1])#インデックスが0始まりの為
        if is_even == True:
            sum = sum + value
        else:
            sum = sum + (value * 2) // N + (value * 2) % N
        is_even = not is_even
        
    check_value = (N - sum % N) % N
    return get_char(check_value)

def validate_check_character(input):

    l = len(input)
    
    N = 30
    sum = 0
    is_odd = True
    ret_value  = True
    
    for i in range(l,0,-1):
        value = get_value(input[i-1])#インデックスが0始まりの為
        if is_odd == True:
            sum = sum + value
        else:
            sum = sum + (value * 2) // N + (value * 2) % N
        is_odd = not is_odd

    if sum % N != 0:
        ret_value = False

    return ret_value

#検査文字付文字列の生成例
print(calc_check_character('ipa__'))

#設問2
print(validate_check_character('ipb__f'))
print(validate_check_character('api__f'))
print(validate_check_character('pia__f'))
print(validate_check_character('__apif'))

#設問3
print(calc_check_character('_s__'))

出力結果

f
False
True
False
True
l

【過去問との主な相違点】
・文字と数値の辞書を作成するコードを追加
・関数getValueとgetCharを定義するコードを追加
pythonのインデックスは0始まりのため、変数inputを参照するインデックス値をi-1とした
・÷→//, ≠→!=

【感想】
これもほぼ過去問通りですが、文字と数値の辞書を作成するコードと関数getCharがわからず、ググってコピペしました。
辞書のデータ型って、キーを参照してバリューを取得するのは簡単なのに、逆は少し手間がかかるのね。
また、今回の過去問、説明文からプログラムの機能を想像するのが難しかったです。
文字列の誤り検出ってのも、どんな場面で役に立つのか、よくわからないし、
割り算処理を繰り返して、判定できるロジックも、よくわからず。
このアルゴリズムを証明してる人いたら教えてほしい!

そろそろ基本情報技術者の勉強ちゃんと再開しないとな~

それでは、また^^