Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from operator import itemgetter
- from collections import defaultdict
- 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, }
- counts = defaultdict(int, {pattern: 1})
- while len(todo) > 0:
- part = max(todo, key=len)
- todo.remove(part)
- for towel, towel_len in towels:
- if part[:towel_len] == towel:
- new_part = part[towel_len:]
- counts[new_part] += counts[part]
- if new_part != '':
- todo.add(new_part)
- return counts['']
- def main(towels, patterns, verbose):
- total = 0
- for pattern in patterns:
- result = possible(pattern, towels)
- if verbose:
- print(f'{pattern} can be made in {result} ways')
- total += result
- 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