xxxxxxxxxx
138
let input = "C20D718021600ACDC372CD8DE7A057252A49C940239D68978F7970194EA7CCB310088760088803304A0AC1B100721EC298D3307440041CD8B8005D12DFD27CBEEF27D94A4E9B033006A45FE71D665ACC0259C689B1F99679F717003225900465800804E39CE38CE161007E52F1AEF5EE6EC33600BCC29CFFA3D8291006A92CA7E00B4A8F497E16A675EFB6B0058F2D0BD7AE1371DA34E730F66009443C00A566BFDBE643135FEDF321D000C6269EA66545899739ADEAF0EB6C3A200B6F40179DE31CB7B277392FA1C0A95F6E3983A100993801B800021B0722243D00042E0DC7383D332443004E463295176801F29EDDAA853DBB5508802859F2E9D2A9308924F9F31700AA4F39F720C733A669EC7356AC7D8E85C95E123799D4C44C0109C0AF00427E3CC678873F1E633C4020085E60D340109E3196023006040188C910A3A80021B1763FC620004321B4138E52D75A20096E4718D3E50016B19E0BA802325E858762D1802B28AD401A9880310E61041400043E2AC7E8A4800434DB24A384A4019401C92C154B43595B830002BC497ED9CC27CE686A6A43925B8A9CFFE3A9616E5793447004A4BBB749841500B26C5E6E306899C5B4C70924B77EF254B48688041CD004A726ED3FAECBDB2295AEBD984E08E0065C101812E006380126005A80124048CB010D4C03DC900E16A007200B98E00580091EE004B006902004B00410000AF00015933223100688010985116A311803D05E3CC4B300660BC7283C00081CF26491049F3D690E9802739661E00D400010A8B91F2118803310A2F43396699D533005E37E8023311A4BB9961524A4E2C027EC8C6F5952C2528B333FA4AD386C0A56F39C7DB77200C92801019E799E7B96EC6F8B7558C014977BD00480010D89D106240803518E31C4230052C01786F272FF354C8D4D437DF52BC2C300567066550A2A900427E0084C254739FB8E080111E0";
// input = "C200B40A82";
function setup() {
createCanvas(1, 1);
solve();
noLoop();
}
function solve() {
let bin = toBin();
// console.log(bin);
let versions = 0;
// while(bin.length) {
let [b, v, value] = readBits(bin);
// console.log(b, v);
bin = b;
versions += v;
// }
console.log(value);
console.log(versions);
}
function readBits(bin) {
let versions = 0;
let value = 0;
let val = parseInt(bin, 2);
if(!bin || val == 0) {
return ["", 0, 0];
}
let v = parseInt(bin.substring(0, 3), 2);
bin = bin.substring(3);
let t = parseInt(bin.substring(0, 3), 2);
bin = bin.substring(3);
if(t == 4) {
// Literal
let end = false;
let partial = "";
while(!end) {
let chunk = bin.substring(0, 5);
bin = bin.substring(5);
if(chunk[0] === "0") {
end = true;
}
partial += chunk.substring(1);
}
value = parseInt(partial, 2);
} else {
// Operator
let l = parseInt(bin.substring(0, 1), 2);
bin = bin.substring(1);
let values = [];
if(l === 0) {
let sz = parseInt(bin.substring(0, 15), 2);
bin = bin.substring(15);
let len = bin.length;
while(len - bin.length < sz) {
let [b, v, vl] = readBits(bin);
// console.log(b, v);
bin = b;
versions += v;
values.push(vl);
}
} else {
let sz = parseInt(bin.substring(0, 11), 2);
bin = bin.substring(11);
for(let i = 0; i < sz; i ++) {
let [b, v, vl] = readBits(bin);
// console.log(b, v);
bin = b;
versions += v;
values.push(vl);
}
}
if(t === 0) {
// sum
for(let i = 0; i < values.length; i ++) {
value += values[i];
}
} else if(t === 1) {
// product
value = 1;
for(let i = 0; i < values.length; i ++) {
value *= values[i];
}
} else if(t === 2) {
// min
value = Math.min(values);
} else if(t === 3) {
// max
value = Math.max(values);
} else if(t === 5) {
// greater than
value = values[0] > values[1] ? 1 : 0;
} else if(t === 6) {
// less than
value = values[0] < values[1] ? 1 : 0;
} else if(t === 7) {
// equal
value = values[0] == values[1] ? 1 : 0;
}
}
versions += v;
// console.log(versions);
return [bin, versions, value];
}
function toBin() {
let str = "";
for(let i = 0; i < input.length; i ++) {
let s = parseInt(input[i], 16).toString(2);
s = "0".repeat(4-s.length) + s;
str += s;
}
return str;
}