paizaオンラインハッカソン6+では、松江Ruby会議07協賛ということで、今回は大学で学習、rakeで使ったことがあるくらいのRubyでコーディングしてみた。今回は100点を取るパターンと60点で終わるパターンを用意した。
回答例
100点を取得するパターン
[code lang=”ruby”]dict = Hash.new {|dict, key|
dict[key] = []
}
gets.to_i.times do
str = gets.chop
dict[[str, str.reverse].min].push(str)
end
selfPalindromeWord = nil;
foundwords = []
revwords = []
words = dict.sort
words.each {|key , val|
val.sort!
idx = 0
while idx < val.size / 2 and (val[idx] != val[val.size – (idx + 1)] or val[idx] == val[idx].reverse)
foundwords.push(val[idx])
revwords.push(val[val.size – (idx + 1)])
idx += 1
end
if idx <= val.size – (idx + 1) and val[idx] == val[idx].reverse then
selfPalindromeWord = (selfPalindromeWord and [val[idx], sameword].min) || val[idx]
end
}
puts foundwords.join + (selfPalindromeWord || ”) + revwords.reverse.join
[/code]
60点で終わるパターン
[code lang=”ruby”]lineStr = gets.chop
words = []
for line in 0…lineStr.to_i do
words.push(gets.chop)
end
words.sort
found = []
revWords = []
selfPalindromeWord = ""
for word in words do
if !revWords.include?(word) and word != selfPalindromeWord then
for revWord in words do
if word == revWord.reverse then
if word == revWord and words.count(word).modulo(2) == 1 then
selfPalindromeWord = word
selfPalindromeCount = words.count(word)
else
found.push(word)
revWords.push(revWord)
end
end
end
end
end
str = found.join
if ! selfPalindromeWord.empty? and selfPalindromeCount > 0 then
for idx in 0… selfPalindromeCount do
str += selfPalindromeWord
end
end
str += revWords.reverse.join
puts str
[/code]
その他
今回はいわゆるコードゴルフということなので、今回提示したコードは長すぎるので問題外だろう。もし勝てるぞ!という方は是非Rubyでチャレンジしてみてはいかがだろうか?
ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しています。主にスマートフォン向けアプリやウェブアプリの開発を携わっています。ご用の方はコメントかコンタクトフォームにて。