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__':