Spaces:
Running
Running
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))
|