Print a Cantor Set
GolfScript, 49 42 40 chars
~.abs.3\?'_'*\{.3%..,' '*\++}*](0>2*(%n*
With thanks to hammar for 42->40.
My best attempt yet at a more number-theoretic approach is sadly much longer:
~.abs:^3\?,{3^)?+3base(;1+1?.'_'*^@-)' '*+}%zip\0>2*(%n*
or
~.abs 3\?:^,{6^*+3base.1+1?.('_'*@,@-' '*+}%zip\0>2*(%n*
and I suspect that the length of base
and zip
will make it impossible to catch up.
Python, 116 113 104 103 chars
n=input()
d=n>0 or-1
for i in range(n*d+1)[::d]:
s='_'*3**i
while i<n*d:s+=len(s)*' '+s;i+=1
print s
Older algorithm topped out at 113 characters
r=input()
u='_'
l=[u]
for _ in abs(r)*u:o=len(l[0]);l=[s+o*' '+s for s in l]+[u*o*3]
print'\n'.join(l[::r>0 or-1])
Ruby (97)
Based on Steven Rumbalski's python version:
n,r=$*[0].to_i,[?_]
n.abs.times{z=r[0].size;r=r.map{|s|s+' '*z+s}+[?_*z*3]}
puts n<0?r:r.reverse
Previous attempts, both same length (112)
Build lines from parts:
c=->x,n{n<1??_*x :(z=c[s=x/3,n-1])+' '*s+z}
r=(0..m=(n=$*[0].to_i).abs).map{|i|c[3**m,i]}
puts n<0?r.reverse: r
Start with one line, make holes in it:
r=[?_*3**a=(n=$*[0].to_i).abs]
a.times{|c|r<<r[-1].gsub((x=?_*o=3**(a-c-1))*3,x+' '*o+x)}
puts n<0?r.reverse: r