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 }
}