""" Galton-deszka és Pascal háromszög.
 Forrás: http://www.mathforum.com/epigone/math-learn/snoipumkhee/969sac%2b767u@eGroups.com"""

from random import choice
from operator import mul

def mul(a,b):
  return a*b*1L

def fact(n):
 return reduce(mul, range(1,n+1))

def combin(n,k):
        """n!/(n-k)!"""
        numerator   = reduce(mul,[1]+range(1,1+n)[n-k:]) # n!/(n-k)!
        denominator = reduce(mul,[1]+range(1,k+1))       # k!
        return numerator/denominator

def pascal(n):
        """
        return nth row of Pascal's triangle
        """
        entries = []
        for k in range(n+1):  # k = 0,1,2,3... n
            entries.append(combin(n,k))
        return entries

for i in range(26): print pascal(i)
#
# [1]
# [1, 1]
# [1, 2, 1]
# [1, 3, 3, 1]
# [1, 4, 6, 4, 1]
# [1, 5, 10, 10, 5, 1]
# [1, 6, 15, 20, 15, 6, 1]
# [1, 7, 21, 35, 35, 21, 7, 1]
# [1, 8, 28, 56, 70, 56, 28, 8, 1]
# [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]

def randomfall(n):
        """
        n = number of bottom row, starting with apex = row 0
        """
        r = 2**n
        tallysheet = [0]*(n+1)  # slots to tally outcomes
        for i in range(r):
            pathway = []
            for j in range(n):  # choose L or R n times
                pathway.append(choice(['L','R']))
            numblefts = pathway.count('L') # tally Ls
            tallysheet[numblefts] += 1     # increment slot
        print "RANDOM: %s" % tallysheet
        print "PASCAL: %s" % pascal(n)


randomfall(10)
#  RANDOM: [0, 15, 43, 122, 207, 258, 225, 115, 28, 9, 2]
#  PASCAL: [1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1]
#  >>> randomfall(10)
#  RANDOM: [1, 14, 50, 97, 219, 258, 201, 133, 43, 7, 1]

