DigitalArts プログラミングコンテスト2012 A – C-Filter をPython3で解く

Share

AtCoder上にある問題のうち、AtCoder Problemsでdiff 800以上と判定されているものを順番に解いていく企画。
基本的な考え方は全てコード中のコメントに入れてあるので、参照のこと。

出典:
DigitalArts プログラミングコンテスト 2012 A – C-Filter

タグに正規表現と入れたが、特に使わずに解いている。
使えば多少楽に解けるかもしれない?という程度。

地道に考えれば、そこまで難しいところもなく、基礎的かつ真面目なループと条件分岐の実装力が問われる問題だと思われる。

とか偉そうに書いているけど、ふふーんと適当に通そうと書いた結果、結構間違えてたりします、ハイ。基礎的かつ真面目なことができてない……コンテスト中じゃなくてよかった……。

# DigitalArts プログラミングコンテスト 2012 A - C-Filter
# https://atcoder.jp/contests/digitalarts2012/tasks/digitalarts_1
# tag: 文字列 フィルター 正規表現 高橋君

# 単語ごとの判定なので、単語にばらしてから各NGワードと
# 比較していくのが簡単だと思われる。
# 正規表現を用いてもいいが、ここでは真面目に(?)
# 実装してみることにした。
from collections import defaultdict
def main():
S = input()
N = int(input())
ng_words = [input() for _ in range(N)]

# せっかくなのでNGワードを長さ別に整理しておく
# やってもやらなくても大差ないので、後で長さチェックを
# 行ってもよい。
# defaultdict(list) にすることで、無いキーを指定されても
# [] (空リスト)を返すようになっている。
ngw_by_len = defaultdict(list)
for ngw in ng_words:
ngw_by_len[len(ngw)].append(ngw)

result = []

# scrblbugは for (while) ~ else 大好きっ子なので、
# 一見おぞましい書き方になっている。
# ここでの else は、ループが途中で break されずに
# 最後まで回りきったときにのみ実行される。
# 素直にフラッグを作成して実装するほうが分かりやすいかも。
for wd in S.split():
for ngw in ngw_by_len[len(wd)]:
for i in range(len(ngw)):
if ngw[i] == '*':
continue
if wd[i] != ngw[i]:
break

# 文字チェックが最後まで行き着く=NGワードの条件を満たす
# なら、****にして break。ここの break は、2 個目のfor
# に対して働く。
else:
result.append('*' * len(wd))
break

# NGワードを全部パスしたら、そのまま配列に入れる
else:
result.append(wd)

print(' '.join(result))

main()
Share

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です