87 lines
3.0 KiB
TypeScript
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)
|
|
} |