Padovan n-step number sequences: Difference between revisions
Content added Content deleted
Line 1,012: | Line 1,012: | ||
<lang python>'''Padovan N-step series''' |
<lang python>'''Padovan N-step series''' |
||
from itertools import islice, repeat |
from itertools import islice, repeat |
||
# padovans :: Int -> [Int] |
# padovans :: Int -> [Int] |
||
def padovans(n): |
def padovans(n): |
||
Line 1,023: | Line 1,023: | ||
def recurrence(ns): |
def recurrence(ns): |
||
return ns[0], ns[1:] + [sum(take(n)(ns))] |
return ns[0], ns[1:] + [sum(take(n)(ns))] |
||
return unfoldr(recurrence)( |
return unfoldr(recurrence)( |
||
take(1 + n)( |
take(1 + n)( |
||
repeat(1) if 3 > n else padovans(n - 1) |
repeat(1) if 3 > n else padovans(n - 1) |
||
) |
) |
||
) |
) if 0 <= n else [] |
||
# ------------------------- TEST ------------------------- |
# ------------------------- TEST ------------------------- |
||
# main :: IO () |
# main :: IO () |
||
def main(): |
def main(): |
||
Line 1,040: | Line 1,039: | ||
def sample(n): |
def sample(n): |
||
return take(15)(padovans(n)) |
return take(15)(padovans(n)) |
||
def columnWidth(n): |
def columnWidth(n): |
||
def go(xs): |
def go(xs): |
||
Line 1,047: | Line 1,046: | ||
]) |
]) |
||
return go |
return go |
||
print( |
print( |
||
fTable('Padovan n-step series:')(repr)( |
fTable('Padovan n-step series:')(repr)( |
||
Line 1,053: | Line 1,052: | ||
)(sample)(range(2, 1 + 8)) |
)(sample)(range(2, 1 + 8)) |
||
) |
) |
||
# ----------------------- GENERIC ------------------------ |
# ----------------------- GENERIC ------------------------ |
||
# unfoldr :: (b -> Maybe (a, b)) -> b -> [a] |
# unfoldr :: (b -> Maybe (a, b)) -> b -> [a] |
||
def unfoldr(f): |
def unfoldr(f): |
||
Line 1,072: | Line 1,071: | ||
valueResidue = f(valueResidue[1]) |
valueResidue = f(valueResidue[1]) |
||
return go |
return go |
||
# take :: Int -> [a] -> [a] |
# take :: Int -> [a] -> [a] |
||
# take :: Int -> String -> String |
# take :: Int -> String -> String |
||
Line 1,087: | Line 1,086: | ||
) |
) |
||
return go |
return go |
||
# ---------------------- FORMATTING ---------------------- |
# ---------------------- FORMATTING ---------------------- |
||
# fTable :: String -> (a -> String) -> |
# fTable :: String -> (a -> String) -> |
||
# (b -> String) -> (a -> b) -> [a] -> String |
# (b -> String) -> (a -> b) -> [a] -> String |
||
Line 1,103: | Line 1,102: | ||
ys = [xShow(x) for x in xs] |
ys = [xShow(x) for x in xs] |
||
w = max(map(len, ys)) |
w = max(map(len, ys)) |
||
def arrowed(x, y): |
def arrowed(x, y): |
||
return y.rjust(w, ' ') + ' ->' + ( |
return y.rjust(w, ' ') + ' ->' + ( |
||
Line 1,115: | Line 1,114: | ||
return gofx |
return gofx |
||
return gox |
return gox |
||
# MAIN --- |
# MAIN --- |
||
if __name__ == '__main__': |
if __name__ == '__main__': |