Published
Edited
Nov 13, 2019
Insert cell
Insert cell
power = _.memoize((serial, x, y) => {
const id = x + 10
let power = id * y
power += serial
power = power * id
const digits = String(power)
if (digits.length >=3)
power = +digits[digits.length-3]
else
power = 0
return power - 5
}, (serial, x, y) => String([serial,x,y]))
Insert cell
power(18, 32, 45) == -4
Insert cell
summedAreaTable = {
function summedAreaTable(serial, x, y) {
if (x <= 0 || y <= 0) return 0
return power(serial, x, y) +
summedAreaTable(serial, x - 1, y) +
summedAreaTable(serial, x, y - 1) +
summedAreaTable(serial, x - 1, y - 1)
}
return _.memoize(summedAreaTable, (serial, x, y) => String([serial,x,y]))
}
Insert cell
function summedAreaRectangle(serial, x1, y1, x2, y2) {
return summedAreaTable(serial, x2, y2) +
summedAreaTable(serial, x1, y1) -
summedAreaTable(serial, x2, y1) -
summedAreaTable(serial, x1, y2)
}
Insert cell
function powerSquare(serial, x, y, size) {
return summedAreaRectangle(serial, x, y, x + size, y + size)
}
Insert cell
powerSquare(18, 1, 1, 2)
Insert cell
oldPower = {
let level = (serial, x, y, size) => {
if (size === 1) {
const id = x + 10
let power = id * y
power += serial
power = power * id
const digits = String(power)
if (digits.length >=3)
power = +digits[digits.length-3]
else
power = 0
return power - 5
} else {
const half = Math.floor(size / 2)
let sum = level(serial, x, y, half) +
level(serial, x + half, y, half) +
level(serial, x, y + half, half) +
level(serial, x + half, y + half, half)
if (size % 2 === 1) {
for (let dx = 0; dx < size; dx++)
sum += level(serial, x + dx, y + size - 1, 1)
for (let dy = 0; dy < size - 1; dy++)
sum += level(serial, x + size - 1, y + dy, 1)
}

return sum
}
}
level = _.memoize(level, (serial, x, y, size) => String([serial,x,y,size]))
return level
}
Insert cell
part1 = {
let max = -1,
maxCoords = null
for (let x = 1; x <= 300; x++) {
for (let y = 1; y <= 300; y++) {
const p = power(serial, x, y, 3)
if (p > max) {
max = p
maxCoords = [x, y]
}
}
}
return [maxCoords, max]
}
Insert cell
// part2 = {
// let max = -1,
// maxCoords = null,
// maxSize = 1
// for (let size = 1; size <= 20; size++) {
// for (let x = 1; x <= 300; x++) {
// for (let y = 1; y <= 300; y++) {
// const p = power(serial, x, y, size)
// if (p > max) {
// max = p
// maxCoords = [x, y]
// maxSize = size
// }
// }
// }
// }
// return [maxCoords, maxSize, max]
// }
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more