import fileinput import math from pprint import pprint from itertools import chain, combinations, count, groupby import re RE = re.compile(r"[#\?]") def powerset(iterable): "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)" s = list(iterable) return chain.from_iterable(combinations(s, r) for r in range(len(s)+1)) def main(): (part1, part2) = (0, 0) inp = fileinput.input() for line in inp: (springs, groups) = line.split() groups = [int(g) for g in groups.split(",")] unknowns = [x for (x, c) in enumerate(springs) if c == "?"] springs_ = springs.replace("?", ".") for xs in powerset(unknowns): h = "".join("#" if i in xs else c for (i, c) in enumerate(springs_)) match = [len(g) for g in RE.findall(h)] if match == groups: part1 += 1 print(part1, part2) if __name__ == "__main__": main()