From 211329f8be58148154036902964bc915a8403f7b Mon Sep 17 00:00:00 2001 From: James Hallam Date: Fri, 15 Dec 2023 15:10:54 +0000 Subject: [PATCH] Day 14 --- 14/14-1.py | 58 +++++++++++++++++++++ 14/14-2.py | 139 +++++++++++++++++++++++++++++++++++++++++++++++++ 14/14-test.txt | 10 ++++ 14/14.txt | 100 +++++++++++++++++++++++++++++++++++ 4 files changed, 307 insertions(+) create mode 100644 14/14-1.py create mode 100644 14/14-2.py create mode 100644 14/14-test.txt create mode 100644 14/14.txt diff --git a/14/14-1.py b/14/14-1.py new file mode 100644 index 0000000..87adab8 --- /dev/null +++ b/14/14-1.py @@ -0,0 +1,58 @@ + +DIR = [-1, 0] + + +def get_input(): + with open("14.txt", "r") as f: + lines = f.readlines() + return [list(l.strip()) for l in lines if l != ""] + return [l.strip().split("\n") for l in f.readlines() if l != ""] + + + + +def move_boulder(rocks, coords): + c = coords + r = rocks + while True: + if r[c[0]][c[1]] != "O": + return r + next_ = [c[0] + DIR[0], c[1] + DIR[1]] + if next_[0] < 0 or next_[1] < 0: + return r + if r[next_[0]][next_[1]] == "#": + return r + elif r[next_[0]][next_[1]] == "O": + return r + elif r[next_[0]][next_[1]] == ".": + print("moving to ", next_) + print(c, next_) + r[c[0]][c[1]] = "." + r[next_[0]][next_[1]] = "O" + c = next_ + + +def count_rows(rocks): + count = 0 + for i, l in enumerate(rocks): + for c in l: + if c == "O": + print("adding ", i) + count += len(rocks)-i + return count + +def main(): + rocks = get_input() + for l in rocks: + print(l) + print("\n") + for i, l in enumerate(rocks): + for j,r in enumerate(l): + rocks = move_boulder(rocks, [i, j]) + for l in rocks: + print(l) + print(count_rows(rocks)) + +main() + +# 108840 \ No newline at end of file diff --git a/14/14-2.py b/14/14-2.py new file mode 100644 index 0000000..f8a9ed0 --- /dev/null +++ b/14/14-2.py @@ -0,0 +1,139 @@ +import numpy as np + +DIRS = [-1, 0] + +TRANS = {"#": 1, ".": 0, "O": 2} + +R_TRANS = {1: "#", 0: ".", 2: "O"} + + +def get_input(): + with open("14.txt", "r") as f: + lines = f.readlines() + return [list(l.strip()) for l in lines if l != ""] + + +def move_boulder(rocks, coords, i): + rocks = np.array(rocks) + di = i % 4 + rocks = np.rot90(rocks, -1 * di) + c = coords + r = rocks + while True: + if r[c[0]][c[1]] != "O": + r = np.rot90(r, di) + return r + next_ = [c[0] + DIRS[0], c[1] + DIRS[1]] + if ( + next_[0] < 0 + or next_[0] > len(r) - 1 + or next_[1] < 0 + or next_[1] > len(rocks) - 1 + ): + r = np.rot90(r, di) + return r + if r[next_[0]][next_[1]] == "#": + r = np.rot90(r, di) + return r + elif r[next_[0]][next_[1]] == "O": + r = np.rot90(r, di) + return r + elif r[next_[0]][next_[1]] == ".": + r[c[0]][c[1]] = "." + r[next_[0]][next_[1]] = "O" + c = next_ + + +def count_rows(rocks): + count = 0 + for i, l in enumerate(rocks): + for c in l: + if c == "O": + count += len(rocks) - i + return count + + +def rotate(rocks, times): + r = np.array(rocks) + r = np.rot90(r, times) + return r + + +def get_str_rep(rocks): + stri = "" + i = 0 + for l in rocks: + for r in l: + stri += str(TRANS[r]) + i += 1 + + return stri + + +def create_hash(rocks): + hash = [] + for ind in range(2000): + for i, l in enumerate(rocks): + for j, r in enumerate(l): + rocks = move_boulder(rocks, [i, j], ind) + str_rep = get_str_rep(rocks) + if ind % 4 == 3 and ind != 0: + hash.append(str_rep) + with open("hash.txt", "w") as f: + for h in hash: + f.write(h + "\n") + return hash + + +def translate_hash(hash, line_len): + rocks = [] + row = [] + hash = [int(i) for i in str(hash)] + j = 0 + while j < len(hash): + for i in range(line_len): + int_rep = hash[j] + row.append(R_TRANS[int_rep]) + j += 1 + rocks.append(row) + row = [] + return rocks + + +def find_repeating(hash): + max_ = int(len(hash)) - 1 + min_ = 30 + poss = [] + for i in range(min_, max_): + j = 0 + while j < int(len(hash)) - (min_ * 2): + comp_1 = hash[j : j + i] + comp_2 = hash[j + i : j + (i * 2)] + if comp_1 == comp_2: + poss.append([j, i]) + j += i + else: + j += 1 + return poss[0] + + +def get_hash_from_file(): + with open("hash.txt", "r") as f: + return [l.replace("\n", "") for l in f.readlines()] + + +def main(): + rocks = get_input() + l = len(rocks[0]) + hash = create_hash(rocks) + # uncomment below after first run to avoid having to recreate hash each time + # HASH = get_hash_from_file() + start, length = find_repeating(hash) + pattern = hash[start : start + length] + i = (1000000000 - (start + 1)) % (length) + print(count_rows(translate_hash(pattern[i], l))) + + +main() + +# 103445 diff --git a/14/14-test.txt b/14/14-test.txt new file mode 100644 index 0000000..b92d1a3 --- /dev/null +++ b/14/14-test.txt @@ -0,0 +1,10 @@ +O....#.... +O.OO#....# +.....##... +OO.#O....O +.O.....O#. +O.#..O.#.# +..O..#O..O +.......O.. +#....###.. +#OO..#.... \ No newline at end of file diff --git a/14/14.txt b/14/14.txt new file mode 100644 index 0000000..72e8e02 --- /dev/null +++ b/14/14.txt @@ -0,0 +1,100 @@ +..#..#..#.#OO.O#...#O..O..O#.###.O...##..OO...#.O#..##......OO.#O.O.#.O..#...#OO..OO..O.O..#.OO...## +.#.#..#.OO.O...O###OO.O.OO......O.OO#....O#....##O.O..O....##...O...O#..O###O...OO#......O#.#...O..O +..O..#OOO##.....O...#O..#.#.O##......O.##.OO..O...O...OO.O.#.##.OOO...OO....#..#...........#.....#.. +.......O....O#........O.O#..#....#..O.O.........#O.OO.OOO..........O#OO..#.......O#OO#O.....O....O.. +##..O##.#.#.#.##...O.O..#.#O....#......#..O.#..#.O..#.......O......O..###OOO...#.....#...#....OO...O +..#.#....O...O.....#..............O.O.....OO.#OO.#..#.O...O..#.##.#.#O.O#O.....#O..#..O.#....O.#O.O. +.#..O....O...#O...#...###...#O......#O..#......O.....O...O...O..#..#..#.O.O....O....O##.#O.#...#O#OO +O..O.....#OOO.OO.O#.O..O.....O..O.O##..O...##...#.#.....O...#.O..#.O.##.#...#..###......#..O..###..O +#.....#.O#..#.#O....#O..#..OO..#OOO..#......O#..O#..O.#..#.O...O.OO...O#.O.O.#.......#O...#..#...... +....#..........O.#....#..#..OO.O...##......O.#.#.O...O.#.OO#O.OO...O.#.#OO.....O#.#....#..O.#O#..OO. +#..#..#....O....#.#..O...##..O#.O..O#........O.#O....OO.#OO#..........O.OO.......##O.O..O....O.OOO.. +OO#....OOO##O..........O.O.O.O#.....#........OO..OO...#.......#O.....#O..#....#.#...O...O.....OOO#.O +...O......#...O#O..#O.O...O.O.#.....O......O....#O...O.....#......#O.O...#.............#O..#O....... +..#..#..O.#..#O..#.OO#.O#.O..#.#..#.O..#..O....OOO.#.OO.O##..#.#.#.##..##OO##.#.O.O.#O..#..#.OO.O#.. +..#O#.#....O..OO.#O..OOOO.O#OO#...#O.O..O#...#....O#.#..#..#.#...#....#.....##..O.O....O#....#...... +...O.O.O#.O.#.......O..........O.O##..O##O#.#..#O.O..#O#...O.#.#....O.O....OOO.OO...#.OO..#.O##O..## +.O...OO.#......OO..#.##....##...O#.#..OO....#..#.#......O.O..O........OO.O.O..OO.O.O.#..O..#O..O.... +........O.O.OOOO#.#..O.........O...O....O..#.#O...#.#O...O...O.##.O....##..#.....O.##....OO.#O...... +.O...#O..#.........OO....###.O#....###..O.....O..##O...#OO..O...O.O..O.O.O.O#OO.OOO...O#.#O.....O... +OO..OO.#......O..##.........O..OO#..OO......#.......#.#..O#.###..O.O...##O.....OOO.O#OO...#.#O...O.. +#...#O.......O.OO.O.........O....O.O.O#.....O...O...O.#.O....#..##.#.O....O#..O...OOOO.#.#OO.#..#O.. +O.#.O..O...O#.....#.O.O#........OO..#.O...........#.........O.OO.#.O.#.#.....O#..O.O.O###.#.O.....#. +.......##O#..#.#.OO.O#O##.#....OO#O#..##O#...O.#O..O.#.##......O.....O..O.OOO..........O.O...O..#.O. +.......O..O.....#OO....O.#........O......O.......OO..##.O.....O...#.....O.O..O..O...O....O...#..O..O +.OO..O........#..O.OO#.O.O..O..#.........O.....O.....#..O..#.......#..#.O...OO.##.#.O..#.#..#..#..#O +..O..#.#.O...O#O..O..O.#O#O..##...#O..O.O.OO..OO......O...O..O#O...O.............O......##..OO..#... +..O.##O##....#..O..#OO.#O...#.#..........#.O..#..#....#...O......O..##O.....O..##.OO...#....O..#.O.. +O.#........###.......#..#.O..O...#.....O#.##.#.O..........O...OO..O...O.#.#..O..#....O..OO...#O##... +.......O.#OO..#.O##.....#.O.O..O....##OOOO...#.OOOO.O.#.O.OO..#O#.O..O.#..O......#.....O.....#.#.O.. +O#..#.O.......#....#..#....O.....O....#OO.O.....#O..#.OO...O.O...O...##....OO#...#.......O.....O.... +...#.O.#O..O#.O..#...#O#..#.....OO#..##O.O...O.O..O.O....#...OO.###OOO..#.#..##OO#.#.#...O.OO.O...#. +#......#.O..........#OO#.#.O.#.O...O.#..O..#.#..OO......#..O..OOOO..#O...O...O.OO...........#...O..# +O..O....#OO.#.#.O#O##.O#..##...OO##.#....##O.....O.O....O...O..#O#....#..O...O#.O.O.O..O.........#.O +.O.O..............O..O...O...#..#...O...O.O....##.#.O...O.#O..........O#.O..O.##....#.......#..O##.O +...O.OO...O#...OO.#OO..#..#...O#.......O#.....O#..#.O..#..#.OO#...O..O.O..###....O..#.O.O......##.O# +.#.#..#O....OOO..#.OOO..#..O.O.#....#......#..#OO.O....O...O.....O#.O..O..OO.O...O#..O#.#...O#..#..O +.O.#.O.#..#.O.#O......O..#..OO..O.O#.#.O...#.O#O.#O.#.##...#.O.....O##....#.##....#..#O.#O.O..O..OO. +##.........O...O...O#O..#..#..OO......OO..O...#..O..#O.#..OO.......##...O....OO..#.O.OOO..........O. +..O..OO.O..O.#OO##.O...OO#.#..#.#O.#.#..#......O#O...#.O....O.#O#...##.......OO.......O...O.#.#...#. +O.O..#.......O#O...#.O.#OO...#O......#..O.O.....O...#O....#....O#....OO..O#OO.O......#.#..#OO...#..O +....##..O.O#OO.....#..........O..OO.#O...#..O#..O.#O....OO#O.###...#.......O..#.O.....O...O.....O... +...#.O.O.#O...#...................#..O..OO..OO.#...#..#.#OO....O.O#.O...#..#O.....OO..#OOO.#..#.O... +....OO...O...#O.O..O#O.O.#.....OOO.#O..O...#....O.....O#....O...#OO#.##O#.O..OO......O#.OO.O#....O.O +.#...#O....O.#...#.O##...........#..............O..#.#...#..#....O...#....O............O.......#O... +O......O....#O#......O.#.##O#O..#.......#.......O....#O..O.....#OOOO.O#OO.O..O.......O#....O..O..... +.O.....O#.......O#O.O#......O....O.O##....O..OO.#..O#.##........#..#.......##...O..O#..O.OO.OO..O.OO +......#..OO...##.#..###O.........O.....O..#.#.##O..O.#.OO#O#.#.#.#O.#O....O.#..##.#.#....O....O..... +O#..O.....#..O#O.#O.O.#........#..O......#.O.O.OO..O#........OOO....O#O..O.O#O#.####.O#.O.....#O.O.. +#.O....O#..#.O...O......O.......O.#.....O....O......#.O....#.##O.OO.O..#..#.O..#..#.O#..O....O#....# +#OO..#...#.#..........OOO.#.#O.....#..#..##O.O#O#.O#.#..#...O....#..#O..##...##.O.O#.O...#O.O..OO.O# +OO#.....#.OO#O.#O#..#.#OOO.#..##....#.#.#.O#..#....#..........OOO...#.O...#O#......O.#....#.#.##.O.O +#..##OOO..OO.O.#...O#.....O......O..#....O.#.#......O#O....OO#..O.OO.#...#.#O..O###.O.##.#.##.#O.#.. +.O..#...#.O.......O...O..O.....O..O.....#.O.#O...O#......#.....#...#..#.O#.O......O#...#....O.##.#.. +O..O#.O#...###.....O.O.#..O.........O..O.O#..#.O..#O.O#..###.#.#..O.O..OO.#..O.....OOO.O.......#...O +....O##......#.........#.#O....O....O..O.......O#O..O..#.#..........O.O..#.OO.O#.#.#....O###.#O....# +.#.O.......#.#....O..O.........#O..O.OO.....#.OO.O..#.O..#.#O.#O....#....O.##O.#.O....O.O..O#.#O.##. +..OO.##.#.....OO#.#O.#.O...#..#...O..#......#..#O.#.O#OO.....#...O.O..O#O.O.#..##...O....#......O.#. +....OO.#OOOO#....#..#...#.....O.#.#.........#.O.#.O..O#..O..........O.#.OO.#....##OO..O.O....#.O#... +.......O.#.O.#OO#O..#.#...O..#...OO...OO..........#...O...............#O..####....#..##..##O........ +.......O...OO..#...O.O.#.O..O.O..O..O##O.O.........#.O.O...O.#....#.....##OO....#..#.#OOO........... +...O..O...O#....O#...#.OO......OO.OO.....O...O...#.O..#..OO.O...O.......O..O#O...O..#O.#OOOOO..O.... +....O..O.O.OO..O#...O.#.#....#....##O##.#..OOO...#.........OOO..O#..OO.....#...O.......####.#O.#..#. +#O.#..#......O......O#........O.#.OO..#............#....#O..O....#..OO...OO#O.O..O.O#...O.OO....#... +...#..##O.......##..#.O....####OO.#OO#.#.O..O..O.O...O.O.....O...#..##.O........#....#O#.#.OOO.#...# +..##OO..O.#.#OO##....O.........#........#.O....O.##...OO.#.O......O..O..#....#O.#...#O.OO...O....... +#.O.#O...........#OO#...#...O#..OO.O...O..#.O#OOOO.O......OO.....O..#................#.#OO....O.OO.# +..O..#....OOOO..O##OO#.O..#O..O..#...OOO....OO.#.....#.O.#.O..O...OO........O.O...#OO...O..O....OO#O +#.....#....#..O#.###..#OO..O.#.O#O..#.O....O#O...#O..#....###.O...#.#.##OO...O.#....#.O..#..O.#....O +......O.#..#...O..O....O.OO.##....OO.O...O.O..O#..#....O..O.....#..O....#.....#...O................. +..#O......O.O...#...#..O.O.#OO.....O.O...OO....O...#..OO.#....O.....OO....O..OO#..O...#....O.OO#.#O. +.O#O.##....O.#.....O..#.#..#.O#O..O...O..#....#O.##OOO...O##..#..#.O#..O#.....O#....#OO.#..O.#OO.... +.O#...#.....#.....##..OO........###....O...O......#.O#.#.#.....#..O..#O.O.#O....#.O.OOO....O#O...O#. +.OO.#..O..O#O.OO...#........O.OOO..#O#.OOO#.#O...OO#O.#....O#..O.......O.O...O..###O.#O##.....#.#O.. +#O...##.O#...O.#.O.O#O.....#.......O.#O....#O......#...OOO...O.#.#..OO..O##..#..O.O##...O...#O..OO.O +..##.........O.O..#.O#O#.#....OO#O.#.#.O.O...OO..#.#.OO..O..O#...##....O..O....#......O..OOOO.O..... +...O.O..O......O............O...#.#..#.#...O#O.#....O.#..O...#.#.OO#O...#.O.....#O...#.....OO.##...# +..O#.#.O..O..#O..#OO.#..#.O....#O#O#O..#O#O...OO.#.##...#...OO.....##..#...O....##...O..#.O..#...... +....#..O#.....#O.........#O..#....#.O.#.....#.O..#..OO......O.OOO.O...O##..O.#.......O.O.#.......O.. +....O.O#...O....O.O.##..O......O..#....O......#.....#.##O.#.O..OO..#...O..#..O.##OOO..O.......#..#OO +...O.....#O......##...OO#...O.#.#O..#..#.#O..#.O...#.#..O#..#O....#.O#O#.......OO.##.......O..##.... +.#...OO.O......#O.O#.O.O...O#O.O#O..O.O.O..#O.O...........##.O....OO.O.O..O.O.O.O..OO...#..O.O...... +....#.##.O.OO.O#..#.O.....O.O....O..O..........#O....#..OO.OO....OO..O.O..OO...O.OO#..O....#O...O#.. +..#O.O#O.O...O....OO.#..O...#.O..#..#..O...O.O.O....##...O.#..OO###..O.O.#..#O#..O#.O.O#..#....O..OO +#..O.#..O.#.O...#.#.OOO.....O...O#..#O#.#...O.##.O#.#.OOO....##.#.#..#..#..##...#..OO.....##...#.... +O##...O....O##....#.O#..#O#.OO......#OOO...O.OO....O...#O.##....OO..O.O#O.#..O#.O...O#.........#.O.. +.#O.O.##OO.....O.O##....OO#.O......##.O.O#O.....O.....OOO#.......##.##....#O..OO..O......#.........O +#...OOO.#....#.O.O.OO....OO..O.....O..#.O.......###......O...O.O...OO.#.....#OOO..#......O#.#..#.O.# +.OO...O#.O#.#.#...OO.O#...##.O..OO.....O.O.##..#......OO.###.#.....OO....O...O..#.......O..#.O...... +.....O..O.#.#..O......O.O....#O#.O...#.O...##O#........O#O.O#.O...#O#O.O..O..O..#.....#.....#....... +..#O.O.##.OO#OOO..O.O#..OO.....#..O...#..#OOO#..O.O####OO..#.O....#O#.O.#....#.OO.OO.O.#....O.O#.#.. +...#....O.O..##..O......#OO.##OO.O...O...O...O..OO.O.OOOO.#...OO..O..#OO..........#O......#...#..O.. +##O.#...O......#..##....OO....#......#..#...O.....#...O##.O....O...#O.O#O..#O.........##O.#......O.. +.#....#.....O#..O..O...#OO.#...O.#..O..O.....#...#.OO.....O......O...OO...O#......#...#O..##.##.O.O# +##OO.O..OO##O.O.O.#.#...#....OO.........O...O....#.#.#..#............#O.....OO.#..O.....#..O...O.... +...#OO.#.O...OO.O....###..#...OO..#.#..O.O.O....OO..#O..#.###..#O..#.O.....#OO.OO..###O..##.OOO..... +O.O.#....###....#..##...O..O....O.OO.#OO.....O.###....O.#.....O...O..##..#O#O.O...OO#....O.#........ +OO..O....O#.#.O.....#......#.O#O.##.O.#....O.#O.OO..O........O#.....OO.#...O....O..O#...........#O#. +.#....#O....OO.O##....O.O.O..OO....#O...OO..#...#.#.......O###..O.#O#...#...O.#OO.........O..O...O.O +#OOO#.O#.O#.#.O...#.........#.O....#O#.#O..O#...#.O..###..O.O#...##...O.O#.......O#OO#OO.O...O...##. +.....O.OO#.#..O.#.O.O#....##O.#....#O..#.......O#.#O##...O.#.#...O#...O#...O.O#........#.OO#..O..... \ No newline at end of file