Compare commits
2 commits
ea8d287db5
...
71d885376d
Author | SHA1 | Date | |
---|---|---|---|
71d885376d | |||
f98cac8651 |
3 changed files with 109 additions and 12 deletions
28
day06.py
28
day06.py
|
@ -2,21 +2,25 @@ import fileinput
|
||||||
from math import ceil, floor, sqrt
|
from math import ceil, floor, sqrt
|
||||||
|
|
||||||
def race(time, dist):
|
def race(time, dist):
|
||||||
x1 = (time - sqrt(time * time - 4 * dist)) / 2
|
discr = sqrt(time * time - 4 * dist)
|
||||||
x2 = (time + sqrt(time * time - 4 * dist)) / 2
|
x1 = (time - discr) / 2
|
||||||
|
x2 = (time + discr) / 2
|
||||||
x1, x2 = floor(x1) + 1, ceil(x2) - 1
|
x1, x2 = floor(x1) + 1, ceil(x2) - 1
|
||||||
return x2 - x1 + 1
|
return x2 - x1 + 1
|
||||||
|
|
||||||
input = list(fileinput.input())
|
def main():
|
||||||
times = [int(x) for x in input[0][11:].split()]
|
input = list(fileinput.input())
|
||||||
distances = [int(x) for x in input[1][11:].split()]
|
times = [int(x) for x in input[0][11:].split()]
|
||||||
|
distances = [int(x) for x in input[1][11:].split()]
|
||||||
|
|
||||||
part1 = 1
|
part1 = 1
|
||||||
for time, dist in zip(times, distances):
|
for time, dist in zip(times, distances):
|
||||||
part1 *= race(time, dist)
|
part1 *= race(time, dist)
|
||||||
|
|
||||||
time = int(input[0][11:].replace(" ", ""))
|
time = int(input[0][11:].replace(" ", ""))
|
||||||
dist = int(input[1][11:].replace(" ", ""))
|
dist = int(input[1][11:].replace(" ", ""))
|
||||||
part2 = race(time, dist)
|
part2 = race(time, dist)
|
||||||
|
|
||||||
print(part1, part2)
|
print(part1, part2)
|
||||||
|
|
||||||
|
main()
|
||||||
|
|
59
day07.py
Normal file
59
day07.py
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
import fileinput
|
||||||
|
from collections import Counter
|
||||||
|
|
||||||
|
STRENGTHS = {
|
||||||
|
"A": 1,
|
||||||
|
"K": 2,
|
||||||
|
"Q": 3,
|
||||||
|
"T": 5,
|
||||||
|
"9": 6,
|
||||||
|
"8": 7,
|
||||||
|
"7": 8,
|
||||||
|
"6": 9,
|
||||||
|
"5": 10,
|
||||||
|
"4": 11,
|
||||||
|
"3": 12,
|
||||||
|
"2": 13,
|
||||||
|
}
|
||||||
|
|
||||||
|
INPUT = []
|
||||||
|
for line in fileinput.input():
|
||||||
|
(hand, bid) = line.split()
|
||||||
|
counter = Counter(hand)
|
||||||
|
INPUT.append((hand, int(bid), counter["J"], counter.most_common() + [("", 0)]))
|
||||||
|
|
||||||
|
def solve(part):
|
||||||
|
STRENGTHS["J"] = 14 if part == 2 else 4
|
||||||
|
|
||||||
|
hands = []
|
||||||
|
for (hand, bid, jokers, mcs) in INPUT:
|
||||||
|
if part == 2:
|
||||||
|
mcs = [(c, i) for (c, i) in mcs if c != "J"]
|
||||||
|
else:
|
||||||
|
jokers = 0
|
||||||
|
mc = mcs[0][1] + jokers
|
||||||
|
|
||||||
|
if mc == 5:
|
||||||
|
strength = 1
|
||||||
|
elif mc == 4:
|
||||||
|
strength = 2
|
||||||
|
elif mc == 3 and mcs[1][1] == 2:
|
||||||
|
strength = 3
|
||||||
|
elif mc == 3:
|
||||||
|
strength = 4
|
||||||
|
elif mc == 2 and mcs[1][1] == 2:
|
||||||
|
strength = 5
|
||||||
|
elif mc == 2:
|
||||||
|
strength = 6
|
||||||
|
else:
|
||||||
|
strength = 7
|
||||||
|
|
||||||
|
strengths = [STRENGTHS[c] for c in hand]
|
||||||
|
hands.append(([strength] + strengths, bid))
|
||||||
|
|
||||||
|
hands.sort(key=lambda h: h[0], reverse=True)
|
||||||
|
return sum((i + 1) * bid for (i, (_, bid)) in enumerate(hands))
|
||||||
|
|
||||||
|
part1 = solve(part=1)
|
||||||
|
part2 = solve(part=2)
|
||||||
|
print(part1, part2)
|
34
day08.py
Normal file
34
day08.py
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
import fileinput
|
||||||
|
import math
|
||||||
|
|
||||||
|
input = fileinput.input()
|
||||||
|
|
||||||
|
instructions = next(input).strip()
|
||||||
|
next(input)
|
||||||
|
|
||||||
|
tree = {}
|
||||||
|
|
||||||
|
for line in input:
|
||||||
|
if line.strip():
|
||||||
|
(parent, children) = line.split(" = ")
|
||||||
|
(left, right) = children[1:-2].split(", ")
|
||||||
|
tree[parent] = (left, right)
|
||||||
|
|
||||||
|
nodes = [node for node in tree if node[2] == "A"]
|
||||||
|
cycles = [0] * len(nodes)
|
||||||
|
|
||||||
|
for i in range(len(nodes)):
|
||||||
|
while nodes[i][2] != "Z":
|
||||||
|
for instr in instructions:
|
||||||
|
cycles[i] += 1
|
||||||
|
if instr == "L":
|
||||||
|
(nodes[i], _) = tree[nodes[i]]
|
||||||
|
else:
|
||||||
|
(_, nodes[i]) = tree[nodes[i]]
|
||||||
|
if nodes[i][2] == "Z":
|
||||||
|
break
|
||||||
|
|
||||||
|
part1 = cycles[nodes.index("ZZZ")]
|
||||||
|
part2 = math.lcm(*cycles)
|
||||||
|
|
||||||
|
print(part1, part2)
|
Loading…
Reference in a new issue