#!/usr/bin/ruby

class Sierpinski(c='*', s=' ') {

    #   *
    #  * *
    # *   *
    method letter_a(n) {
        # needs more work
        var c = [self.c];
        { |i|
            var xp = s*(pow(2, i-1) * i + 1);
            var sp = s*(pow(2, i-1));
            c = [c.map{|x| xp + x + xp          },
                 c.map{|x| sp + x + s*i + x + sp},
                 c.map{|x| x + sp + xp + x      },
                ]«+»;
        } * n;
        return c;
    }

    # **
    # ***
    # **
    method letter_b(n) {
        var c = [self.c];
        {
            c = [c.map{|x| x*2 + s*(x.len) },
                 c.map{|x| x*3 },
                 c.map{|x| x*2 + s*(x.len) },
                ]«+»;
        } * n;
        return c;
    }

    # ***
    # *
    # ***
    method letter_c(n) {
        var c = [self.c];
        {
            c = [c.map{|x| x*3 },
                 c.map{|x| x + s*(x.len*2) },
                 c.map{|x| x*3 },
                ]«+»;
        } * n;
        return c;
    }

    # *
    # **
    # ***
    method letter_d(n) {
        var c = [self.c];
        {
            c = [c.map{|x| x*1 + s*(x.len*2) },
                 c.map{|x| x*2 + s*(x.len*1) },
                 c.map{|x| x*3               },
                ]«+»;
        } * n;
        return c;
    }

    # ***
    # **
    # ***
    method letter_e(n) {
        var c = ['*'];
        {
            c = [c.map{|x| x*3             },
                 c.map{|x| x*2 + s*(x.len) },
                 c.map{|x| x*3             },
                ]«+»;
        } * n;
        return c;
    }

    # ***
    # **
    # *
    method letter_f(n) {
        var c = [self.c];
        {
            c = [c.map{|x| x*3               },
                 c.map{|x| x*2 + s*(x.len*1) },
                 c.map{|x| x*1 + s*(x.len*2) },
                ]«+»;
        } * n;
        return c;
    }

    # **
    # *  *
    # ****
    method letter_g(n) {
        var c = [self.c];
        {
            c = [c.map{|x| x*2 + s*(x.len*2)   },
                 c.map{|x| x + s*(x.len*2) + x },
                 c.map{|x| x*4 },
                ]«+»;
        } * n;
        return c;
    }

    # *  *
    # ****
    # *  *
    method letter_h(n) {
        var c = [self.c];
        {
            c = [c.map{|x| x + s*(x.len*2) + x },
                 c.map{|x| x * 4 },
                 c.map{|x| x + s*(x.len*2) + x },
                ]«+»;
        } * n;
        return c;
    }

    # *
    # *
    # *
    method letter_i(n) {
        var c = [self.c];
        { |i|
            c = [c.map{|x| x*i },
                 c.map{|x| x*i },
                 c.map{|x| x*i },
                ]«+»;
        } * n;
        return c;
    }

    #    *
    #    *
    # *  *
    # ****
    method letter_J(n) {
        var c = [self.c];
        {
            c = [c.map{|x| s*(x.len*3) + x     },
                 c.map{|x| s*(x.len*3) + x     },
                 c.map{|x| x + s*(x.len*2) + x },
                 c.map{|x| x * 4 },
                ]«+»;
        } * n;
        return c;
    }

    #  *
    #  *
    # **
    method letter_j(n) {
        var c = [self.c];
        {
            c = [c.map{|x| s*(x.len) + x },
                 c.map{|x| s*(x.len) + x },
                 c.map{|x| x * 2         },
                ]«+»;
        } * n;
        return c;
    }

    #   **
    # * * *
    #  **
    method letter_s(n) {
        var c = [self.c];
        {
            c = [c.map{|x| s*(x.len*2) + x*2 + s*(x.len*1) },
                 c.map{|x| x + s*x.len + x + s*(x.len) + x },
                 c.map{|x| s*(x.len*1) + x*2 + s*(x.len*2) },
                ]«+»;
        } * n;
        return c;
    }

    # *****
    #   *
    #   *
    method letter_t(n) {
        var c = [self.c];
        {
            c = [c.map{|x| x*5                          },
                 c.map{|x| s*(x.len*2) + x + s*(x.len*2)},
                 c.map{|x| s*(x.len*2) + x + s*(x.len*2)},
                ]«+»;
        } * n;
        return c;
    }

    # ***
    #   *
    #   ***
    method letter_z(n) {
        var c = [self.c];
        {
            c = [c.map{|x| x*3 + s*(x.len*2)},
                 c.map{|x| s*(x.len*2) + x + s*(x.len*2) },
                 c.map{|x| s*(x.len*2) + x*3},
                ]«+»;
        } * n;
        return c;
    }

    # ****  *
    #    *  *
    #    *  *
    # *******
    # *  *
    # *  *
    # *  ****
    method letter_Z(n) {
        var c = [self.c];
        {
            c = [c.map{|x| x*4 + s*(x.len*2) + x  },
                 c.map{|x| s*(x.len*3) + x + s*(x.len*2) + x },
                 c.map{|x| s*(x.len*3) + x + s*(x.len*2) + x },
                 c.map{|x| x*7  },
                 c.map{|x| x + s*(x.len*2) + x + s*(x.len*3)  },
                 c.map{|x| x + s*(x.len*2) + x + s*(x.len*3)  },
                 c.map{|x| x + s*(x.len*2) + x*4 },
                ]«+»;
        } * n;
        return c;
    }
}

var size = 2;
var ski = Sierpinski('*');

var word = "best";
var chars = word.chars.map {|char| ski.("letter_#{char}")(size)};

chars.zip { |*a|
    say a.join('   ')
};

__END__

        *
       * *
      *   *
     *     *
    * *   * *
   *   * *   *
  *           *
 * *         * *
*   *       *   *