Oliver Kaup b310dc969b day 2
2024-12-11 14:27:30 +01:00

87 lines
3.0 KiB
TypeScript

import { readLines } from "../utils.ts";
export async function solveTask2part1() {
const lines = await readLines('./2/input.txt');
let safeReports = 0;
for (const line of lines) {
const numbers = line
.split(' ')
.map( n => parseInt(n.trim()) );
const checkNumbers = (numbers:number[]) => {
let order:string|undefined = undefined;
for (let i = 1; i < numbers.length; i++) {
const prevN = numbers[i-1];
const n = numbers[i];
const diff = n - prevN;
if (!order) {
order = diff < 0 ? 'desc' : 'asc';
} else {
if (order === 'asc' && diff < 0) return false;
if (order === 'desc' && diff > 0) return false;
}
const diffAbs = Math.abs(diff);
if (diffAbs < 1) return false;
if (diffAbs > 3) return false;
}
return true;
}
const result = checkNumbers(numbers);
if (result) safeReports++;
}
console.log('safeReports', safeReports)
}
export async function solveTask2part2() {
// const lines = await readLines('./2/exampleInput.txt');
const lines = await readLines('./2/input.txt');
let safeReports = 0;
for (const line of lines) {
const numbers = line
.split(' ')
.map( n => parseInt(n.trim()) );
let badLevelRemoved = false;
const checkNumbers = (numbers:number[]):boolean => {
const handleBadLevel = ():boolean => {
if (badLevelRemoved) return false;
badLevelRemoved = true;
const possibilities = new Array(numbers.length).fill(undefined)
.map( () => structuredClone(numbers) );
possibilities.forEach( (n, i) => n.splice(i, 1) );
const anyLvlRmvdWorks = possibilities
.map( n => checkNumbers(n) )
.some( check => check )
return anyLvlRmvdWorks;
}
let order:string|undefined = undefined;
for (let i = 1; i < numbers.length; i++) {
const prevN = numbers[i-1];
const n = numbers[i];
const diff = n - prevN;
if (!order) {
order = diff < 0 ? 'desc' : 'asc';
} else {
if (order === 'asc' && diff < 0) return handleBadLevel();
if (order === 'desc' && diff > 0) return handleBadLevel();
}
const diffAbs = Math.abs(diff);
if (diffAbs < 1) return handleBadLevel();
if (diffAbs > 3) return handleBadLevel();
}
return true;
}
const result = checkNumbers(numbers);
if (result) safeReports++;
}
console.log('safeReports', safeReports)
}