fibonacci_word_fractal.sf 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #!/usr/bin/ruby
  2. var(m=14, scale=3) = ARGV.map{.to_i}...
  3. (var world = Hash.new){0}{0} = 1
  4. var loc = 0
  5. var dir = 1i
  6. var fib = ['1', '0']
  7. func fib_word(n) {
  8. fib[n] \\= (fib_word(n-1) + fib_word(n-2))
  9. }
  10. func step {
  11. scale.times {
  12. loc += dir
  13. world{loc.im}{loc.re} = 1
  14. }
  15. }
  16. func turn_left { dir *= 1i }
  17. func turn_right { dir *= -1i }
  18. var n = 1
  19. fib_word(m).each_char { |c|
  20. if (c == '0') {
  21. step()
  22. n % 2 == 0 ? turn_left()
  23. : turn_right()
  24. } else { n++ }
  25. }
  26. func braille_graphics(a) {
  27. var (xlo, xhi, ylo, yhi) = +([Inf, -Inf]*2)...
  28. a.each_key { |y|
  29. ylo.min!(y.to_i)
  30. yhi.max!(y.to_i)
  31. a{y}.each_key { |x|
  32. xlo.min!(x.to_i)
  33. xhi.max!(x.to_i)
  34. }
  35. }
  36. for y in (ylo .. (yhi, 4)) {
  37. for x in (xlo .. (xhi, 2)) {
  38. var cell = 0x2800
  39. a{y+0}{x+0} && (cell += 1)
  40. a{y+1}{x+0} && (cell += 2)
  41. a{y+2}{x+0} && (cell += 4)
  42. a{y+0}{x+1} && (cell += 8)
  43. a{y+1}{x+1} && (cell += 16)
  44. a{y+2}{x+1} && (cell += 32)
  45. a{y+3}{x+0} && (cell += 64)
  46. a{y+3}{x+1} && (cell += 128)
  47. print cell.chr
  48. }
  49. print "\n"
  50. }
  51. }
  52. braille_graphics(world)