suffix_tree.sf 930 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/Suffix_tree
  4. #
  5. func suffix_tree(Str t) {
  6. suffix_tree(^t.len -> map { t.substr(_) })
  7. }
  8. func suffix_tree({.is_empty}) { Hash() }
  9. func suffix_tree(a {.len == 1}) { Hash(a[0] => Hash()) }
  10. func suffix_tree(Arr a) {
  11. var h = Hash()
  12. for k,v in (a.group_by { .char(0) }) {
  13. var subtree = suffix_tree(v.map { .substr(1) })
  14. var subkeys = subtree.keys
  15. if (subkeys.len == 1) {
  16. var subk = subkeys[0]
  17. h{k + subk} = subtree{subk}
  18. }
  19. else {
  20. h{k} = subtree
  21. }
  22. }
  23. return h
  24. }
  25. var tree = suffix_tree('banana$')
  26. say tree
  27. assert_eq(tree, Hash(
  28. "$" => Hash(),
  29. "a" => Hash(
  30. "$" => Hash(),
  31. "na" => Hash(
  32. "$" => Hash(),
  33. "na$" => Hash()
  34. )
  35. ),
  36. "banana$" => Hash(),
  37. "na" => Hash(
  38. "$" => Hash(),
  39. "na$" => Hash()
  40. )
  41. ))