Published
Edited
Dec 16, 2021
Insert cell
Insert cell
Insert cell
toBin = (hex) => Array.from(hex).map(c => parseInt(c, 16).toString(2).padStart(4, "0")).join("")
Insert cell
parseHeader = (bin) => {
const version = parseInt(bin.slice(0,3), 2)
const type = parseInt(bin.slice(3, 6), 2)

return { version, type }
}
Insert cell
function parse(bin){
//const bin = toBin(input)
const {version, type } = parseHeader(bin)
let value = 0
let lengthType = 0
let length = 6
let subs = ""
let subpackets = []
if (type == 4){
let bits = []
let i = 0

do {
bits.push(bin.slice(i*5+6+1, i*5+6+5))
i++
} while (bin.slice((i-1)*5+6, (i-1)*5+6 + 1) != 0)

length += i*5
value = parseInt(bits.join(""), 2)
} else {
lengthType = parseInt(bin.slice(6, 7), 2)
length += 1

if (lengthType == 0){
const l = parseInt(bin.slice(7, 7+15), 2)
length += 15
subs = bin.slice(length)

let total = 0

while(total < l){
let sub = parse(subs)
subpackets.push(sub)
total += sub.length
subs = subs.slice(sub.length)
}

length += total
} else {
const l = parseInt(bin.slice(7, 7+11), 2)
length += 11

subs = bin.slice(length)

for (let i = 0; i < l; i++){
let sub = parse(subs)
subpackets.push(sub)
length += sub.length
subs = subs.slice(sub.length)
}
}

if (type == 0) value = d3.sum(subpackets.map(x => x.value))
else if (type == 1) value = subpackets.reduce((p,c) => p * c.value, 1)
else if (type == 2) value = d3.min(subpackets.map(x => x.value))
else if (type == 3) value = d3.max(subpackets.map(x => x.value))
else if (type == 5) value = (subpackets[0].value > subpackets[1].value) ? 1 : 0
else if (type == 6) value = (subpackets[0].value < subpackets[1].value) ? 1 : 0
else if (type == 7) value = (subpackets[0].value == subpackets[1].value) ? 1 : 0
}

return { value, subs, length, lengthType, version, type, bin, subpackets }
}
Insert cell
examples.slice(0,3).map(ex => parse(toBin(ex)))
Insert cell
parse(toBin("8A004A801A8002F478"))
Insert cell
examples = [
"D2FE28",
"38006F45291200",
"EE00D40C823060",
"8A004A801A8002F478",
"620080001611562C8802118E34",
"C0015000016115A2E0802F182340",
"A0016C880162017C3686B18A3D4780"
]
Insert cell
examples[3]
Insert cell
parse(toBin(puzzle))
Insert cell
{
let versions = []
let rec = (packet) => {
if (packet.version) versions.push(packet.version)
return packet.subpackets.map(sp => rec(sp))
}

let tree = rec(parse(toBin(puzzle)))
return d3.sum(versions)
}
Insert cell
Insert cell
[2,3,4].reduce((p,c) => p * c)
Insert cell
examples_part2.map(ex => parse(toBin(ex)))
Insert cell
examples_part2 = [
"C200B40A82",
"04005AC33890",
"880086C3E88112",
"CE00C43D881120",
"D8005AC2A8F0",
"F600BC2D8F",
"9C005AC2F8F0",
"9C0141080250320F1802104A08"
]
Insert cell
puzzle = "E20D72805F354AE298E2FCC5339218F90FE5F3A388BA60095005C3352CF7FBF27CD4B3DFEFC95354723006C401C8FD1A23280021D1763CC791006E25C198A6C01254BAECDED7A5A99CCD30C01499CFB948F857002BB9FCD68B3296AF23DD6BE4C600A4D3ED006AA200C4128E10FC0010C8A90462442A5006A7EB2429F8C502675D13700BE37CF623EB3449CAE732249279EFDED801E898A47BE8D23FBAC0805527F99849C57A5270C064C3ECF577F4940016A269007D3299D34E004DF298EC71ACE8DA7B77371003A76531F20020E5C4CC01192B3FE80293B7CD23ED55AA76F9A47DAAB6900503367D240522313ACB26B8801B64CDB1FB683A6E50E0049BE4F6588804459984E98F28D80253798DFDAF4FE712D679816401594EAA580232B19F20D92E7F3740D1003880C1B002DA1400B6028BD400F0023A9C00F50035C00C5002CC0096015B0C00B30025400D000C398025E2006BD800FC9197767C4026D78022000874298850C4401884F0E21EC9D256592007A2C013967C967B8C32BCBD558C013E005F27F53EB1CE25447700967EBB2D95BFAE8135A229AE4FFBB7F6BC6009D006A2200FC3387D128001088E91121F4DED58C025952E92549C3792730013ACC0198D709E349002171060DC613006E14C7789E4006C4139B7194609DE63FEEB78004DF299AD086777ECF2F311200FB7802919FACB38BAFCFD659C5D6E5766C40244E8024200EC618E11780010B83B09E1BCFC488C017E0036A184D0A4BB5CDD0127351F56F12530046C01784B3FF9C6DFB964EE793F5A703360055A4F71F12C70000EC67E74ED65DE44AA7338FC275649D7D40041E4DDA794C80265D00525D2E5D3E6F3F26300426B89D40094CCB448C8F0C017C00CC0401E82D1023E0803719E2342D9FB4E5A01300665C6A5502457C8037A93C63F6B4C8B40129DF7AC353EF2401CC6003932919B1CEE3F1089AB763D4B986E1008A7354936413916B9B080"
Insert cell
style = html`<style>.graph { height: 600px; }</style>`
Insert cell
Insert cell
container = html`<div class="graph"></div>`
Insert cell
cytoscape = require("cytoscape@3.4.2/dist/cytoscape.umd.js")
Insert cell
dagre = require('https://bundle.run/cytoscape-dagre@2.3.2');
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