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

One platform to build and deploy the best data apps

Experiment and prototype by building visualizations in live JavaScript notebooks. Collaborate with your team and decide which concepts to build out.
Use Observable Framework to build data apps locally. Use data loaders to build in any language or library, including Python, SQL, and R.
Seamlessly deploy to Observable. Test before you ship, use automatic deploy-on-commit, and ensure your projects are always up-to-date.
Learn more