input.group_by { |h| h[:start_p] }.
values.
flat_map do |a|
x = 1.0
a.flat_map do |h|
x /= 2.0
[[h[:start_p] += x, h[:start_t]], [h[:end_p] -= x, h[:end_t]]]
end
end.sort_by(&:first).map(&:last).join
#=> ""
的步骤如下。
b = input.group_by { |h| h[:start_p] }
#=> { 0=>[{:start_p=>0, :end_p=>100, :start_t=>"
", :end_t=>"
"},# {:start_p=>0, :end_p=>100, :start_t=>"", :end_t=>""}],
# 10=>[{:start_p=>10, :end_p=>50, :start_t=>"
", :end_t=>"
"}],# 20=>[{:start_p=>20, :end_p=>30, :start_t=>"", :end_t=>""}],
# 40=>[{:start_p=>40, :end_p=>50, :start_t=>"", :end_t=>""}],
# 50=>[{:start_p=>50, :end_p=>60, :start_t=>"", :end_t=>""}],
# 70=>[{:start_p=>70, :end_p=>80, :start_t=>"", :end_t=>""}],
# 8=>[{:start_p=> 8, :end_p=>99, :start_t=>"", :end_t=>""}]}
c = b.values
#=> [[{:start_p=>0, :end_p=>100, :start_t=>"
", :end_t=>"
"},# {:start_p=>0, :end_p=>100, :start_t=>"", :end_t=>""}],
# [{:start_p=>10, :end_p=>50, :start_t=>"
", :end_t=>"
"}],# ...
# [{:start_p=>8, :end_p=>99, :start_t=>"", :end_t=>""}]]
d = c.flat_map do |a|
x = 1.0
a.flat_map do |h|
x /= 2.0
[[h[:start_p] += x, h[:start_t]], [h[:end_p] -= x, h[:end_t]]]
end
end
#=> [[0.5, "
"], [99.5, "
"], [0.25, " "], [99.75, ""],# [10.5, "
"], [49.5, "
"], [20.5, " "], [29.5, ""],# [40.5, ""], [49.5, ""], [50.5, ""], [59.5, ""],
# [70.5, ""], [79.5, ""], [8.5, ""], [98.5, ""]]
的d(元组)前四个要素是理解我所采取的做法最重要的。
e = d.sort_by(&:first)
#=> [[0.25, ""], [0.5, "
"], [8.5, ""], [10.5, "
"],
# [20.5, ""], [29.5, ""], [40.5, ""], [49.5, "
"],# [49.5, ""], [50.5, ""], [59.5, ""], [70.5, ""],
# [79.5, ""], [98.5, ""], [99.5, "
"], [99.75, ""]]f = e.map(&:last)
#=> ["", "
", "", "
", "", "", "", "
",# "", "", "", "", "", "", "
", ""]f.join
#=> ""
我会详细说明上述计算d如果要求这样做。