move to 4kyu
This commit is contained in:
59
4kyu/smallest-possible-sum/solution.ts
Normal file
59
4kyu/smallest-possible-sum/solution.ts
Normal file
@@ -0,0 +1,59 @@
|
||||
// idea: do not ever sort
|
||||
// simply keep looping from left to right and back to left
|
||||
// whenever a smaller number is found,
|
||||
// subtract as many multiples of that number from the rest of the array
|
||||
|
||||
const subtractMultiples = (a: number, b: number): number => {
|
||||
// subtract a from b as many times as possible
|
||||
const mod = b % a;
|
||||
if (mod === 0) {
|
||||
// figure out how many times a can be subtracted from b
|
||||
const div = b / a - 1;
|
||||
return b - a * div;
|
||||
} else {
|
||||
return mod;
|
||||
}
|
||||
}
|
||||
|
||||
const operate = (arr: number[]): boolean => {
|
||||
|
||||
let step = 1;
|
||||
let i = 0;
|
||||
let done = false;
|
||||
let hasChangedDuringLoop = false;
|
||||
while (!done) {
|
||||
if (i + step >= arr.length || i + step < 0) {
|
||||
// reverse direction
|
||||
step = -step;
|
||||
if (!hasChangedDuringLoop) {
|
||||
done = true;
|
||||
}
|
||||
hasChangedDuringLoop = false;
|
||||
}
|
||||
|
||||
const first = arr[i];
|
||||
const next = arr[i + step];
|
||||
|
||||
if (first > next) {
|
||||
arr[i] = subtractMultiples(next, first);
|
||||
hasChangedDuringLoop = true;
|
||||
} else if (first < next) {
|
||||
arr[i + step] = subtractMultiples(first, next);
|
||||
hasChangedDuringLoop = true;
|
||||
}
|
||||
|
||||
i += step;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
export function solution(numbers: number[]): number {
|
||||
let done = false;
|
||||
while (!done) {
|
||||
done = operate(numbers);
|
||||
}
|
||||
|
||||
// sum the numbers
|
||||
return numbers.reduce((acc, num) => acc + num, 0);
|
||||
}
|
||||
Reference in New Issue
Block a user