Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from operator import itemgetter
- from argparse import ArgumentParser, FileType
- def parse_towels(line):
- return sorted(((towel, len(towel)) for towel in line.split(', ')),
- key=itemgetter(1), reverse=True)
- def parse_patterns(src):
- return [line for line in src.splitlines() if line != '']
- def parse(src):
- towels, patterns = src.split('\n\n', 1)
- return parse_towels(towels), parse_patterns(patterns)
- def possible(pattern, towels):
- todo = {pattern, }
- while len(todo) > 0:
- part = todo.pop()
- for towel, towel_len in towels:
- if part[:towel_len] == towel:
- if part == towel:
- return True
- todo.add(part[towel_len:])
- return False
- def prune_towels(towels):
- index = 0
- while index < len(towels) and towels[index][1] > 1:
- # a towel that can be made from other towels is redundant
- if possible(towels[index][0], towels[index+1:]):
- towels.pop(index)
- else:
- index += 1
- def main(towels, patterns, verbose):
- prune_towels(towels)
- total = 0
- for pattern in patterns:
- if possible(pattern, towels):
- if verbose:
- print(f'{pattern} is possible')
- total += 1
- elif verbose:
- print(f'{pattern} is not possible')
- return total
- arg_parser = ArgumentParser()
- arg_parser.add_argument('src', type=FileType('r'))
- arg_parser.add_argument('-v', '--verbose', action='store_true')
- if __name__ == '__main__':
- args = arg_parser.parse_args()
- print(main(*parse(args.src.read()), args.verbose))
Advertisement
Add Comment
Please, Sign In to add comment