基本情報技術者 2011年 春期 午前(科目A) 問04
問題文
次の表は、文字列を検査するための状態遷移表である。検査では、初期状態をaとし、文字列の検査中に状態がeになれば不合格とする。解答群で示される文字列のうち、不合格となるものはどれか。ここで、文字列は左端から検査し、解答群中の△は空白を表す。

選択肢
ア:+0010
イ:-1
ウ:12.2(正解)
エ:9.△
🔒 解説は解答すると表示されます
有限オートマトンによる文字列検査【午前解説】
正解の理由
正解は ウ です。遷移表に従って1文字ずつ現在状態を遷移させると、文字列 "12.2" の処理中に状態がeとなるため不合格となります。特に、最初の2文字で状態bになり、小数点でdに遷移した後にさらに数字が来ることでd→数字の遷移がeになり、検査中にeへ到達します。問題は「検査中に状態がeになれば不合格」としているため、処理の途中でeになった時点で不合格です。
解法ステップ
- 各選択肢の文字列を左端から1文字ずつ読む。△は空白とする。
- 各文字を「空白/数字/符号/小数点/その他」の5種類に分類する。
- 現在の状態と文字種から遷移表を参照して次状態を決める。
- 次状態がeになった時点でその文字列は不合格と判定し、処理を中止する。
- どの文字でもeにならなければ合格と判断する(本問では合格/不合格の2値判断)。
選択肢別の誤答解説
- ア: +0010
- 遷移:a(初期)→'+'(符号)でc、'0'でc→b、その後は数字でbに留まる。eに到達しないため合格。
- イ: -1
- 遷移:a→'-'(符号)でc、'1'でc→b。検査中にeに遷移しないため合格。
- ウ: 12.2
- 遷移:a→'1'でb、'2'でb、'.'でb→d、最後の'2'でd→数字によりeに遷移。途中でeになったため不合格。
- エ: 9.△(末尾が空白)
- 遷移:a→'9'でb、次に空白でb→aに戻る。eに到達しないため合格。
よくある誤解
- 「評価は最終状態のみを見る」と考える誤解:本問では途中でeになれば即不合格なので途中の遷移を必ず確認する必要があります。
- 「△を空文字(何もない)と解釈する」誤解:△は空白文字(スペース)を表します。空文字(長さ0)とは別扱いになる点に注意してください。
- 「小数点の後の数字は許されるはず」と考える誤解:表に従うとd(小数点後の状態)から数字へ遷移するとeになるため、この表では小数点直後に数字を続けると不合格になります。
補足コラム
この問題は有限オートマトン(状態機械)問題の典型です。重要なのは「途中で到達する状態」も判定に影響する点と、文字を「カテゴリ」に分類して表を参照する手順を確実に行うことです。実務的にはエラー状態(ここではe)は吸収状態(以後ずっとeになる)として扱われることが多く、検査を中断してエラーハンドリングに移る設計が一般的です。
参考として簡単なシミュレータ(Python)を示します。遷移表を辞書で表現し、文字列を検査します。
trans = {
'a': {'space':'a','digit':'b','sign':'c','dot':'d','other':'e'},
'b': {'space':'a','digit':'b','sign':'e','dot':'d','other':'e'},
'c': {'space':'e','digit':'b','sign':'e','dot':'d','other':'e'},
'd': {'space':'a','digit':'e','sign':'e','dot':'e','other':'e'}
}
def char_type(ch):
if ch == ' ':
return 'space'
if ch.isdigit():
return 'digit'
if ch in '+-':
return 'sign'
if ch == '.':
return 'dot'
return 'other'
def check(s):
state = 'a'
for ch in s:
state = trans[state][char_type(ch)]
if state == 'e':
return False # 不合格
return True # 合格
print(check("12.2")) # False -> 不合格
FAQ
Q1: △が文字列の最後にある「9.△」は空文字と同じですか?
A1: いいえ。△は空白文字(スペース)を表します。空文字(長さ0)は別扱いで、空白がある場合は遷移表の「空白」列を参照します。
A1: いいえ。△は空白文字(スペース)を表します。空文字(長さ0)は別扱いで、空白がある場合は遷移表の「空白」列を参照します。
Q2: 検査は最終状態のみで判断しますか?
A2: いいえ。本問では「検査中に状態がeになれば不合格」と明記されているため、途中でeに到達した時点で不合格となります。
A2: いいえ。本問では「検査中に状態がeになれば不合格」と明記されているため、途中でeに到達した時点で不合格となります。
Q3: 状態eからの遷移が表にないのは問題ですか?
A3: 表にeの行がない場合、通常はeが吸収的なエラー状態として扱われるため、到達したら確定で不合格と判断します。
A3: 表にeの行がない場合、通常はeが吸収的なエラー状態として扱われるため、到達したら確定で不合格と判断します。
関連キーワード: 有限オートマトン、状態遷移表、文字種分類、受理状態、遷移シミュレーション、符号判定、空白処理

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

