あめましておめでとうございます 2013

あけましておめでとうございます。日本のプログラマには古来より「正月はフラクタル」という習わしがあります。正月はフラクタルに触れて心穏やかに過ごそうというものです。

今年はあまり芸がないですが Substitution tiling で遊んで見ました。以上。

# coding: UTF-8

I = Complex::I
V = Complex(1, 1)

def f(screen, pos, dir, size, minsize = 1)
  [1, 1, 2, 2, 1, 1].each do |mult|
    (size * mult).times { screen[pos += dir * V] = dir.imag == 0 ? "\\" : "/" }
    pos -= (dir *= -I)
  end
  pos += dir
  dir *= I
  if size.even? && size > minsize
    f(screen, pos - dir *  size * I     ,  dir    , size / 2, minsize)
    f(screen, pos + dir * (size * I + V), -dir    , size / 2, minsize)
    f(screen, pos + dir * (size     + 1),  dir * I, size / 2, minsize)
    #(screen, pos + dir                 ,  dir * I, size / 2, minsize)
  end
end

def g(size, minsize = 1)
  marks = {}
  f(marks, 0, -I, size, minsize)
  min_x, max_x = marks.keys.map {|pos| pos.real }.minmax
  min_y, max_y = marks.keys.map {|pos| pos.imag }.minmax
  screen = (min_y .. max_y).map { " " * (max_x - min_x) }
  marks.each {|pos, mark| screen[pos.imag - min_y][pos.real - min_x] = mark }
  screen.map! {|line| line.rstrip.gsub(" ", " ").gsub("/", "").gsub("\\", "") }
  puts *screen
end

g(8, 8); puts
g(8, 4); puts
g(8, 2); puts
g(8, 1); puts

               /\
              /  \
             /    \
            /      \
           /        \
          /          \
         /            \
        /              \
       /               /
      /               /
     /               /
    /               /
   /               /
  /               /
 /               /
/               /
\               \
 \               \
  \               \
   \               \
    \               \
     \               \
      \               \
       \               \
        \              /
         \            /
          \          /
           \        /
            \      /
             \    /
              \  /
               \/

               /\
              /  \
             /    \
            /      \
           /        \
          /          \
         /            \
        /              \
       /\      /\      /
      /  \    /  \    /
     /    \  /    \  /
    /      \/      \/
   /       /       /
  /       /       /
 /       /       /
/       /       /
\       \       \
 \       \       \
  \       \       \
   \       \       \
    \      /\      /\
     \    /  \    /  \
      \  /    \  /    \
       \/      \/      \
        \              /
         \            /
          \          /
           \        /
            \      /
             \    /
              \  /
               \/

               /\
              /  \
             /    \
            /      \
           /\  /\  /\
          /  \/  \/  \
         /   /    \   \
        /   /      \   \
       /\   \  /\  /   /
      /  \   \/  \/   /
     /    \  /    \  /
    /      \/      \/
   /\  /\  /       /
  /  \/  \/       /
 /   /   /       /
/   /   /       /
\   \   \       \
 \   \   \       \
  \  /\  /\       \
   \/  \/  \       \
    \      /\      /\
     \    /  \    /  \
      \  /   /\  /\   \
       \/   /  \/  \   \
        \   \      /   /
         \   \    /   /
          \  /\  /\  /
           \/  \/  \/
            \      /
             \    /
              \  /
               \/

               /\
              /  \
             /\/\/\
            / /  \ \
           /\ \/\/ /\
          /  \/  \/  \
         /\/\/    \/\/\
        / / /      \ \ \
       /\ \ \  /\  / / /
      /  \/\/\/  \/\/\/
     /\/\/\  /    \  /
    / /  \ \/      \/
   /\ \/\/ /       /
  /  \/  \/       /
 /\/\/   /       /
/ / /   /       /
\ \ \   \       \
 \/\/\   \       \
  \  /\  /\       \
   \/ /\/\ \       \
    \ \  / /\      /\
     \/\/\/  \    /  \
      \  /\/\/\  /\/\/\
       \/ / /  \/  \ \ \
        \ \ \      / / /
         \/\/\    /\/\/
          \  /\  /\  /
           \/ /\/\ \/
            \ \  / /
             \/\/\/
              \  /
               \/