Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
OOP Seven Segment Displays solution in Clear category for Seven Segment by Raccoom
from typing import Sequence, FrozenSet, Tuple, Set
class Display:
"""A 7-segment display."""
def __init__(self, lit_segments : Sequence[str]):
self.lit_segments = self._parse_segments(lit_segments)
def _parse_segments(self, segments : Sequence[str]) -> FrozenSet[str]:
"""Parse `segments` into a set of lowercase letters `[a-g]`."""
return frozenset(x.lower() for x in segments)
class BrokenDisplay(Display):
"""A broken 7-segment display."""
def __init__(self, lit_segments : Sequence[str], broken_segments : Sequence[str]):
super().__init__(lit_segments)
self.broken_segments = self._parse_segments(broken_segments)
def displays(self, display : Display) -> bool:
"""Return whether this object could be displaying `display`."""
return (display.lit_segments - self.broken_segments) == self.lit_segments
def separate_segs(segs : Sequence[str]) -> Tuple[Set[str], Set[str]]:
"""Split `segs` into two sets for the first and second display."""
first = set()
second = set()
for x in segs:
target_set = first if x.islower() else second
target_set.add(x)
return first, second
digits = [
Display('bc'), # 1
Display('abged'), # 2
Display('abgcd'), # 3
Display('fbgc'), # 4
Display('afgcd'), # 5
Display('afedcg'), # 6
Display('abc'), # 7
Display('abcdefg'), # 8
Display('abcdfg'), # 9
Display('abcdef'), # 0
]
def count_possibilities(display : BrokenDisplay):
"""Count how many different digits `display` could be displaying."""
return sum(display.displays(digit) for digit in digits)
def seven_segment(lit_set, broken_set):
lit_seg_first, lit_seg_second = separate_segs(lit_set)
broken_seg_first, broken_seg_second = separate_segs(broken_set)
first_display = BrokenDisplay(lit_seg_first, broken_seg_first)
second_display = BrokenDisplay(lit_seg_second, broken_seg_second)
return count_possibilities(first_display) * count_possibilities(second_display)
if __name__ == '__main__':
assert seven_segment({'B', 'C', 'b', 'c'}, {'A'}) == 2, '11, 71'
assert seven_segment({'B', 'C', 'a', 'f', 'g', 'c', 'd'}, {'A', 'G', 'D', 'e'}) == 6, '15, 16, 35, 36, 75, 76'
assert seven_segment({'B', 'C', 'a', 'f', 'g', 'c', 'd'}, {'A', 'G', 'D', 'F', 'b', 'e'}) == 20, '15...98'
print('"Run" is good. How is "Check"?')
June 28, 2019