From 7c6c8bfd35b89aa68b3779e9f6e4bd867efc36b3 Mon Sep 17 00:00:00 2001 From: camperbot Date: Thu, 23 Dec 2021 23:35:44 +0530 Subject: [PATCH] chore(i18n,curriculum): update translations (#44573) --- .../problem-50-consecutive-prime-sum.md | 90 ++++++++++++------- .../problem-50-consecutive-prime-sum.md | 90 ++++++++++++------- 2 files changed, 118 insertions(+), 62 deletions(-) diff --git a/curriculum/challenges/portuguese/10-coding-interview-prep/project-euler/problem-50-consecutive-prime-sum.md b/curriculum/challenges/portuguese/10-coding-interview-prep/project-euler/problem-50-consecutive-prime-sum.md index 05d71e5b06..b019d50c2b 100644 --- a/curriculum/challenges/portuguese/10-coding-interview-prep/project-euler/problem-50-consecutive-prime-sum.md +++ b/curriculum/challenges/portuguese/10-coding-interview-prep/project-euler/problem-50-consecutive-prime-sum.md @@ -54,42 +54,70 @@ consecutivePrimeSum(1000000); # --solutions-- ```js -function consecutivePrimeSum(limit) { - function isPrime(num) { - if (num < 2) { - return false; - } else if (num === 2) { - return true; - } - const sqrtOfNum = Math.floor(num ** 0.5); - for (let i = 2; i <= sqrtOfNum + 1; i++) { - if (num % i === 0) { - return false; - } +// Initalize prime number list with sieve +const NUM_PRIMES = 1000000; +const PRIMES = [2]; +const PRIME_SIEVE = Array(Math.floor((NUM_PRIMES-1)/2)).fill(true); +(function initPrimes(num) { + const upper = Math.floor((num - 1) / 2); + const sqrtUpper = Math.floor((Math.sqrt(num) - 1) / 2); + for (let i = 0; i <= sqrtUpper; i++) { + if (PRIME_SIEVE[i]) { + // Mark value in PRIMES array + const prime = 2 * i + 3; + PRIMES.push(prime); + // Mark all multiples of this number as false (not prime) + const primeSqaredIndex = 2 * i ** 2 + 6 * i + 3; + for (let j = primeSqaredIndex; j < upper; j += prime) + PRIME_SIEVE[j] = false; } + } + for (let i = sqrtUpper + 1; i < upper; i++) { + if (PRIME_SIEVE[i]) + PRIMES.push(2 * i + 3); + } +})(NUM_PRIMES); + +function isPrime(num) { + if (num === 2) return true; - } - function getPrimes(limit) { - const primes = []; - for (let i = 0; i <= limit; i++) { - if (isPrime(i)) primes.push(i); - } - return primes; - } + else if (num % 2 === 0) + return false + else + return PRIME_SIEVE[(num - 3) / 2]; +} - const primes = getPrimes(limit); - let primeSum = [...primes]; - primeSum.reduce((acc, n, i) => { - primeSum[i] += acc; - return acc += n; - }, 0); +function consecutivePrimeSum(limit) { + // Initalize for longest sum < 100 + let bestPrime = 41; + let bestI = 0; + let bestJ = 5; - for (let j = primeSum.length - 1; j >= 0; j--) { - for (let i = 0; i < j; i++) { - const sum = primeSum[j] - primeSum[i]; - if (sum > limit) break; - if (isPrime(sum) && primes.indexOf(sum) > -1) return sum; + // Find longest sum < limit + let sumOfCurrRange = 41; + let i = 0, j = 5; + // -- Loop while current some starting at i is < limit + while (sumOfCurrRange < limit) { + let currSum = sumOfCurrRange; + // -- Loop while pushing j towards end of PRIMES list + // keeping sum under limit + while (currSum < limit) { + if (isPrime(currSum)) { + bestPrime = sumOfCurrRange = currSum; + bestI = i; + bestJ = j; + } + // -- Increment inner loop + j++; + currSum += PRIMES[j]; } + // -- Increment outer loop + i++; + j = i + (bestJ - bestI); + sumOfCurrRange -= PRIMES[i - 1]; + sumOfCurrRange += PRIMES[j]; } + // Return + return bestPrime; } ``` diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-50-consecutive-prime-sum.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-50-consecutive-prime-sum.md index c5d3150b0f..1297a63736 100644 --- a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-50-consecutive-prime-sum.md +++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-50-consecutive-prime-sum.md @@ -54,42 +54,70 @@ consecutivePrimeSum(1000000); # --solutions-- ```js -function consecutivePrimeSum(limit) { - function isPrime(num) { - if (num < 2) { - return false; - } else if (num === 2) { - return true; - } - const sqrtOfNum = Math.floor(num ** 0.5); - for (let i = 2; i <= sqrtOfNum + 1; i++) { - if (num % i === 0) { - return false; - } +// Initalize prime number list with sieve +const NUM_PRIMES = 1000000; +const PRIMES = [2]; +const PRIME_SIEVE = Array(Math.floor((NUM_PRIMES-1)/2)).fill(true); +(function initPrimes(num) { + const upper = Math.floor((num - 1) / 2); + const sqrtUpper = Math.floor((Math.sqrt(num) - 1) / 2); + for (let i = 0; i <= sqrtUpper; i++) { + if (PRIME_SIEVE[i]) { + // Mark value in PRIMES array + const prime = 2 * i + 3; + PRIMES.push(prime); + // Mark all multiples of this number as false (not prime) + const primeSqaredIndex = 2 * i ** 2 + 6 * i + 3; + for (let j = primeSqaredIndex; j < upper; j += prime) + PRIME_SIEVE[j] = false; } + } + for (let i = sqrtUpper + 1; i < upper; i++) { + if (PRIME_SIEVE[i]) + PRIMES.push(2 * i + 3); + } +})(NUM_PRIMES); + +function isPrime(num) { + if (num === 2) return true; - } - function getPrimes(limit) { - const primes = []; - for (let i = 0; i <= limit; i++) { - if (isPrime(i)) primes.push(i); - } - return primes; - } + else if (num % 2 === 0) + return false + else + return PRIME_SIEVE[(num - 3) / 2]; +} - const primes = getPrimes(limit); - let primeSum = [...primes]; - primeSum.reduce((acc, n, i) => { - primeSum[i] += acc; - return acc += n; - }, 0); +function consecutivePrimeSum(limit) { + // Initalize for longest sum < 100 + let bestPrime = 41; + let bestI = 0; + let bestJ = 5; - for (let j = primeSum.length - 1; j >= 0; j--) { - for (let i = 0; i < j; i++) { - const sum = primeSum[j] - primeSum[i]; - if (sum > limit) break; - if (isPrime(sum) && primes.indexOf(sum) > -1) return sum; + // Find longest sum < limit + let sumOfCurrRange = 41; + let i = 0, j = 5; + // -- Loop while current some starting at i is < limit + while (sumOfCurrRange < limit) { + let currSum = sumOfCurrRange; + // -- Loop while pushing j towards end of PRIMES list + // keeping sum under limit + while (currSum < limit) { + if (isPrime(currSum)) { + bestPrime = sumOfCurrRange = currSum; + bestI = i; + bestJ = j; + } + // -- Increment inner loop + j++; + currSum += PRIMES[j]; } + // -- Increment outer loop + i++; + j = i + (bestJ - bestI); + sumOfCurrRange -= PRIMES[i - 1]; + sumOfCurrRange += PRIMES[j]; } + // Return + return bestPrime; } ```