-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathday06.js
More file actions
87 lines (75 loc) · 1.98 KB
/
day06.js
File metadata and controls
87 lines (75 loc) · 1.98 KB
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
'use strict'
const { assert, loadData, parseInt } = require('./core/utils')
const rawInput = [loadData(module.filename)]
const interprete1 = (map, { op, corners }) => {
for (let i = corners[0]; i <= corners[2]; ++i) {
for (let j = corners[1], k; j <= corners[3]; ++j) {
k = i + 1000 * j
if (op === 'on') {
map[k] = 1
} else if (op === 'off') {
map[k] = 0
} else {
map[k] ^= 1
}
}
}
}
const interprete2 = (map, { op, corners }) => {
for (let i = corners[0]; i <= corners[2]; ++i) {
for (let j = corners[1], k, v; j <= corners[3]; ++j) {
k = i + 1000 * j
v = map[k]
if (op === 'on') {
map[k] = v + 1
} else if (op === 'off') {
map[k] = v ? v - 1 : 0
} else {
map[k] = v + 2
}
}
}
}
const getCount = (map) => {
let n = 0, i = 1000000
do {
if (!((n += map[--i]) >= 0)) {
n = -1
}
} while (i > 0)
return n
}
const puzzle1 = (data) => {
const map = new Uint16Array(1000 * 1000)
for (const row of data) {
interprete1(map, row)
}
return getCount(map)
}
const puzzle2 = (data) => {
const map = new Uint16Array(1000 * 1000)
for (const row of data) {
interprete2(map, row)
}
return getCount(map)
}
const parse = (dsn) => {
let data = rawInput[dsn], r
if (data && (data = data.split('\n').filter(v => Boolean(v))).length) {
return data.map((row, i) => {
assert(r = /^([a-z\s]+)(\d+),(\d+)\sthrough\s(\d+),(\d+)$/.exec(row), i, row)
return {
op: r[1][1] === 'o' ? r[1].trim() : (r[1][6] === 'f' ? 'off' : 'on'),
corners: [parseInt(r[2]), parseInt(r[3]), parseInt(r[4]), parseInt(r[5])]
}
})
}
}
// Example data. If rawInput[2] is defined too, then 1 and 2 are for different puzzles.
// rawInput[1] = rawInput[0]
module.exports = { parse, puzzles: [puzzle1, puzzle2] }
/*
16:13 17:00 17:06
day06, puzzle #1 REAL( 59768 µs): 543903
day06, puzzle #2 REAL( 63839 µs): 14687245
*/