Source code for challenges.challenge

import re
import types


[docs]class Challenge: sample = 'sample' line_break = '\n' split_pattern = '\s+|\s?,\s?' edge_pattern = '^(\d+)->(\d+)(:(\d+))?$' def __init__(self): self.lines = [] self.model = types.SimpleNamespace() self.result = types.SimpleNamespace() self.output = ''
[docs] def main(self): self.read() self.build() self.calc() self.format()
# -------------------------------------------------- # Default workflow # --------------------------------------------------
[docs] def read(self): lines = self.sample.strip().splitlines() self.lines = [line.strip() for line in lines]
[docs] def build(self): pass
[docs] def calc(self): pass
[docs] def format(self): self.output = str(self.result)
# -------------------------------------------------- # Accessing lines # --------------------------------------------------
[docs] def line(self, number): return self.lines[number]
[docs] def lines(self): return self.lines
[docs] def line_to_integers(self, line_nr): return [int(i) for i in re.compile(self.split_pattern).split(self.line(line_nr))]
[docs] def line_to_floats(self, line_nr): return [float(i) for i in re.compile(self.split_pattern).split(self.line(line_nr))]
[docs] def line_to_edge(self, nr): return self._to_edge(re.compile(self.split_pattern).match( self.line(nr)))
[docs] def read_edges(self, first=0, last=None): nr = first while True: try: line = self.line(nr) except IndexError: break match = re.compile(self.edge_pattern).match(line) if match: yield (self._to_edge(match)) if nr == last: break else: nr += 1 else: break
@staticmethod def _to_edge(match): edge = types.SimpleNamespace() edge.tail = int(match.group(1)) edge.head = int(match.group(2)) if match.group(4): edge.weight = int(match.group(4)) return edge # -------------------------------------------------- # Formatting # -------------------------------------------------- @staticmethod
[docs] def format_list_of_integers(integers, joint=', '): return joint.join(str(x) for x in integers)
[docs] def format_path(self, integers, backwards=False): if backwards: joint = '<-' else: joint = '->' return self.format_list_of_integers(integers, joint)