const weight = (s: string): number => s.split('').reduce((acc, cur) => acc + parseInt(cur), 0); const sortWeightInfo = (a: T, b: T): number => { if (a[0] !== b[0]) { return a[0] - b[0]; } else if (a[1] !== b[1]) { return a[1] - b[1]; } else { return a[2] - b[2]; } } type WeightInfo = [ number, // weight number, // index number // number ]; type DiffInfo = [ number, // weight difference number, // weight sum number, // index sum number, // index of first number number // index of second number ]; export function closest(strng: string): number[][] { if (strng === '') return []; const weights: WeightInfo[] = strng .split(' ') .map((s, i) => [weight(s), i, parseInt(s)]); // calculate all weight differences, weight sum, and index sum const diffs: DiffInfo[] = []; for (const [weight, index, num] of weights) { for (let i = index + 1; i < weights.length; i++) { if(i >= weights.length) break; const [weight2, index2, num2] = weights[i]; const weightDiff = Math.abs(weight - weight2); const weightSum = weight + weight2; const indexSum = index + index2; diffs.push([weightDiff, weightSum, indexSum, index, index2]); } } // sort by weight difference, weight sum, and index sum diffs.sort(sortWeightInfo); const minimumDiff = diffs[0] const firstNumIndex = minimumDiff[3]; const secondNumIndex = minimumDiff[4]; const result = [ weights[firstNumIndex], weights[secondNumIndex] ].sort(sortWeightInfo) return result; }