cantor_set.sf 591 B

12345678910111213141516171819202122232425262728
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/Cantor_set
  4. #
  5. func cantor (height) {
  6. var width = 3**(height - 1)
  7. var lines = height.of { "\N{FULL BLOCK}" * width }
  8. func trim_middle_third (len, start, index) {
  9. var seg = (len // 3) || return()
  10. for i, j in ((index ..^ height) ~X (0 ..^ seg)) {
  11. lines[i].replace!(Regex("^.{#{start + seg + j}}\\K."), ' ')
  12. }
  13. [0, 2*seg].each { |k|
  14. trim_middle_third(seg, start + k, index + 1)
  15. }
  16. }
  17. trim_middle_third(width, 0, 1)
  18. return lines
  19. }
  20. cantor(5).each { .say }