Data commit

This commit is contained in:
Ingy döt Net 2023-07-01 11:58:00 -04:00
parent 7387c8f97b
commit cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions

View file

@ -0,0 +1,49 @@
from math import factorial
import functools
def memoize(func):
cache = {}
def memoized(key):
# Returned, new, memoized version of decorated function
if key not in cache:
cache[key] = func(key)
return cache[key]
return functools.update_wrapper(memoized, func)
@memoize
def fact(n):
return factorial(n)
def cat_direct(n):
return fact(2 * n) // fact(n + 1) // fact(n)
@memoize
def catR1(n):
return 1 if n == 0 else (
sum(catR1(i) * catR1(n - 1 - i) for i in range(n))
)
@memoize
def catR2(n):
return 1 if n == 0 else (
((4 * n - 2) * catR2(n - 1)) // (n + 1)
)
if __name__ == '__main__':
def pr(results):
fmt = '%-10s %-10s %-10s'
print((fmt % tuple(c.__name__ for c in defs)).upper())
print(fmt % (('=' * 10,) * 3))
for r in zip(*results):
print(fmt % r)
defs = (cat_direct, catR1, catR2)
results = [tuple(c(i) for i in range(15)) for c in defs]
pr(results)

View file

@ -0,0 +1,47 @@
'''Catalan numbers'''
from itertools import accumulate, chain, count, islice
# catalans3 :: [Int]
def catalans3():
'''Infinite sequence of Catalan numbers
'''
def go(c, n):
return 2 * c * pred(2 * n) // succ(n)
return accumulate(
chain([1], count(1)), go
)
# ------------------------- TEST -------------------------
# main :: IO ()
def main():
'''Catalan numbers, definition 3'''
print("Catalans 1-15:\n")
print(
'\n'.join([
f'{n:>10}' for n
in islice(catalans3(), 15)
])
)
# ----------------------- GENERIC ------------------------
# pred :: Int -> Int
def pred(n):
'''Predecessor function'''
return n - 1
# succ :: Int -> Int
def succ(n):
'''Successor function'''
return 1 + n
# MAIN ---
if __name__ == '__main__':
main()