82 lines
2.4 KiB
TypeScript
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
|