08_digits.py 1.1 KB

12345678910111213141516171819202122232425262728293031323334
  1. #!/usr/bin/env python3
  2. import sys
  3. DIGITS = ('abcefg', 'cf', 'acdeg', 'acdfg', 'bcdf', 'abdfg', 'abdefg', 'acf',
  4. 'abcdefg', 'abcdfg')
  5. OVERLAPS = (None, None, 'cf', 'acf', 'bcdf', 'adg', 'abfg', 'abcdefg')
  6. def parse(line):
  7. inputs, outputs = line.split(' | ')
  8. return inputs.split(), outputs.split()
  9. def output(inp, outp):
  10. candidates = {c: set('abcdefg') for c in 'abcdefg'}
  11. for pattern in inp:
  12. for char in OVERLAPS[len(pattern)]:
  13. candidates[char] &= set(pattern)
  14. known = {}
  15. while any(candidates.values()):
  16. all_known = set(known.values())
  17. for char, possibilities in candidates.items():
  18. possibilities -= all_known
  19. if len(possibilities) == 1:
  20. known[char] = possibilities.pop()
  21. trans = str.maketrans(''.join(known[c] for c in 'abcdefg'), 'abcdefg')
  22. out = 0
  23. for pattern in outp:
  24. out = out * 10 + DIGITS.index(''.join(sorted(pattern.translate(trans))))
  25. return out
  26. notes = list(map(parse, sys.stdin))
  27. print(sum(sum(len(o) in (2, 3, 4, 7) for o in outp) for inp, outp in notes))
  28. print(sum(output(i, o) for i, o in notes))