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