The ASCII Architect
Ruby, 223 214 bytes
g=$*[0].split(/(?<=[a-j])(?!\+)/).map{|r|r.scan(/(\d*)(-\d+)?([a-j])/).map{|a,b,c|' '*a.to_i+'++--***...'[-b.to_i..c.ord-97]}*''}
puts g.map{|s|s.ljust(g.map(&:size).max).chars.reverse}.transpose.map(&:join).join$/
That was fun. :)
Although it should be quite obvious, I discovered a new way to do these challenges where strings have be constructed from columns: just do them in rows, and transpose the array of characters before joining everything.
g=$*[0].split(/(?<=[a-j])(?!\+)/) # Split into columns.
.map{|r| # For each column
r.scan(/(\d*)(-\d+)?([a-j])/) # Split into components.
.map{|a,b,c| # For each component
' '*a.to_i+ # Prepend spaces if any.
'++--***...'[-b.to_i..c.ord-97] # Select the appropriate slice of the tower.
}*'' # Join all components together.
}
puts g.map{|s| # For each column
s.ljust(g.map(&:size).max) # Pad with spaces on the right such that.
# all columns are the same height.
.chars.reverse # Turn into character array and reverse.
}
.transpose # Mirror in the main diagonal.
.map(&:join) # Join lines.
.join$/ # Join columns.
Cobra - 473
I don't think Cobra's ever going to win one of these :/
use System.Text.RegularExpressions
class P
def main
r=Regex.matches(Console.readLine,r'(?<=^|[a-j])(([^a-j]*[a-j])+?)(?=[^+]|$)')
z,l=0String[](r.count)
for m in r.count,for n in'[r[m]]'.split('+'),l[m]+=' '.repeat(int.parse('0[Regex.match(n,r'(?<!-)\d+')]'))+'++--***...'[int.parse('0[Regex.match(n,r'(?<=-)\d+')]'):' abcdefghij'.indexOf(n[-1:])]
for y in l,if y.length>z,z=y.length
for x in-z+1:1
for y in l,Console.write(if(-x<y.length,y[-x],' '))
print
All nice and commented:
EDIT: Just realized this looks suspiciously similar to the Ruby solution. Great minds think alike?
use System.Text.RegularExpressions
class P
def main
r=Regex.matches(Console.readLine,r'(?<=^|[a-j])(([^a-j]*[a-j])+?)(?=[^+]|$)')
# Split into columns
z,l=0,String[](r.count)
# Assign the column-array
for m in r.count
# Loop through columns
for n in'[r[m]]'.split('+')
# Loop through individual letter instructions
# - within columns
l[m]+=
# Add characters to the last column
' '.repeat(int.parse('0[Regex.match(n,r'(?<!-)\d+')]'))+
# Any spaces, plus
'++--***...'[:' abcdefghij'.indexOf(n[-1:])]
# The default column string
[int.parse('0[Regex.match(n,r'(?<=-)\d+')]'):]
# Sliced to the right length
for y in l,if y.length>z,z=y.length
# Determine the maximum length of any column
for x in-z+1:1
for y in l
# Loop through columns so that they rotate to the left
Console.write(if(-x<y.length,y[-x],' '))
# Write the character in the current position
print
# Insert newlines
Lua - 451
a=arg[1]j='++--***...'I=io.write M=string.match U=string.sub T=table.insert n=''y=0 t={}m=0 for i in a:gmatch('[%-%d]*[a-j]%+?')do b=M(i,'-(%d)')b=b or 0 s=M(U(i,1,1),'%d')s=s or 0 n=n..(' '):rep(s)..U(U(j,1,M(U(i,-2),'[a-j]'):byte()-96),1+b,-1)if U(i,-1,-1)~="+"then T(t,n)m=m<#n and #n or m n=""y=y+1 end end T(t,n)n=''for k,v in pairs(t)do n=#v<m and n..v..(' '):rep(m-#v)or n..v end for i=m,1,-1 do for k=0,m*y-1,m do I(U(n,i+k,i+k))end I'\n'end
Nothing special. It was fun to rename a butt-load of functions for once though. I'll edit the ungolfed code in later.
Try it out here. Sample Output: