Files
advent-of-code-2022/2021/03/solution.ts
2022-12-06 14:09:45 +01:00

82 lines
2.4 KiB
TypeScript

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