Published
Edited
Dec 3, 2021
Insert cell
# Advent of Code - Day 3
Insert cell
decode = (lines)=>{
let transpose = (ls) =>{
let cols = Array(Array.from(ls[0]).length).fill("")
ls.forEach(l => {
let bits = Array.from(l)

bits.forEach((bit, i)=> {
cols[i] += bit
})
})

return cols
}

let cols = transpose(lines.split("\n"))
let count = (str, char) => Array.from(str).filter(x => x == char).length
let g = cols.map(col => d3.greatestIndex(["0", "1"].map( c => count(col, c)))).join('')
let e = cols.map(col => d3.leastIndex(["0", "1"].map( c => count(col, c)))).join('')
let pc = parseInt(g, 2) * parseInt(e, 2)

let criteria = (pool, i, func, eq="0") => {
let cols = transpose(pool)
let bit = cols.map(col => {
let counts = ["0", "1"].map( c => count(col, c))
return (counts[0] != counts[1]) ? func(counts) : eq
})[i]
return pool.filter(l => Array.from(l)[i] == bit)
}

let oxygen
let co2

Array.from(Array(cols.length+1)).forEach((v,i) =>{
if (i == 0) oxygen = co2 = lines.split("\n")
if (oxygen.length > 1) oxygen = criteria(oxygen, i, d3.greatestIndex, "1")
if (co2.length > 1) co2 = criteria(co2, i, d3.leastIndex)
})

let lsr = parseInt(oxygen,2) * parseInt(co2,2)
return { cols, g, e, pc, oxygen, co2, lsr }
}
Insert cell
decode(`00100
11110
10110
10111
10101
01111
00111
11100
10000
11001
00010
01010`)
Insert cell
Insert cell
decode(input_p1)
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