File size: 1,461 Bytes
a4da721
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
def load_data(file):
    with open(file) as f:
        data = f.read()
    return list(data.split())



def update_stone(stone):

    if stone == "0":
        return ["1"]

    elif len(stone) % 2 == 0:
        L = len(stone)
        first_half = str(int(stone[:L//2]))
        second_half = str(int(stone[L//2:]))



        return [first_half, second_half]
    else:
        return [str(int(stone)*2024)]


def blink(stones):
    new_stones = []
    for stone in stones:
        next_stones = update_stone(stone)
        new_stones.extend(next_stones)
    return new_stones


stones = load_data("input.txt")
blinks = 25
for i in range(blinks):
    stones = blink(stones)

print(len(stones))




## Part two

# Use a dict to keep track instead of a list

def get_counts(stones):
    counts = {}
    for stone in stones:
        counts[stone] = counts.get(stone, 0) + 1

    return counts


def blink(stone_counts):
    new_counts = {}
    for stone, count in stone_counts.items():
        new_stones = update_stone(stone)

        for s in new_stones:
            new_counts[s] = new_counts.get(s, 0) + 1 * count

    return new_counts


def get_total_stones(stone_counts):
    total = 0

    for stone, count in stone_counts.items():
        total += count
    return total


stones = load_data("input.txt")
stone_counts = get_counts(stones)
blinks = 75

for idx in range(blinks):
    stone_counts = blink(stone_counts)

print(get_total_stones(stone_counts))