正規表現で半ば強引に。
文字列に対する部分文字列の一致を見る。但し部分文字列中の*は0以上の文字にマッチ。
#!/usr/bin/env ruby
class String
def substr?(substr)
substrs = substr.split(/(?<!\\)\*/).map { |st| st.gsub(/\\\*/, '*') }
pos = 0
substrs.all? { |sb| pos = self.index(sb, pos) }
end
end
ARGF.lines do |line|
str, substr = line.split(',')
puts str.substr?(substr.chomp)
end
Array#permutationを使って。
単語文字の全順列。
#!/usr/bin/env ruby
def perm_set(str)
str.split(//).permutation(3).map(&:join)
end
ARGF.lines do |line|
puts perm_set(line.chomp).sort.join(',')
end
ほんとは構文解析して解くことが期待されてるんだろうけど、正規表現で行けたので..
いわゆるポーランド記法の電卓。
#!/usr/bin/env ruby
def evaluate(str)
op = %w(\+ \* \/)
# digit = /-*\d+(?:\.\d+)*/
digit = /-*\d+/
if m = str.match(/(#{op})\s+(#{digit})\s+(#{digit})/)
op, a, b = m.captures
inner = a.to_i.send(op, b.to_i)
str = m.pre_match + inner.to_s + m.post_match
evaluate(str)
else
str
end
end
ARGF.lines do |line|
puts evaluate(line.chomp)
end
StringScannerを使って再帰的に。どこかにバグがあるようで50点^ ^;
2つのアルファベット列に共通する最長の並び。並びは連続していなくてもいい。
#!/usr/bin/env ruby
require "strscan"
def find_common_subsequence(str1, str2)
str2 = StringScanner.new(str2)
find_sequences(str1, str2).max_by(&:size)
end
def find_sequences(str1, str2)
return [] if str1.empty?
str2.reset
seq = ""
str1.each_char { |chr| seq += chr if str2.skip_until(/#{chr}/) }
find_sequences(str1[1..-1], str2) << seq
end
ARGF.lines do |line|
next if line.chomp.empty?
str1, str2 = line.split(';')
puts find_common_subsequence(str1, str2)
end
#something is wrong, because the score was 50.
Hardになって急に難しくなってる..