From dc35256b28f2558c8d5a9951fe36469018ed22a9 Mon Sep 17 00:00:00 2001 From: Joscha Date: Tue, 6 Dec 2022 19:43:56 +0100 Subject: [PATCH] [py] Port 2017_06 --- py/2017/06/solve.py | 49 --------------------------------------- py/2017/06/test_input.txt | 1 - py/aoc/__init__.py | 3 ++- py/aoc/y2017/d06.py | 47 +++++++++++++++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 51 deletions(-) delete mode 100644 py/2017/06/solve.py delete mode 100644 py/2017/06/test_input.txt create mode 100644 py/aoc/y2017/d06.py diff --git a/py/2017/06/solve.py b/py/2017/06/solve.py deleted file mode 100644 index f6841fa..0000000 --- a/py/2017/06/solve.py +++ /dev/null @@ -1,49 +0,0 @@ -import sys - -# PART 1 - -def load_buckets(filename): - with open(filename, "r") as f: - return tuple(map(int, f.read()[:-1].split("\t"))) - -def redistribute(buckets): - l = list(buckets) - i = l.index(max(l)) - n = l[i] - l[i] = 0 - - while n > 0: - i = (i + 1) % len(l) - l[i] += 1 - n -= 1 - - return tuple(l) - -def find_repeat(buckets): - cycles = 0 - states = {buckets: 0} - while True: - buckets = redistribute(buckets) - cycles += 1 - if buckets in states: - return cycles, states[buckets] - else: - states[buckets] = cycles - -# PART 2 - -def loop_cycles(buckets): - cycles, start_cycle = find_repeat(buckets) - return cycles - start_cycle - -def main(filename): - print(f"Solutions for {filename}") - buckets = load_buckets(filename) - cycles, _ = find_repeat(buckets) - print(f"Part 1: {cycles}") - cycles_2 = loop_cycles(buckets) - print(f"Part 2: {cycles_2}") - -if __name__ == "__main__": - for filename in sys.argv[1:]: - main(filename) diff --git a/py/2017/06/test_input.txt b/py/2017/06/test_input.txt deleted file mode 100644 index fa9ed7e..0000000 --- a/py/2017/06/test_input.txt +++ /dev/null @@ -1 +0,0 @@ -0 2 7 0 diff --git a/py/aoc/__init__.py b/py/aoc/__init__.py index e94c500..2609ca0 100644 --- a/py/aoc/__init__.py +++ b/py/aoc/__init__.py @@ -2,7 +2,7 @@ import sys import argparse from pathlib import Path -from .y2017 import d01, d02, d03, d04, d05 +from .y2017 import d01, d02, d03, d04, d05, d06 from .y2018 import d01, d02, d03, d04, d05, d06, d07, d08, d09, d10, d11 from .y2020 import d10 from .y2021 import d14 @@ -14,6 +14,7 @@ DAYS = { "2017_03": y2017.d03.solve, "2017_04": y2017.d04.solve, "2017_05": y2017.d05.solve, + "2017_06": y2017.d06.solve, "2018_01": y2018.d01.solve, "2018_02": y2018.d02.solve, "2018_03": y2018.d03.solve, diff --git a/py/aoc/y2017/d06.py b/py/aoc/y2017/d06.py new file mode 100644 index 0000000..e5b632f --- /dev/null +++ b/py/aoc/y2017/d06.py @@ -0,0 +1,47 @@ +# PART 1 + + +def load_buckets(inputstr): + return tuple(map(int, inputstr[:-1].split("\t"))) + + +def redistribute(buckets): + l = list(buckets) + i = l.index(max(l)) + n = l[i] + l[i] = 0 + + while n > 0: + i = (i + 1) % len(l) + l[i] += 1 + n -= 1 + + return tuple(l) + + +def find_repeat(buckets): + cycles = 0 + states = {buckets: 0} + while True: + buckets = redistribute(buckets) + cycles += 1 + if buckets in states: + return cycles, states[buckets] + else: + states[buckets] = cycles + + +# PART 2 + + +def loop_cycles(buckets): + cycles, start_cycle = find_repeat(buckets) + return cycles - start_cycle + + +def solve(inputstr): + buckets = load_buckets(inputstr) + cycles, _ = find_repeat(buckets) + print(f"Part 1: {cycles}") + cycles_2 = loop_cycles(buckets) + print(f"Part 2: {cycles_2}")