From 9cd7cba1c2acf0836d2db3e4dee4d9d2f94e4742 Mon Sep 17 00:00:00 2001 From: fettlaus <_Ox46K:26i?> Date: Sat, 7 Dec 2019 01:53:22 +0100 Subject: [PATCH] Finally added day 3 --- advent.py | 2 ++ days/day3.py | 48 ++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/advent.py b/advent.py index 575b29b..1630b1b 100644 --- a/advent.py +++ b/advent.py @@ -8,6 +8,8 @@ def suite(): suite.addTest(Day1('test_day1b')) suite.addTest(Day2('test_day2a')) suite.addTest(Day2('test_day2b')) + suite.addTest(Day3('test_day3a')) + suite.addTest(Day3('test_day3b')) suite.addTest(Day4('test_day4a')) suite.addTest(Day4('test_day4b')) suite.addTest(Day5('test_day5a')) diff --git a/days/day3.py b/days/day3.py index d308f28..9150d1d 100644 --- a/days/day3.py +++ b/days/day3.py @@ -1,11 +1,55 @@ import unittest import os +import sys class Day3(unittest.TestCase): inputfile = os.path.join(os.path.dirname(__file__), "input/day3_input") + def draw_path(self, inst): + path = set() + dists = {} + cnt = 0 + ptr = (0, 0) + for d, l in ((x[0], x[1:]) for x in inst.split(',')): + for _ in range(int(l)): + if d == 'D': + ptr = (ptr[0], ptr[1] - 1) + elif d == 'R': + ptr = (ptr[0] + 1, ptr[1]) + elif d == 'U': + ptr = (ptr[0], ptr[1] + 1) + else: + ptr = (ptr[0] - 1, ptr[1]) + cnt += 1 + if ptr not in dists or dists[ptr] > cnt: + dists[ptr] = cnt + path.add(ptr) + return (path, dists) + def test_day3a(self): + paths = [] + result = sys.maxsize + + with open(self.inputfile) as fp: + for line in fp.readlines(): + paths.append(self.draw_path(line)[0]) + for x, y in paths[0].intersection(paths[1]): + dist = abs(x) + abs(y) + result = dist if dist < result else result + self.assertEqual(result, 399) + + def test_day3b(self): + paths = [] + distances = [] + result = sys.maxsize + with open(self.inputfile) as fp: - steps = fp.readline().split(',') - pass + for line in fp.readlines(): + computed = self.draw_path(line) + paths.append(computed[0]) + distances.append(computed[1]) + for point in paths[0].intersection(paths[1]): + dist = distances[0][point] + distances[1][point] + result = dist if dist < result else result + self.assertEqual(result, 15678)