list_rooted_trees.sf 837 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/List_rooted_trees
  4. #
  5. func bagchain(x, n, bb, start=0) {
  6. n || return [x]
  7. var out = []
  8. for i in (start .. bb.end) {
  9. var (c, s) = bb[i]...
  10. if (c <= n) {
  11. out += bagchain([x[0] + c, x[1] + s], n-c, bb, i)
  12. }
  13. }
  14. return out
  15. }
  16. func bags(n) {
  17. n || return [[0, ""]]
  18. var upto = []
  19. for i in (n ^.. 1) { upto += bags(i) }
  20. bagchain([0, ""], n-1, upto).map{|p| [p[0]+1, '('+p[1]+')'] }
  21. }
  22. func replace_brackets(s) {
  23. var (depth, out) = (0, [])
  24. for c in s {
  25. if (c == '(') {
  26. out.append(<( [ {>[depth%3])
  27. ++depth
  28. }
  29. else {
  30. --depth
  31. out.append(<) ] }>[depth%3])
  32. }
  33. }
  34. return out.join
  35. }
  36. for x in (bags(5)) {
  37. say replace_brackets(x[1])
  38. }