import { SumArray, ArrayIsOnlyDuplicates, LoadInput, Inspect } from "../common.ts"; import { FindDifferential, ParseInput, type Histogram } from "./9_common.ts"; const tests = [ "0 3 6 9 12 15", "1 3 6 10 15 21", "10 13 16 21 30 45", ]; const input = await LoadInput(9); // Parse the histograms from the input let histograms = ParseInput(input); // Find the next predicted value for each one histograms = histograms.map((histogram, idx) => { try { return PredictNextValue(histogram); } catch (err) { console.error(`Failed on histogram[${idx}]`); throw err; } }); Inspect(histograms); // Sum all of the last values in the histograms const sumOfNewValues = SumArray(histograms.map((histogram) => histogram[0])); console.log(`The sum of all predicted values is: ${sumOfNewValues}`); /** * Predict the next value in a histogram * * @param histogram The histogram to find the next value for * @returns The input histogram with its new value added */ function PredictNextValue(histogram: Histogram): Histogram { const allDifferentials = [histogram]; let differential = []; // Get all differentials until only an array of zeros remains do { differential = FindDifferential(allDifferentials[0]); allDifferentials.unshift(differential); } while (!ArrayIsOnlyDuplicates(differential)); console.log(allDifferentials); while (allDifferentials.length > 1) { // Store the last value of previous differential, and remove that differential from the list const firstValueOfDifferential = allDifferentials.shift()?.shift() as number; // if (lastValueOfDifferential == undefined) { // throw new Error("There is no last value of previous differential!\n" + prevDifferential); // } // Predict the next value to be this last value + the last value of the previous differential const predictedValue = allDifferentials[0][0] - firstValueOfDifferential; if (Number.isNaN(predictedValue)) { throw new Error("Failed to find differentials for the following histograms!\n" + histogram); } // Push to this differential allDifferentials[0].unshift(predictedValue); } return allDifferentials[0]; }