import { loadInput } from "../common.js"; /** A dictionary to cache the counts of values from the right dictionary */ const _countDictionary = {}; // const input = loadInput("./1/test.input", parseInput, true); const input = loadInput(1, parseInput); solve(input); /** * @param {string} inputData * @returns {number[][]} */ function parseInput(inputData) { // Split the input into lines, and then split each line into two numbers const lines = inputData.split(/\n/); let leftList = []; let rightList = []; // split each line into two numbers, then add those to the left and right lists for(const line of lines) { const [l, r] = line.split(/\s+/).map((num) => parseInt(num, 10)); leftList.push(l); rightList.push(r); } return [leftList, rightList]; } /** * @param {number[][]} parsedInput */ function solve(parsedInput) { // separate out the already sorted left and right list const [leftList, rightList] = parsedInput; // Create a list to store the differences between the left and right list const similarityValues = []; for(const left of leftList) { similarityValues.push(left * countFromRightList(left, rightList)); } console.log("List Distance: ", eval(similarityValues.join("+"))); } /** * Get a count of the number of times a value appears in the right list * * @param {number} numberToFind The number to get a count of * @param {number[]} rightList The list to search through to get a count of {@link numberToFind} * * @returns {number} The number of times {@link numberToFind} appears in the right list */ function countFromRightList(numberToFind, rightList) { if(_countDictionary[numberToFind]) { return _countDictionary[numberToFind]; } const count = rightList.filter((value) => value == numberToFind).length; _countDictionary[numberToFind] = count; return count; }