122 lines
3.3 KiB
TypeScript
122 lines
3.3 KiB
TypeScript
|
const txt = await Deno.readTextFile("input.txt");
|
||
|
const lst = txt.split("\r\n").map((x) => x.split(" ")
|
||
|
.filter((x) => x.length > 0))
|
||
|
.map(x=> x.map(x => parseInt(x)));
|
||
|
|
||
|
|
||
|
function isSafeReport(
|
||
|
arr: number[]
|
||
|
){
|
||
|
let isIncreasing = true;
|
||
|
let isDecreasing = true;
|
||
|
for(let i = 1; i < arr.length; i++){
|
||
|
const diff = arr[i] - arr[i - 1];
|
||
|
if (Math.abs(diff) > 3){
|
||
|
return false;
|
||
|
}
|
||
|
if (diff === 0) {
|
||
|
// if the difference is 0, the array is neither increasing nor decreasing
|
||
|
return false;
|
||
|
}
|
||
|
if(arr[i] > arr[i - 1]){
|
||
|
isDecreasing = false;
|
||
|
} else {
|
||
|
isIncreasing = false;
|
||
|
}
|
||
|
}
|
||
|
if (isIncreasing || isDecreasing){
|
||
|
return true;
|
||
|
}
|
||
|
// if the array is neither increasing nor decreasing
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
|
||
|
function isSafeReportEr(
|
||
|
array: number[],
|
||
|
options = {
|
||
|
errorMargin: 3,
|
||
|
errorThreshold: 1
|
||
|
}
|
||
|
){
|
||
|
if (array.length < 2){
|
||
|
throw new Error("Array must have at least 2 elements");
|
||
|
}
|
||
|
const arr = array.slice();
|
||
|
const isIncreasingCount = arr.reduce((acc, x, i) => {
|
||
|
if (i === 0){
|
||
|
return acc;
|
||
|
}
|
||
|
if (x > arr[i - 1]){
|
||
|
return acc + 1;
|
||
|
}
|
||
|
return acc;
|
||
|
}, 0);
|
||
|
const isDecreasingCount = arr.reduce((acc, x, i) => {
|
||
|
if (i === 0){
|
||
|
return acc;
|
||
|
}
|
||
|
if (x < arr[i - 1]){
|
||
|
return acc + 1;
|
||
|
}
|
||
|
return acc;
|
||
|
}, 0);
|
||
|
const isIncreasingMostly = isIncreasingCount > isDecreasingCount;
|
||
|
const errorMargin = options.errorMargin;
|
||
|
let errorThreshold = options.errorThreshold;
|
||
|
|
||
|
for (let i = 1; i < arr.length; i++){
|
||
|
const diff = arr[i] - arr[i - 1];
|
||
|
const overErrorMargin = Math.abs(diff) > errorMargin;
|
||
|
const isZero = diff === 0;
|
||
|
const orderMismatch = isIncreasingMostly ? diff < 0 : diff > 0;
|
||
|
if (overErrorMargin
|
||
|
|| isZero
|
||
|
|| orderMismatch){
|
||
|
// return false;
|
||
|
if (errorThreshold === 0){
|
||
|
console.log(`Error threshold reached`);
|
||
|
console.log(arr);
|
||
|
return false;
|
||
|
}
|
||
|
errorThreshold--;
|
||
|
console.log(arr);
|
||
|
console.log(`Removing ${arr[i]} at index ${i}`);
|
||
|
arr.splice(i, 1);
|
||
|
console.log(arr);
|
||
|
i--;
|
||
|
}
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
// console.log(isSafeReportEr([4,6,7,9,11,12,12]))
|
||
|
|
||
|
const safeReports = lst.filter(x=> isSafeReportEr(x));
|
||
|
// console.log(safeReports.length);
|
||
|
// const safeReports2 = lst.filter(x=> isSafeReport(x));
|
||
|
// console.log(
|
||
|
// new Set(safeReports.map(x => x.join(","))).difference(new Set(safeReports2.map(x => x.join(","))))
|
||
|
// );
|
||
|
|
||
|
const safeReports3 = lst.filter(x=> {
|
||
|
const safe = isSafeReport(x);
|
||
|
if (!safe){
|
||
|
// remove one element at a time
|
||
|
for (let i = 0; i < x.length; i++){
|
||
|
const copy = x.slice();
|
||
|
copy.splice(i, 1);
|
||
|
if (isSafeReport(copy)){
|
||
|
// console.log(`Removed ${x[i]} at index ${i}`);
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
return safe;
|
||
|
})
|
||
|
|
||
|
console.log(safeReports3.length);
|
||
|
console.log(safeReports.length);
|
||
|
console.log(
|
||
|
new Set(safeReports3.map(x => x.join(","))).difference(new Set(safeReports.map(x => x.join(","))))
|
||
|
);
|