mirror of
https://github.com/voltrevo/ValueScript.git
synced 2026-04-18 03:00:27 -04:00
p21
This commit is contained in:
73
inputs/passing/projEuler/p21.ts
Normal file
73
inputs/passing/projEuler/p21.ts
Normal file
@@ -0,0 +1,73 @@
|
||||
import { factorize } from "./helpers/primes.ts";
|
||||
|
||||
export default function main() {
|
||||
let amicableNumbers = [];
|
||||
|
||||
for (let i = 2; i < 10_000; i++) {
|
||||
if (isAmicable(i)) {
|
||||
amicableNumbers.push(i);
|
||||
}
|
||||
}
|
||||
|
||||
return amicableNumbers.reduce((a, b) => a + b);
|
||||
}
|
||||
|
||||
function isAmicable(n: number) {
|
||||
const fSum = properFactorSum(n);
|
||||
|
||||
if (fSum === n) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return properFactorSum(fSum) === n;
|
||||
}
|
||||
|
||||
function factorizeAsPowers(n: number): [number, number][] {
|
||||
const factors = factorize(n);
|
||||
|
||||
if (factors.length === 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const result: [number, number][] = [];
|
||||
let currentFactor = factors[0];
|
||||
let currentPower = 1;
|
||||
|
||||
for (let i = 1; i < factors.length; i++) {
|
||||
const factor = factors[i];
|
||||
|
||||
if (factor === currentFactor) {
|
||||
currentPower += 1;
|
||||
} else {
|
||||
result.push([currentFactor, currentPower]);
|
||||
currentFactor = factor;
|
||||
currentPower = 1;
|
||||
}
|
||||
}
|
||||
|
||||
result.push([currentFactor, currentPower]);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
function properFactorSum(n: number) {
|
||||
const factors = factorizeAsPowers(n);
|
||||
return 1 + factorSumMinus1(factors) - n;
|
||||
}
|
||||
|
||||
function factorSumMinus1(factors: [number, number][]): number {
|
||||
if (factors.length === 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
const [factor, power] = factors[0];
|
||||
let currentFactorSum = 0;
|
||||
|
||||
for (let i = 1; i <= power; i++) {
|
||||
currentFactorSum += factor ** i;
|
||||
}
|
||||
|
||||
const rest = factors.slice(1);
|
||||
|
||||
return currentFactorSum + (currentFactorSum + 1) * factorSumMinus1(rest);
|
||||
}
|
||||
Reference in New Issue
Block a user