Loading [MathJax]/extensions/tex2jax.js

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

コメントを残す

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