import std/strutils import std/sequtils type Point* = (int, int) Line* = (Point, Point) LinesMap* = object fields: seq[int] width: int height: int proc readFile*(path: string): (seq[Line], int, int) = let file = open(path) defer: file.close() var lines: seq[Line] = @[] var max_x = 0 var max_y = 0 for line in lines file: let tuples = line.split(" -> ") let s = tuples[0].split(',') let e = tuples[1].split(',') let x1 = s[0].parseInt() let x2 = e[0].parseInt() max_x = max(max(x1, x2), max_x) let y1 = s[1].parseInt() let y2 = e[1].parseInt() max_y = max(max(y1, y2), max_y) lines.add(((x1, y1), (x2, y2))) (lines, max_x + 1, max_y + 1) proc newLinesMap*(width: int, height: int): LinesMap = LinesMap( fields: newSeqWith(width * height, 0), height: height, width: width ) proc incMapPos*(map: var LinesMap, x: int, y: int) = let pos = x + (y * map.width) map.fields[pos] += 1 proc printMap*(map: LinesMap) = for j in 0..(map.height - 1): let p = j * map.height let w = p + map.width - 1 echo map.fields[p..w] proc countOverlaps*(map: LinesMap): int = map.fields.countIt(it >= 2)