/**
 * 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')
  }
  // Get a list of primes without 0, 2, 4, 5, 6, 8; this discards the circular primes 2 & 5
  const list = sieveOfEratosthenes(n).filter(
    (prime) => !prime.toString().match(/[024568]/)
  )

  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 + 2 // Add 2 to the result because the circular primes 2 & 5 were discarded
}

export { problem35 }