-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.nim
64 lines (52 loc) · 1.4 KB
/
main.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
63
64
import batteries
type
ListItem = ref int
proc `$`(l: ListItem): string =
$l[]
proc parseInput(input: string): seq[ListItem] =
for line in input.splitLines:
let i = line.parseInt
let l = new int
l[] = i
result.add l
proc modIndex(list: seq[ListItem], index: int): int =
result = floorMod(index, list.high)
if result == 0:
result = list.high
elif result == list.high:
result = 0
proc zeroIndex(list: seq[ListItem]): int =
result = -1
for i in 0 .. list.high:
if list[i][] == 0:
return i
proc mix(original: seq[ListItem], list: var seq[ListItem]) =
for o in original:
let index = list.find(o)
assert index > -1
let moves = o[]
let newIndex = list.modIndex(index + moves)
#echo &"{o}: {index} -> {newIndex}"
if newIndex != index:
list.delete(index)
list.insert(o, newIndex)
proc part1And2(input: string, nMixes, key: int) =
let original = parseInput(input)
var list = original # copy
for x in list:
x[] *= key
#echo list
for i in 0 ..< nMixes:
mix(original, list)
var answer = 0
let indexZero = list.zeroIndex()
#echo indexZero
for x in [1000, 2000, 3000]:
let i = (indexZero + x) mod list.len #list.modIndex(indexZero + x + 1)
#echo list[i]
answer += list[i][]
echo "Part 1: ", answer
when isMainModule:
let input = readFile"input.txt"
part1And2(input, 1, 1)
part1And2(input, 10, 811589153)