Plant a tree and watch it grow The trees we are growing have some rules that define how they grow:

Growth Rules:


Trees consist only of branches.
Branches are made up of a combination of the following symbols:  _, \, |, /, &amp; _
A tree starts as a single vertical branch/trunk (|) on the ground (_):

__________________|___________________
The food for branch growth comes from light.  


Light starts at an intensity of 2 at each point in the sky and travels straight down.  
Each branch is able to eat half the light available to it and the rest passes through to lower branches.  
Thus, a branch with no other branches above it will get 1 unit of light-food each season, a branch with 1 branch above it will get .5 units of food each season, and in general a branch with n branches over it will get 1/(2^n) units of food each season.

At the end of each season, the food is totaled starting with the trunk and moving up and converted into new branches and fruit (apply the following rules until the branch turns into fruit or has less than 1 unit of food remaining):

If a branch has less than 1 unit of food at the end of a season, all the food for that branch is stored in that branch until the next season.
If a branch has greater than or equal to 1 unit of food and has room to grow, it randomly grows a new branch using the available growth patterns (see below) and stores the remaining food for the next season.
If a branch has >= 1 unit of food, nowhere to grow, and has offshoot branches, it evenly distributes the food to its offshoot branches
If a branch has >= 1 unit of food, nowhere to grow, and no offshoot branches, it becomes fruit (represented by O)

Here are the possible growth configurations


Growth Configurations:

_    \     |     /   _      _   \   |    /   \    |   /   _ 
 |    |    |    |   |        \   \   \   \   /   /   /   /     __   \_   |_   _|  _/  __
--- Vertical Branches ---      --- Diagonal Branches ---      --- Horizontal Branches ---




Example potential tree:

                \  
                /   /
              \/O  |___//
            \_/  \//O\_/ 
              \__/|\|_/
                 \|/
__________________|__________________


Input:

Your program should be able to take as input a list of which snapshots of the tree you would like to see.  For example [10,20,50] would mean you'd like to see the tree after 10 seasons, 20 seasons, and 50 seasons.

Output:

For each input season, your program should output the season and then a picture of the tree in that season.  If it helps, you can define a maximum age for the tree, such as 60, so that the maximum height for a tree would be 61, and the maximum width would be 121, and then always show the tree on that scale.  Otherwise, feel free to scale your image to any sized tree.  For example, if the input was [0,1,2,3], your output might be:

Season 0:
_|_

Season 1:
 \
__|__

Season 2:
 _
  \| 
___|___

Season 3:

 |_/ _
   \| 
____|___




Winner

Each solution must post the output of the coder's favorite run of their program with input of [10,40], along with their source code.  Also, ALL the above criteria must be met in order to qualify.  

The winner will be the qualifier with the highest number of votes. 

Good luck and merry planting!!!
Python

I took a little liberty with this:


I allow multiple trees
Fruit is preceded by flower -- once a flower has 1 food, it turns into a fruit.
Fruit turns ripe when it has 3 food.  It then falls off of the tree, and turns back into a flower.
If fruit falls at least 4 places from any given trunk, it buds into a new tree.  Since it doesn't get much light, I seed it with as much food as was in the fruit.


Sample Output, 2 trees

                            / 
     \/\_ |  /             |  
 _  _/\|\|_\/             /|/ 
  |/ \/|/|O/              \|/ 
   \_/O|@|/               /|_ 
     \_|_|                \|  
