Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def volume(left_edge, right_edge, length, dirt)
- cap = [left_edge, right_edge].min
- [(cap*length-dirt),0].max
- end
- def water_helper(left_edge, index, count, dirt, right_edge, blocks)
- puts("#{left_edge}, #{index}, #{count}, #{dirt}, #{right_edge}") if $debug
- if index == blocks.size-1
- water_volume = volume(left_edge, right_edge, count, dirt)
- puts("end: water_volume") if $debug
- water_volume
- elsif blocks[index] > right_edge
- water_volume = volume(left_edge, blocks[index], count, dirt)
- puts("split: water_volume") if $debug
- water_volume + water_helper(blocks[index], index+1, 0, 0, right_edge, blocks)
- else
- water_helper(left_edge, index+1, count+1,blocks[index]+dirt, right_edge, blocks)
- end
- end
- def waterblocks(blocks)
- return 0 if blocks.size <= 2
- water_helper(blocks.first,1,0,0, blocks.last, blocks)
- end
- testcases = [
- [[5, 5], 0],
- [[5, 1, 10], 4],
- [[10, 1, 5], 4],
- [[10, 1, 5, 5], 4],
- [[10, 5, 1, 5], 4],
- [[10, 1, 1, 5], 8],
- [[10, 5, 1], 0],
- [[1, 5, 10], 0],
- [[5, 2, 3, 2, 1, 3], 4],
- [[5, 4, 6,1,6,4,5], 7],
- [[1,1,3,1,5,1,1],2],
- ]
- testcases.each do |info|
- data = info.first
- expected = info.last
- actual = waterblocks(data)
- if expected == actual
- puts "Passed: #{data}"
- else
- $debug = true
- waterblocks(data)
- puts "Failed: #{data}"
- puts "Actual: #{actual} Expected: #{expected}"
- $debug = false
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement