AtCoderのABC049C - 白昼夢 / Daydreamについての質問です。以下、問題文を引用します。
問題文
英小文字からなる文字列 S が与えられます。 Tが空文字列である状態から始め、以下の操作を好きな回数繰り返すことで S=T とすることができるか判定してください。
T の末尾に dream dreamer erase eraser のいずれかを追加する。
困っていること&試したこと
提出コード1で提出したところケースの4つ目以降で[RE](実行時エラー)と出ました。
提出コード2に変えて提出したところ[AC](正解)となりました。
提出コード1において、エラーになったケースではどのような状況だったのか…想像しましたが思いつきませんでした。どなたか、わかる方いらっしゃればご教示ください。
提出コード1
後ろ7~5文字が"dreamer", "eraser", "dream", "erase"のいずれかであれば、そこを削って再帰するアルゴリズムです。どれにも該当しなくなった時に残った文字列を返します。
python3
1def main(check_txt:str): 2 def pop_txt(check_txt:str, words:tuple): 3 for i in [7, 6, 5]: 4 if check_txt[-i:] in words: 5 return pop_txt(check_txt[:-i], words) 6 return check_txt 7 words = ("dreamer", "eraser", "dream", "erase") 8 result = pop_txt(check_txt, words) 9 if result == "": 10 return "YES" 11 else: 12 return "NO" 13 14print(main(input()))
提出コード2
"eraser", "erase", "dreamer", "dream"の順にreplaceで削った残り文字列を返すアルゴリズムです。
python3
1def main(check_txt:str): 2 def pop_txt(check_txt:str, words:tuple): 3 for w in words: 4 check_txt = check_txt.replace(w, "") 5 return check_txt 6 words = ("eraser", "erase", "dreamer", "dream") 7 result = pop_txt(check_txt, words) 8 if result == "": 9 return "YES" 10 else: 11 return "NO" 12 13print(main(input()))
自前のtest用コード
これを使うと、提出コード1でも2でも通りました。エラーケースはこのような単純なケースではないようです。
python3
1tests = ["erase", "erasedream", "dreameraser", "dreamerer"] 2corrects = ["YES", "YES", "YES", "NO"] 3for t, c in zip(tests, corrects): 4 assert c == main(t), f'期待する値[{c}], 入力値[{t}], 出力値[{main(t)}]'
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/30 14:05