The original basic looks like this:

  10 CLS : DIM s$(VAL "16"): LET w$="***********************"
  20 FOR p=NOT PI TO VAL "2": FOR l=NOT PI TO PI: LET w=PI/PI+p*VAL "2"+l*(VAL "
2"+VAL "2"*p): LET s=VAL "16"-(w-PI/PI)/VAL "2": PRINT s$(PI/PI TO s);w$(PI/PI T
O w): NEXT l: NEXT p
  30 FOR f=NOT PI TO PI/PI: PRINT s$(PI/PI TO VAL "15");w$(PI/PI TO PI): NEXT f

Because direct written numbers store also binary interpretation of it's value
in 5 bytes, it's better to avoid it. I'm using few substitutions:
  VAL "16"  =  16
  NOT PI    =  0
  PI        =  3
  PI/PI     =  1
If we substitu the values back, we get this program:

  10 CLS : DIM s$(16): LET w$="***********************"
  20 FOR p=0 TO 2: FOR l=0 TO 3: LET w=1+p*2+l*(2+2*p): LET s=16-(w-1)/2: PRINT
s$(1 TO s);w$(1 TO w): NEXT l: NEXT p
  30 FOR f=0 TO 1: PRINT s$(1 TO 15);w$(1 TO 3): NEXT f

The program define 2 strings at the start, s$ is string contains 16 spaces and
w$ contain 23 stars. These strings are used to print the left intend and the
tree itself.

On the line 20 are printed 3 parts of the tree (FOR p=0 TO 2), each part
consist of 4 lines (FOR l=0 TO 3) and I count width (variable w) and intend
(variable s) of the tree. Next is printed one line of the tree.

On the line 30 is printed trunk of the tree.

It is possible to merge all 3 lines into 1, but the readability will suffer
and I think this is not the most optimized program anyway.


