私自身が表題の問題を解いた時のプログラムについて解説します。
問題の詳細は「Colorize問題」(CodeIQ)を参照してください。
仕様
ある検索ワードで、ある対象ワード群を検索し
各対象ワードが完全一致していたら黄色
部分一致していたら赤
にしてください。
色付けは以下の文法とします。
例えば hoge を黄色にするなら
[hoge]
hoge の ge を赤にするなら
ho=ge=
にしてください。
標準入力
・1行目は検索ワードです。[a-z]からなる1-10文字の文字列で構成されます。
・2行目は検索対象です。[a-z]からなる1-10文字の文字列がスペース区切りで与えられます。
スペースで区切られた各文字列を対象ワードと呼びます。
・対象ワードは1-5個入力されます。
例:
ge
hoge hige hege ge
標準出力
・対象ワード群を仕様に従って色付けした結果を出力してください
・検索ワードと対象ワードが完全一致した場合は該当対象ワードを黄色に色付けしてください
・検索ワードと対象ワードが部分一致した場合は該当対象ワードを赤に色付けしてください
・検索ワードにマッチしない箇所は色付けせずにそのまま出力してください
例(入力の例に対する出力の例)
ho=ge= hi=ge= he=ge= [ge]
その他の仕様
・標準入力の末尾には改行があります
・標準出力の末尾に改行をつけてください
・標準入力の仕様で説明した内容以外の入力は行われません(不正入力に対するチェックは不要)
Samples
Sample1
Input
hige
hoge hige hege
hoge [hige] hege
Sample2
Input
ge
hoge hige hege
ho=ge= hi=ge= he=ge=
Sample3
Input
ge
hoge hige hege ge
ho=ge= hi=ge= he=ge= [ge]
Rubyで解答しています。
#!/usr/bin/ruby def solve(s, ws) ret = [] for w in ws if s == w then ret << '[' + w + ']' else ret << w.gsub(s, '='+s+'=') end end return ret end s,ws = $stdin.read.split("\n") puts solve(s, ws.split).join(" ")
特に難しいところはありません。
入力値の1行目はそのまま。2行目はスペースで分割して配列にし、solve()に渡し、結果を印字します。
対象の文字列を検索し、一致したら[文字列]、一致しなかった時に部分一致した場合はその部分を=文字列=に置換します。
正規表現とか面倒臭いことをしなくてもこれで十分です。