paizaオンラインハッカソン6+に参加してみた(え、妻が松江?、Ruby)

この記事は1年以上前に掲載されたものです。 情報が古い場合がありますのでお気を付け下さい。

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を中心にいろいろな情報や意見などを提供しています。ご用の方はコメントかコンタクトフォームにて。