hp12c
03 February 2012

RubyでString Searchingを解く-CodeEval

RubyでString Searchingを解く-CodeEval

正規表現で半ば強引に。

文字列に対する部分文字列の一致を見る。但し部分文字列中の*は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

RubyでString Permutationsを解く-CodeEval

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

RubyでPrefix expressionsを解く-CodeEval

ほんとは構文解析して解くことが期待されてるんだろうけど、正規表現で行けたので..

いわゆるポーランド記法の電卓。

#!/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

RubyでLongest Common Subsequenceを解く-CodeEval

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になって急に難しくなってる..



Please enable JavaScript to view the comments powered by Disqus. blog comments powered by Disqus
ruby_pack8

100円〜で好評発売中!
M'ELBORNE BOOKS



AltStyle によって変換されたページ (->オリジナル) /