|
@@ -0,0 +1,76 @@
|
|
|
|
|
+import os, argparse
|
|
|
|
|
+
|
|
|
|
|
+def solve_task(lines):
|
|
|
|
|
+ c = CRT()
|
|
|
|
|
+ signal_strengths = []
|
|
|
|
|
+ print(c)
|
|
|
|
|
+
|
|
|
|
|
+ for line in lines:
|
|
|
|
|
+ signal_strengths.extend(c.parse_instruction(line))
|
|
|
|
|
+
|
|
|
|
|
+ total = sum(signal_strengths)
|
|
|
|
|
+
|
|
|
|
|
+ print(signal_strengths)
|
|
|
|
|
+ print(f"Total signal strength: {total}")
|
|
|
|
|
+ print(c)
|
|
|
|
|
+
|
|
|
|
|
+class CRT:
|
|
|
|
|
+ def __init__(self):
|
|
|
|
|
+ self.x = 1
|
|
|
|
|
+ self.cycle = 0
|
|
|
|
|
+ self.screen = [['.' for x in range(40)] for y in range(6)]
|
|
|
|
|
+
|
|
|
|
|
+ def parse_instruction(self, instruction):
|
|
|
|
|
+ states_to_return = []
|
|
|
|
|
+ tokens = instruction.split()
|
|
|
|
|
+ if tokens[0] == "noop":
|
|
|
|
|
+ states_to_return.extend(self.tick())
|
|
|
|
|
+ else:
|
|
|
|
|
+ xdiff = int(tokens[1])
|
|
|
|
|
+ states_to_return.extend(self.tick())
|
|
|
|
|
+ states_to_return.extend(self.tick())
|
|
|
|
|
+ self.x += xdiff
|
|
|
|
|
+
|
|
|
|
|
+ return states_to_return
|
|
|
|
|
+
|
|
|
|
|
+ def tick(self):
|
|
|
|
|
+ to_return = []
|
|
|
|
|
+ self.update_screen()
|
|
|
|
|
+ self.cycle += 1
|
|
|
|
|
+ if (self.cycle+20) % 40 == 0:
|
|
|
|
|
+ to_return = [self.cycle*self.x]
|
|
|
|
|
+ return to_return
|
|
|
|
|
+
|
|
|
|
|
+ def update_screen(self):
|
|
|
|
|
+ y = self.cycle // 40
|
|
|
|
|
+ x = self.cycle % 40
|
|
|
|
|
+ hit = abs(x-self.x) <= 1
|
|
|
|
|
+ self.screen[y][x] = '#' if hit else '.'
|
|
|
|
|
+
|
|
|
|
|
+ def __str__(self):
|
|
|
|
|
+ to_return = str()
|
|
|
|
|
+ for line in self.screen:
|
|
|
|
|
+ to_return += ''.join(line) + "\n"
|
|
|
|
|
+ return to_return
|
|
|
|
|
+
|
|
|
|
|
+def read_lines(filename):
|
|
|
|
|
+ lines = []
|
|
|
|
|
+ with open(filename) as infile:
|
|
|
|
|
+ for raw_line in infile:
|
|
|
|
|
+ line = raw_line.rstrip()
|
|
|
|
|
+ lines.append(line)
|
|
|
|
|
+ return lines
|
|
|
|
|
+
|
|
|
|
|
+def parse_arguments():
|
|
|
|
|
+ parser = argparse.ArgumentParser(description="Script that solves the case",epilog="Have a nice day!")
|
|
|
|
|
+ parser.add_argument('filename', nargs='?', default="example.txt", help='Input file')
|
|
|
|
|
+ args = parser.parse_args()
|
|
|
|
|
+ return args
|
|
|
|
|
+
|
|
|
|
|
+def main():
|
|
|
|
|
+ args = parse_arguments()
|
|
|
|
|
+ lines = read_lines(args.filename)
|
|
|
|
|
+ solve_task(lines)
|
|
|
|
|
+
|
|
|
|
|
+if __name__ == "__main__":
|
|
|
|
|
+ main()
|