aboutsummaryrefslogtreecommitdiffstats
path: root/day4
diff options
context:
space:
mode:
Diffstat (limited to 'day4')
-rw-r--r--day4/solution.nim46
1 files changed, 16 insertions, 30 deletions
diff --git a/day4/solution.nim b/day4/solution.nim
index 36e90fb..8085445 100644
--- a/day4/solution.nim
+++ b/day4/solution.nim
@@ -1,12 +1,13 @@
1import std/strutils 1import std/strutils
2import std/sequtils 2import std/sequtils
3import std/sugar
3 4
4type 5type
5 # We use begin and length for Range representation to simplify calculations later 6 # We use begin and length for Range representation to simplify calculations later
6 Range = tuple[begin: int, length: int] 7 Range = tuple[begin: int, length: int]
7 Entry = tuple[first: Range, second: Range] 8 Entry = tuple[first: Range, second: Range]
8 9
9proc part1(entries: seq[Entry]): int = 10proc solve(entries: seq[Entry], part2 = false): int =
10 var score = 0 11 var score = 0
11 for e in entries: 12 for e in entries:
12 var r: Entry 13 var r: Entry
@@ -18,39 +19,24 @@ proc part1(entries: seq[Entry]): int =
18 r.first = e.second 19 r.first = e.second
19 r.second = e.first 20 r.second = e.first
20 21
21 if r.first.length >= r.second.length + r.second.begin - r.first.begin: 22 if not part2:
22 score += 1 23 if r.first.length >= r.second.length + r.second.begin - r.first.begin:
23 24 score += 1
24 return score
25
26proc part2(entries: seq[Entry]): int =
27 var score = 0
28 for e in entries:
29 var r: Entry
30 # Let first become the leftmost range. In case both ranges start at the same index, we consider the longest one to be first
31 if e.first.begin < e.second.begin or (e.first.begin == e.second.begin and e.first.length >= e.second.length):
32 r.first = e.first
33 r.second = e.second
34 else: 25 else:
35 r.first = e.second 26 if r.first.begin + r.first.length - 1 >= r.second.begin:
36 r.second = e.first 27 score += 1
37
38 if r.first.begin + r.first.length - 1 >= r.second.begin:
39 score += 1
40 28
41 return score 29 return score
42 30
31func entryFromLine(line: string): Entry =
32 # Get tokens and parse them as integers
33 let tokens = map(line.split({',', '-'}), token => token.parseInt())
34 # Init Entry
35 ((tokens[0], tokens[1] - tokens[0]+1), (tokens[2], tokens[3] - tokens[2]+1))
36
43let 37let
44 content = readFile("./input.txt").strip().splitLines() 38 content = readFile("./input.txt").strip().splitLines()
45 entries = map( 39 entries = map(content, entryFromLine)
46 content,
47 proc(line: string): Entry =
48 let tokens = map(line.split({',', '-'}), proc(token: string): int = token.parseInt())
49 (
50 (tokens[0], tokens[1] - tokens[0]+1),
51 (tokens[2], tokens[3] - tokens[2]+1)
52 )
53 )
54 40
55echo part1(entries) 41echo solve(entries)
56echo part2(entries) 42echo solve(entries, true)