From 0529e194267d069374329594d5ba5e221ab53b95 Mon Sep 17 00:00:00 2001 From: ddaniel27 <67126972+ddaniel27@users.noreply.github.com> Date: Mon, 24 Oct 2022 07:00:33 -0500 Subject: [PATCH] solution: Project Euler 35 (#1201) * [CREATE] Problem 28 solution for Project Euler * [UPDATE] Added an explanation for the formula used in the algorithm * [CREATE] Added Problem 35 for Project-Euler * [UPDATE] Little typo in the error string * [UPDATE] Some algorithm changes * [UPDATE] Fix test string * [UPDATE] Change prime numbers generator to import a standard sieve algorithm. * [UPDATE] Change sieve algorithm implementation and now the solution works well. Also added some optimizations --- Project-Euler/Problem035.js | 34 +++++++++++++++++++++++++++ Project-Euler/test/Problem035.test.js | 18 ++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 Project-Euler/Problem035.js create mode 100644 Project-Euler/test/Problem035.test.js diff --git a/Project-Euler/Problem035.js b/Project-Euler/Problem035.js new file mode 100644 index 000000000..b62a8f031 --- /dev/null +++ b/Project-Euler/Problem035.js @@ -0,0 +1,34 @@ +/** + * Problem 35 - Circular primes + * + * @see {@link https://projecteuler.net/problem=35} + * + * The number, 197, is called a circular prime because all rotations of the digits: 197, 971, and 719, are themselves prime. + * There are thirteen such primes below 100: 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, and 97. + * How many circular primes are there below one million? + * + * @author ddaniel27 + */ +import { sieveOfEratosthenes } from '../Maths/SieveOfEratosthenesIntArray' + +function problem35 (n) { + if (n < 2) { + throw new Error('Invalid input') + } + const list = sieveOfEratosthenes(n).filter(prime => !prime.toString().match(/[024568]/)) // Get a list of primes without 0, 2, 4, 5, 6, 8 + + const result = list.filter((number, _idx, arr) => { + const str = String(number) + for (let i = 0; i < str.length; i++) { // Get all rotations of the number + const rotation = str.slice(i) + str.slice(0, i) + if (!arr.includes(Number(rotation))) { // Check if the rotation is prime + return false + } + } + return true // If all rotations are prime, then the number is circular prime + }) + + return result.length + 1 // Add 2 to the result because 2 is a circular prime +} + +export { problem35 } diff --git a/Project-Euler/test/Problem035.test.js b/Project-Euler/test/Problem035.test.js new file mode 100644 index 000000000..ebaa4ac46 --- /dev/null +++ b/Project-Euler/test/Problem035.test.js @@ -0,0 +1,18 @@ +import { problem35 } from '../Problem035.js' + +describe('checking circular primes', () => { + it('should be invalid input if number is negative', () => { + expect(() => problem35(-3)).toThrowError('Invalid input') + }) + it('should be invalid input if number is 0', () => { + expect(() => problem35(0)).toThrowError('Invalid input') + }) + // Project Euler Condition Check + test('if the number is equal to 100 result should be 13', () => { + expect(problem35(100)).toBe(13) + }) + // Project Euler Challenge Check + test('if the number is equal to one million result should be 55', () => { + expect(problem35(1000000)).toBe(55) + }) +})