1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- #!/usr/bin/ruby
- # A modified Fibonacci word fractal, using Braille graphics.
- var(m=14, scale=2) = ARGV.map{.to_i}...
- (var world = Hash.new){0}{0} = 1
- var loc = 0
- var w = 1
- var dir = Quadratic(0, 1, w)
- var fib = ['1', '0']
- func fib_word(n) {
- fib[n] := (fib_word(n-1) + fib_word(n-2))
- }
- func step {
- scale.times {
- loc += dir
- world{loc.im}{loc.re} = 1
- }
- }
- var turns = [
- Quadratic(0, 1, w),
- -Quadratic(0, 1, w),
- Quadratic(1, 0, w),
- ].shuffle
- var n = 1
- fib_word(m).each { |c|
- if (c == '0') {
- step()
- dir *= turns[n % 3]
- } else { ++n }
- }
- func braille_graphics(a) {
- var (xlo, xhi, ylo, yhi) = +([Inf, -Inf]*2)...
- a.each_key { |y|
- ylo.min!(y.to_n)
- yhi.max!(y.to_n)
- a{y}.each_key { |x|
- xlo.min!(x.to_n)
- xhi.max!(x.to_n)
- }
- }
- for y in (ylo .. (yhi, 4)) {
- for x in (xlo .. (xhi, 2)) {
- var cell = 0x2800
- a{y+0}{x+0} && (cell += 1)
- a{y+1}{x+0} && (cell += 2)
- a{y+2}{x+0} && (cell += 4)
- a{y+0}{x+1} && (cell += 8)
- a{y+1}{x+1} && (cell += 16)
- a{y+2}{x+1} && (cell += 32)
- a{y+3}{x+0} && (cell += 64)
- a{y+3}{x+1} && (cell += 128)
- print cell.chr
- }
- print "\n"
- }
- }
- braille_graphics(world)
|