water_collected_between_towers.sf 694 B

123456789101112131415161718192021222324252627282930313233
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/Water_collected_between_towers
  4. #
  5. func max_l(Array a, m = a[0]) {
  6. gather { a.each {|e| take(m = max(m, e)) } }
  7. }
  8. func max_r(Array a) {
  9. max_l(a.flip).flip
  10. }
  11. func water_collected(Array towers) {
  12. towers.len <= 2 && return 0
  13. var levels = (max_l(towers) »min« max_r(towers))
  14. (levels »-« towers).grep{ _ > 0 }.sum
  15. }
  16. var result = [
  17. [ 1, 5, 3, 7, 2 ],
  18. [ 5, 3, 7, 2, 6, 4, 5, 9, 1, 2 ],
  19. [ 2, 6, 3, 5, 2, 8, 1, 4, 2, 2, 5, 3, 5, 7, 4, 1 ],
  20. [ 5, 5, 5, 5 ],
  21. [ 5, 6, 7, 8 ],
  22. [ 8, 7, 7, 6 ],
  23. [ 6, 7, 10, 7, 6 ],
  24. ].map { water_collected(_) }
  25. say result
  26. assert_eq(result, [2, 14, 35, 0, 0, 0, 0])