-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday05.js
109 lines (99 loc) · 3.16 KB
/
day05.js
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
var fs = require('fs')
const startx = 0
const starty = 1
const endx = 2
const endy = 3
const xx = 0
const yy = 1
function load(file) {
var input = fs.readFileSync(file, 'utf8')
let segments = []
input.split("\n").forEach(line => {
let pairs = line.split("->")
let startcoords = pairs[0].trim().split(",")
let endcoords = pairs[1].trim().split(",")
let segment = [+startcoords[xx],+startcoords[yy], +endcoords[xx], +endcoords[yy]]
// sort data so we from left to right / top to bottom (except diagonal...)
if (segment[startx] == segment[endx]) {
if (segment[starty] > segment[endy] ){
let swapTmp = segment[starty]
segment[starty] = segment[endy]
segment[endy] = swapTmp
}
} else if (segment[starty] == segment[endy]) {
if (segment[startx] > segment[endx] ) {
let swapTmp = segment[startx]
segment[startx] = segment[endx]
segment[endx] = swapTmp
}
} else {
if (segment[startx] > segment[endx] ) {
let swapTmp = segment[startx]
segment[startx] = segment[endx]
segment[endx] = swapTmp
swapTmp = segment[starty]
segment[starty] = segment[endy]
segment[endy] = swapTmp
}
}
segments.push(segment)
})
return segments
}
function runDay05(file, handleDiagonal) {
console.log("Step1", file)
let segments = load(file)
let max = Math.max(...segments.flat()) + 1
let world = Array(max).fill(0).map(y => Array(max).fill(0))
segments.forEach(segment => {
if (segment[startx] == segment[endx]) {
let x = segment[startx]
for (let y = segment[starty]; y <= segment[endy]; y++) {
world[y][x] += 1
}
} else if (segment[starty] == segment[endy]) {
let y = segment[starty]
for (let x = segment[startx]; x <= segment[endx]; x++) {
world[y][x] += 1
}
} else if (handleDiagonal) {
let x = segment[startx]
let y = segment[starty]
for (let i = 0; i <= segment[endx]-segment[startx]; i++) {
world[y][x] += 1
x++
if (segment[starty] < segment[endy]) {
y++
} else {
y--
}
}
}
})
console.log(computeDangerousAreas(world), "\n")
}
function drawWorld(world, max) {
for (let y = 0; y < max; y++) {
let line = ""
for (let x = 0; x < max; x++) {
if (world[y][x] == 0) {
line+= "."
} else {
line += "" + world[y][x]
}
}
console.log(line)
}
}
function computeDangerousAreas(world) {
return world.flat().reduce((acc, value) => {
if (value > 1) {
return acc + 1
}
return acc
},0)
}
runDay05('input-test.txt', false)
runDay05('input.txt', false)
runDay05('input-test.txt', true)
runDay05('input.txt', true)