Task
Produce a graphical or ASCII-art representation of a Sierpinski carpet of order   N.



For example, the Sierpinski carpet of order   3   should look like this:

###########################
# ## ## ## ## ## ## ## ## #
###########################
###   ######   ######   ###
# #   # ## #   # ## #   # #
###   ######   ######   ###
###########################
# ## ## ## ## ## ## ## ## #
###########################
#########         #########
# ## ## #         # ## ## #
#########         #########
###   ###         ###   ###
# #   # #         # #   # #
###   ###         ###   ###
#########         #########
# ## ## #         # ## ## #
#########         #########
###########################
# ## ## ## ## ## ## ## ## #
###########################
###   ######   ######   ###
# #   # ## #   # ## #   # #
###   ######   ######   ###
###########################
# ## ## ## ## ## ## ## ## #
###########################

The use of the   #   character is not rigidly required for ASCII art.

The important requirement is the placement of whitespace and non-whitespace characters.



Related task

   Sierpinski triangle


inCarpet?: function [x,y][
    X: x
    Y: y
    while [true][
        if or? zero? X 
               zero? Y -> return true
        if and? 1 = X % 3 
                1 = Y % 3 -> return false
 
        X: X / 3
        Y: Y / 3
    ]
]
 
carpet: function [n][
    loop 0..dec 3^n 'i [
        loop 0..dec 3^n 'j [
            prints (inCarpet? i j)? -> "# " 
                                    -> "  "
        ]
        print ""
    ]
]
 
carpet 3