McNuggets problem: Difference between revisions

Content added Content deleted
Line 1,155: Line 1,155:


box = size(limit)
box = size(limit)
return set(bind(box(6))(
return set(
lambda x:
bind(
box(6)

bind(box(9))(
)(lambda x: bind(
lambda y:
box(9)
)(lambda y: bind(

bind(box(20))(
box(20)
lambda z: (
)(lambda z: (
lambda v=sum([x, y, z]): (

lambda v=sum([x, y, z]): (
[] if v > limit else [v]
[] if v > limit else [v]
)
)
)())))
)()))))
)




Line 1,192: Line 1,192:




# TEST -----------------------------------------------------------
# -------------------------- TEST --------------------------
def main():
def main():
'''List monad and set comprehension - parallel routes'''
'''List monad and set comprehension - parallel routes'''
Line 1,218: Line 1,218:




# GENERIC ABSTRACTIONS ------------------------------------
# ------------------------ GENERIC -------------------------


# bind (>>=) :: [a] -> (a -> [b]) -> [b]
# bind (>>=) :: [a] -> (a -> [b]) -> [b]
Line 1,227: Line 1,227:
passed as an argument to the second.
passed as an argument to the second.
'''
'''
return lambda f: list(
return lambda f: chain.from_iterable(
chain.from_iterable(
map(f, xs)
map(f, xs)
)
)
)


Line 1,237: Line 1,235:
def enumFromThenTo(m):
def enumFromThenTo(m):
'''Integer values enumerated from m to n
'''Integer values enumerated from m to n
with a step defined by nxt - m.
with a step defined by nxt-m.
'''
'''
def go(nxt, n):
def go(nxt, n):
d = nxt - m
d = nxt - m
return range(m, n - 1 if d < 0 else 1 + n, d)
return range(m, n - 1 if d < 0 else 1 + n, d)
return lambda nxt: lambda n: list(go(nxt, n))
return lambda nxt: lambda n: go(nxt, n)




# FORMATTING ----------------------------------------------
# ------------------------ DISPLAY -------------------------


# fTable :: String -> (a -> String) ->
# fTable :: String -> (a -> String) ->
# (b -> String) -> (a -> b) -> [a] -> String
# (b -> String) -> (a -> b) -> [a] -> String
def fTable(s):
def fTable(s):
'''Heading -> x display function -> fx display function ->
'''Heading -> x display function -> fx display function ->
f -> xs -> tabular string.
f -> xs -> tabular string.
'''
'''
def go(xShow, fxShow, f, xs):
def gox(xShow):
ys = [xShow(x) for x in xs]
def gofx(fxShow):
w = max(map(len, ys))
def gof(f):
return s + '\n' + '\n'.join(map(
def goxs(xs):
lambda x, y: y.rjust(w, ' ') + ' -> ' + fxShow(f(x)),
ys = [xShow(x) for x in xs]
xs, ys
w = max(map(len, ys))

))
def arrowed(x, y):
return lambda xShow: lambda fxShow: lambda f: lambda xs: go(
return y.rjust(w, ' ') + ' -> ' + fxShow(f(x))
xShow, fxShow, f, xs
return s + '\n' + '\n'.join(
)
map(arrowed, xs, ys)
)
return goxs
return gof
return gofx
return gox