Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
slightly weird solution in Creative category for Seven Segment by juestr
from collections import namedtuple
from itertools import chain, combinations, tee, filterfalse
def powerset(iterable):
s = list(iterable)
return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
def partition(pred, iterable):
t1, t2 = tee(iterable)
return filterfalse(pred, t1), filter(pred, t2)
class D7(namedtuple('D7', ['state'], defaults=[frozenset(),])):
'''A seven segment display cell, using abcdefg to encode segments'''
__slots__ = ()
@staticmethod
def from_iter(xs):
return D7(frozenset(x.lower() for x in xs))
@staticmethod
def two_cells(segs):
return tuple(D7.from_iter(segs) for segs in partition(str.islower, segs))
def __add__(self, other: 'D7'):
return D7(self.state.union(other.state))
def __sub__(self, other: 'D7'):
return D7(self.state - other.state)
def ndigits(self, mask: 'D7'):
'''Number of possible digits if segments in mask are broken in self'''
forced_ons = (D7.from_iter(s) for s in powerset(mask.state))
candidates = (self - mask + on for on in forced_ons)
return sum(1 for c in candidates if c in self.digits)
def __repr__(self):
return 'D7(' + ''.join(sorted(self.state)) + ')'
D7.digit_patterns = '''
_ _ _ _ _ _ _ _ .a.
| | | _| _| |_| |_ |_ | |_| |_| fgb
|_| | |_ _| | _| |_| | |_| _| edc
'''
D7.digits = {
D7.from_iter(
seg
for line in D7.digit_patterns.splitlines()[1:]
for pat, seg in zip(line[i*4:i*4+3], line[40:43])
if pat != ' ')
for i in range(10) }
def seven_segment(lit_seg, broken_seg):
cell1, cell2 = D7.two_cells(lit_seg)
mask1, mask2 = D7.two_cells(broken_seg)
n1 = cell1.ndigits(mask1)
n2 = cell2.ndigits(mask2)
return n1 * n2
April 12, 2019
Comments: