-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathday14.nim
62 lines (49 loc) · 1.47 KB
/
day14.nim
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
import strutils, sequtils
const
instructions = readFile("./inputs/14.txt").strip.splitLines
time = 2503
type
Reindeer = tuple
name: string
speed: int
stamina: int
rest: int
const reindeers = block:
var reindeers: seq[Reindeer]
for line in instructions:
let
words = line.splitWhitespace()
name = words[0]
speed = words[3].parseInt
stamina = words[6].parseInt
rest = words[^2].parseInt
reindeers.add((name, speed, stamina, rest))
reindeers
func calculateDistance(reindeer: Reindeer, time: int): int =
let
v = reindeer.speed
t = reindeer.stamina
r = reindeer.rest
result = time div (t+r) * (v * t) + (v * min(t, time mod (t+r)))
func calculateMaxDistance(reindeers: seq[Reindeer], time: int): int =
for rd in reindeers:
let distance = rd.calculateDistance(time)
result = max(result, distance)
func findPartialWinners(reindeers: seq[Reindeer], time: int): seq[string] =
for t in 1..time:
var
maxDist: int
winner: string
for rd in reindeers:
let distance = rd.calculateDistance(t)
if distance > maxDist:
maxDist = distance
winner = rd.name
result.add(winner)
func findWinner(reindeers: seq[Reindeer], time: int): int =
let winners = findPartialWinners(reindeers, time)
for rd in reindeers:
let nr = winners.filterIt(it == rd.name).len
result = max(result, nr)
echo calculateMaxDistance(reindeers, time)
echo findWinner(reindeers, time)