CodeIQ:Colorize問題

私自身が表題の問題を解いた時のプログラムについて解説します。
問題の詳細は「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(" ")

解説

特に難しいところはありません。

main

入力値の1行目はそのまま。2行目はスペースで分割して配列にし、solve()に渡し、結果を印字します。

solve(arr)

対象の文字列を検索し、一致したら[文字列]、一致しなかった時に部分一致した場合はその部分を=文字列=に置換します。

雑感

正規表現とか面倒臭いことをしなくてもこれで十分です。