# 2019s 券売機 # --- 準備:データ構造と定数の定義 --- # イベントインデックスを取得する関数(擬似的な定義) def get_event_index(event_code): # 本来はevent_code(3桁の文字列)を引数に、遷移表の列番号を返す # ここでは辞書のキーとしてevent_codeをそのまま使うため、値をそのまま返します return str(event_code) # 状態遷移表 (表2 status_table) のデータ構造 # status_table[現在の状態][イベント] = { 'status': 次の状態, 'discount': 値引き額, 'accepted': 発券可否 } ACCEPT_INDEX = "CHECK_ACCEPT" # 発券可否判定用の仮想的な列インデックス status_table = { 0: { "110": {"status": 2, "discount": 0}, "111": {"status": 1, "discount": 0}, }, 1: { "401": {"status": 2, "discount": 0}, }, 2: { "200": {"status": 2, "discount": 0}, "210": {"status": 4, "discount": 0}, "212": {"status": 3, "discount": 0}, "300": {"status": 5, "discount": 0}, "310": {"status": 5, "discount": 0}, ACCEPT_INDEX: {"accepted": True} # 状態2は発券可 }, 3: { "402": {"status": 4, "discount": 0}, ACCEPT_INDEX: {"accepted": False} # 状態3は発券不可 }, 4: { "210": {"status": 4, "discount": 0}, "212": {"status": 3, "discount": 0}, "310": {"status": 5, "discount": 50}, # ここで値引き発生 ACCEPT_INDEX: {"accepted": True} # 状態4は発券可 }, 5: { "300": {"status": 5, "discount": 0}, "310": {"status": 5, "discount": 0}, ACCEPT_INDEX: {"accepted": True} # 状態5は発券可 } } # --- 判定プログラム (図4) --- def judge_order(order): status = 0 # 状態番号 amount = 0 # 注文金額 discount = 0 # 値引金額 order_count = len(order) # 手順(2)~(7)のループ for i in range(order_count): # [ウ] 注文金額の加算 amount = amount + order[i]['A'] # [エ] イベントコードの算出 # (N*100 + S*10) に O(一の位)を足して3桁の数にする event_code = (order[i]['N'] * 100 + order[i]['S'] * 10) + order[i]['O'] event_index = get_event_index(event_code) # [オ] 値引きの金額を取得し、値引金額に加算する discount = discount + status_table[status][event_index]['discount'] # [カ] 次の状態番号を取得して、状態番号を更新する status = status_table[status][event_index]['status'] # (6) 次の状態番号が E (Error) だった場合 if status == "E": print("エラー終了") return # [キ] 発券の可否を判定 # accepted という変数に、表から取得した論理値を代入 accepted = status_table[status][ACCEPT_INDEX]['accepted'] # 正答例:「accepted が true に等しい」 if accepted == True: print(f"注文完了! 支払金額: {amount - discount}円 (内、値引き: {discount}円)") print("発券ボタンの状態: [有効]") else: print("発券ボタンの状態: [無効] (注文を完了させてください)") # --- 実行テスト (鮭定食セットの例) --- test_data = [ {'name': '鮭定食', 'N': 1, 'S': 1, 'O': 0, 'A': 450}, # メイン {'name': '野菜サラダ', 'N': 2, 'S': 1, 'O': 2, 'A': 100}, # サイド1(オプション必須) {'name': 'ゴマドレ', 'N': 4, 'S': 0, 'O': 2, 'A': 0}, # オプション {'name': 'みそ汁', 'N': 3, 'S': 1, 'O': 0, 'A': 60} # サイド2(ここで値引き成立) ] judge_order(test_data)