longest_common_prefix.sf 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/Longest_common_prefix#Sidef
  4. #
  5. # Finds the first point where the tree bifurcates
  6. func find_common_prefix(hash, acc) {
  7. if (hash.len == 1) {
  8. var pair = hash.to_a[0]
  9. return __FUNC__(pair.value, acc+pair.key)
  10. }
  11. return acc
  12. }
  13. # Creates a tree like: {a => {b => {c => {}}}}
  14. func lcp(*strings) {
  15. var hash = Hash()
  16. for str in (strings.sort_by{.len}) {
  17. var ref = hash
  18. str.is_empty && return ''
  19. for char in str {
  20. if (ref.contains(char)) {
  21. ref = ref{char}
  22. ref.len == 0 && break
  23. }
  24. else {
  25. ref = (ref{char} = Hash())
  26. }
  27. }
  28. }
  29. return find_common_prefix(hash, '')
  30. }
  31. var data = [
  32. ["interspecies","interstellar","interstate"],
  33. ["throne","throne"],
  34. ["throne","dungeon"],
  35. ["throne","","throne"],
  36. ["cheese"],
  37. [""],
  38. [],
  39. ["prefix","suffix"],
  40. ["foo","foobar"]
  41. ];
  42. data.each { |set|
  43. say "lcp(#{set.dump.substr(1,-1)}) = #{lcp(set...).dump}";
  44. }