Skip to content

Instantly share code, notes, and snippets.

@Grissess
Created May 20, 2017 03:03
Show Gist options
  • Save Grissess/ae10db931fc514ab1e90c48d4b1d66aa to your computer and use it in GitHub Desktop.
Save Grissess/ae10db931fc514ab1e90c48d4b1d66aa to your computer and use it in GitHub Desktop.
def y_combin(f, *args):
return f(f, *args)
def make_line(recur, cur, rest, width):
return (
(cur, rest)
if (not rest) or sum(map(len, cur)) + len(cur) + len(rest[0]) > width else
recur(recur, cur + (rest[0],), rest[1:], width)
)
import math
def spacing(words, width):
return int(math.ceil((width - sum(map(len, words))) / float(len(words) - 1)))
def justify(recur, words, width):
return (
''
if (not words) or width == 0 else (
words[0]
if len(words) == 1 else
words[0] + ' ' * spacing(words, width) + recur(recur, words[1:], width - len(words[0]) - spacing(words, width))
)
)
def make_doc(recur, words, width):
return (
()
if not words else
(y_combin(justify, y_combin(make_line, (), words, width)[0], width),) + recur(recur, y_combin(make_line, (), words, width)[1], width)
)
def fix_doc(recur, lines):
return (
(lines[0],) + recur(recur, lines[1:])
if len(lines) > 1 else
(' '.join(lines[0].split()),)
)
#ln, rest = (y_combin(make_line, (), __import__('sys').stdin.read().split(), 30))
#print(ln)
#print(spacing(ln, 30))
#
#print(y_combin(justify, ln, 30))
#print('0123456789'*3)
#print(len(rest), 'more')
#doc = y_combin(fix_doc, (y_combin(make_doc, __import__('sys').stdin.read().split(), 20)))
#print(doc)
#print(map(len, doc))
def pr(x):
return __import__('sys').stdout.write(x + '\n')
map(pr, y_combin(fix_doc, y_combin(make_doc, __import__('sys').stdin.read().split(), 20)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment