From 3d7dd37c115471ef1e5bdfaa326fd323dbfd4c9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Capelle?= Date: Sat, 6 Jan 2024 11:30:10 +0100 Subject: [PATCH] 2015 day 10. --- src/holt59/aoc/2015/day10.py | 148 ++++++++++++++++++++ src/holt59/aoc/inputs/holt59/2015/day10.txt | 1 + 2 files changed, 149 insertions(+) create mode 100644 src/holt59/aoc/2015/day10.py create mode 100644 src/holt59/aoc/inputs/holt59/2015/day10.txt diff --git a/src/holt59/aoc/2015/day10.py b/src/holt59/aoc/2015/day10.py new file mode 100644 index 0000000..55cdef2 --- /dev/null +++ b/src/holt59/aoc/2015/day10.py @@ -0,0 +1,148 @@ +import itertools +import sys + +line = sys.stdin.read().strip() + +# see http://www.se16.info/js/lands2.htm for the explanation of 'atoms' (or elements) +# +# see also https://www.youtube.com/watch?v=ea7lJkEhytA (video link from AOC) and this +# CodeGolf answer https://codegolf.stackexchange.com/a/8479/42148 + +# fmt: off +atoms = [ + ("22", (0, )), # 0 + ("13112221133211322112211213322112", (71, 90, 0, 19, 2, )), # 1 + ("312211322212221121123222112", (1, )), # 2 + ("111312211312113221133211322112211213322112", (31, 19, 2, )), # 3 + ("1321132122211322212221121123222112", (3, )), # 4 + ("3113112211322112211213322112", (4, )), # 5 + ("111312212221121123222112", (5, )), # 6 + ("132112211213322112", (6, )), # 7 + ("31121123222112", (7, )), # 8 + ("111213322112", (8, )), # 9 + ("123222112", (9, )), # 10 + ("3113322112", (60, 10, )), # 11 + ("1113222112", (11, )), # 12 + ("1322112", (12, )), # 13 + ("311311222112", (66, 13, )), # 14 + ("1113122112", (14, )), # 15 + ("132112", (15, )), # 16 + ("3112", (16, )), # 17 + ("1112", (17, )), # 18 + ("12", (18, )), # 19 + ("3113112221133112", (66, 90, 0, 19, 26, )), # 20 + ("11131221131112", (20, )), # 21 + ("13211312", (21, )), # 22 + ("31132", (22, )), # 23 + ("111311222112", (23, 13, )), # 24 + ("13122112", (24, )), # 25 + ("32112", (25, )), # 26 + ("11133112", (29, 26, )), # 27 + ("131112", (27, )), # 28 + ("312", (28, )), # 29 + ("13221133122211332", (62, 19, 88, 0, 19, 29, )), # 30 + ("31131122211311122113222", (66, 30, )), # 31 + ("11131221131211322113322112", (31, 10, )), # 32 + ("13211321222113222112", (32, )), # 33 + ("3113112211322112", (33, )), # 34 + ("11131221222112", (34, )), # 35 + ("1321122112", (35, )), # 36 + ("3112112", (36, )), # 37 + ("1112133", (37, 91, )), # 38 + ("12322211331222113112211", (38, 0, 19, 42, )), # 39 + ("1113122113322113111221131221", (67, 39, )), # 40 + ("13211322211312113211", (40, )), # 41 + ("311322113212221", (41, )), # 42 + ("132211331222113112211", (62, 19, 42, )), # 43 + ("311311222113111221131221", (66, 43, )), # 44 + ("111312211312113211", (44, )), # 45 + ("132113212221", (45, )), # 46 + ("3113112211", (46, )), # 47 + ("11131221", (47, )), # 48 + ("13211", (48, )), # 49 + ("3112221", (60, 49, )), # 50 + ("1322113312211", (62, 19, 50, )), # 51 + ("311311222113111221", (66, 51, )), # 52 + ("11131221131211", (52, )), # 53 + ("13211321", (53, )), # 54 + ("311311", (54, )), # 55 + ("11131", (55, )), # 56 + ("1321133112", (56, 0, 19, 26, )), # 57 + ("31131112", (57, )), # 58 + ("111312", (58, )), # 59 + ("132", (59, )), # 60 + ("311332", (60, 19, 29, )), # 61 + ("1113222", (61, )), # 62 + ("13221133112", (62, 19, 26, )), # 63 + ("3113112221131112", (66, 63, )), # 64 + ("111312211312", (64, )), # 65 + ("1321132", (65, )), # 66 + ("311311222", (66, 60, )), # 67 + ("11131221133112", (67, 19, 26, )), # 68 + ("1321131112", (68, )), # 69 + ("311312", (69, )), # 70 + ("11132", (70, )), # 71 + ("13112221133211322112211213322113", (71, 90, 0, 19, 73, )), # 72 + ("312211322212221121123222113", (72, )), # 73 + ("111312211312113221133211322112211213322113", (31, 19, 73, )), # 74 + ("1321132122211322212221121123222113", (74, )), # 75 + ("3113112211322112211213322113", (75, )), # 76 + ("111312212221121123222113", (76, )), # 77 + ("132112211213322113", (77, )), # 78 + ("31121123222113", (78, )), # 79 + ("111213322113", (79, )), # 80 + ("123222113", (80, )), # 81 + ("3113322113", (60, 81, )), # 82 + ("1113222113", (82, )), # 83 + ("1322113", (83, )), # 84 + ("311311222113", (66, 84, )), # 85 + ("1113122113", (85, )), # 86 + ("132113", (86, )), # 87 + ("3113", (87, )), # 88 + ("1113", (88, )), # 89 + ("13", (89, )), # 90 + ("3", (90, )), # 91 +] +# fmt: on + +starters = [ + "1", + "11", + "21", + "1211", + "111221", + "312211", + "13112221", + "1113213211", + "31131211131221", +] + + +def look_and_say_length(s: str, n: int) -> int: + if n == 0: + return len(s) + + if s in starters: + return look_and_say_length( + "".join(f"{len(list(g))}{k}" for k, g in itertools.groupby(s)), n - 1 + ) + + counts = {i: 0 for i in range(len(atoms))} + idx = next(i for i, (a, _) in enumerate(atoms) if s == a) + counts[idx] = 1 + + for _ in range(n): + c2 = {i: 0 for i in range(len(atoms))} + for i in counts: + for j in atoms[i][1]: + c2[j] += counts[i] + counts = c2 + + return sum(counts[i] * len(a[0]) for i, a in enumerate(atoms)) + + +answer_1 = look_and_say_length(line, 40) +print(f"answer 1 is {answer_1}") + +answer_2 = look_and_say_length(line, 50) +print(f"answer 2 is {answer_2}") diff --git a/src/holt59/aoc/inputs/holt59/2015/day10.txt b/src/holt59/aoc/inputs/holt59/2015/day10.txt new file mode 100644 index 0000000..067b0ee --- /dev/null +++ b/src/holt59/aoc/inputs/holt59/2015/day10.txt @@ -0,0 +1 @@ +1321131112