基本情報技術者アルゴリズムの問題を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がわからず、ググってコピペしました。
辞書のデータ型って、キーを参照してバリューを取得するのは簡単なのに、逆は少し手間がかかるのね。
また、今回の過去問、説明文からプログラムの機能を想像するのが難しかったです。
文字列の誤り検出ってのも、どんな場面で役に立つのか、よくわからないし、
割り算処理を繰り返して、判定できるロジックも、よくわからず。
このアルゴリズムを証明してる人いたら教えてほしい!
そろそろ基本情報技術者の勉強ちゃんと再開しないとな~
それでは、また^^