_______|___________________|__

                       _      \                                   
                _/ _ \/\___/\|/                  \                
             /|\|\O@|/\/|__\/ \__/_\|/\\|  _ |/| _||/\\ /         
             \|_|@|\|@/O|@@/O_/@O|@/ \//\   \|\||@||@///          
           \_ \_|\|/@\\O|@||/OO//O\\O/ \@|@\||/@|\/\/|/   | / _   
        ___/    |/|/O//O|O||\\/|/O// \_O\|__| \O|/\/O|   _/\\|    
         / \_O@@_\/\O\\@|/O|/O\@\O\\@/OO/|O_@O/O|\/\/     \//|/__ 
     _|/|_|  \\|O\\/O/O||_@|\O|\/O//|O|@\|/O_O\@|/O/\_@O__//_||   
    | \\|____// |O|\O\O|/\@|/ |/O/ \|O|OO|\/@_/O|_O\/O//O_//O/    
    |_O\\@O\/\\OO\|/|/\O\O\|__@\|O@/|/O|O|/\OO\/|_O/  \\|OO\/     
   /  \\||_|\|||_O|\|@/OO\//OOO/|/@\|OO|\|\@|O \|\|O@O//  \/\     
 _/\_/@\|\@|/  \_||/ \\@|/\\\||/ \//O|O|/|/@|\@/|/O/OO\\__/  \||/ 
  \||/  |_|O\__@ |O\O/O||\///@|O_//|/OO|@|OO|/O\|O/OO|// /|\|/\|  
   ||___O@|_/  |__\/||_||/|\\/OO/|@|O|/ \|_O||_/O/O/O|/_|\/\|_/   
    \_OO\\_O\@_|/|_\|_O|/\|//\/|/@|O\|@_O|O_O\/||\/O/|/_|/|O|     
      \_|\@\@|_|\|OO|O|/\//O\/\O\@|_/|_@\|/\O/\||/\|/|@@|@|/      
       /|//|\|O|_|O\O\O\/|O\/|@|/_|\OO@\/ \/|O/_|O//@|@/\_|       
       \O\\|/|_OO|OO\O|/\|@@\|O|/ @//|_@\_/\|//O_/|O/  \/         
        \O\|O_/|/ \|O|O\/|/OO|O|O_/ \|    \/|/|/@ |/\__/          
         |O|_O\|\O/|_|O/\|\//|/   \_/     /\@\| \_/\/             
          \OO\O|/ \ _|@\/O||@|\___/       \/|/    \/              
           |__|O\__|OO\/\@||/\/            \|O____/               
              |____|/@/\|\|O\/            _/|/O                   
                   |/ \/|/|@/              \|/                    
                    \_/O|@|/              |/|__                   
            \|/       \_|_|  \|_      \|/  \|    \|/  _|_         
_____________|__________|_____|________|____|_____|____|__________


Source

from random import choice, shuffle
format = '_\|/_@O'
directions = [(-1,0),(-1,1),(0,1),(1,1),(1,0)]
placement = [[[],[0,1,2],[]],[[],[0,1,2],[3]],[[0,1],[2],[3,4]],[[1],[2,3,4],[]],[[],[2,3,4],[]]]

def shine():
    for x in ymax:
        light = 2.
        for y in range(ymax[x],-1,-1):
            if (x,y) in tree:
                tree[x,y][1] += light/2
                light        /= 2


def grow((x,y)=(0,0),flow=0):
    type,store,children = tree[x,y]
    food = store + flow
    if type == 5:
        if food &gt; 1:
           tree[x,y][0] = 6
           tree[x,y][1] = food-1
        return
    elif type == 6:
        if food &gt; 3:
            tree[x,y]=[5,0,[]]
            if min(abs(x-xi) for xi in roots) &gt; 4:
                tree[x,0] = [2,food,[]]
                roots.append(x)
        else:
            tree[x,y][1]=food
        return

    if food &lt; 1:
        shuffle(children)
        for c in children:
            grow(c)
        return

    sites = []
    x0 = x+directions[type][0]-1
    y0 = y+directions[type][1]
    for i,t in enumerate(placement[type]):
        if t and (x0+i,y0) not in tree:
            sites.append((t,x0+i,y0))

    if sites:
        t,x1,y1 = choice(sites)
        t1 = choice(t)
        children.append((x1,y1))
        tree[x,y][1]=food-1
        tree[x1,y1]= [t1,0,[]]
        ymax[x1] = max(ymax.get(x1,0),y1)
    elif children:
        shuffle(children)
        for c in children:
            grow(c,food/len(children))
        tree[x,y][1]=0
    else:
        tree[x,y][0]=5

def output():
    X = range(min(ymax.keys())-1,max(ymax.keys())+2)
    for y in range(max(ymax.values()),-1,-1):
        s = ''
        for x in X:
            s += format[tree[x,y][0]] if (x,y) in tree else '_ '[y&gt;0]
        print s


roots = [0,20]
seasons = [10,40]
tree = {}
ymax = {}
for r in roots:
    tree[r,0] = [2,0,[]]
    ymax[r]=0

for season in range(max(seasons)):
    shine()
    shuffle(roots)
    for r in roots:
        grow((r,0))
    if season+1 in seasons:
        output()
        print


I'm curious to see a golfed solution.