const sample = await Deno.readTextFile("sample.txt"); const input = await Deno.readTextFile("input.txt"); const solvePart1 = (data: string): number => { const lines = data.split("\n").filter(Boolean); const linesLength = lines.length; const lineLength = lines[0].split("").length; return lines .reduce( (result, line) => line .split("") .map(parseFloat) .reduce( (result, value, index) => value === 0 ? result : result.map((value, i) => (i === index ? value + 1 : value)), result ), new Array(lineLength).fill(0) as number[] ) .reduce( (result, value) => [ [...result[0], linesLength / value >= 2 ? 0 : 1], [...result[1], linesLength / value >= 2 ? 1 : 0], ], [[], []] as number[][] ) .map((numbers) => numbers.join("")) .map((number) => parseInt(number, 2)) .reduce((total, number) => total * number, 1); }; console.log("Sample:", solvePart1(sample)); console.log("Input", solvePart1(input)); const solvePart2 = (data: string): number => { const lines = data.split("\n").filter(Boolean); const lineLength = lines[0].split("").length; const parsedData = lines.map((line) => line.split("").map(parseFloat)); let oxygenData = parsedData.slice(0); let co2Data = parsedData.slice(0); for (let i = 0; i < lineLength; i += 1) { let oxygenZeroCounter = 0; let co2ZeroCounter = 0; for (let j = 0; j < oxygenData.length; j++) { if (oxygenData[j][i] === 0) { oxygenZeroCounter++; } } if (co2Data.length > 1) { if (co2ZeroCounter > co2Data.length / 2) { co2Data = co2Data.filter((line) => line[i] === 1); } else { co2Data = co2Data.filter((line) => line[i] === 0); } } for (let j = 0; j < co2Data.length; j++) { if (co2Data[j][i] === 0) { co2ZeroCounter++; } } if (oxygenData.length > 1) { if (oxygenZeroCounter > oxygenData.length / 2) { oxygenData = oxygenData.filter((line) => line[i] === 0); } else { oxygenData = oxygenData.filter((line) => line[i] === 1); } } } const oxygenRating = parseInt(oxygenData[0].join(""), 2); const co2SCrubberRating = parseInt(co2Data[0].join(""), 2); return oxygenRating * co2SCrubberRating; }; console.log("Sample:", solvePart2(sample)); // 230 console.log("Input", solvePart2(input)); // 4273224