035 Circular primes -- v2.sf 898 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #!/usr/bin/ruby
  2. # Author: Trizen
  3. # Date: 15 March 2023
  4. # https://github.com/trizen
  5. # How many circular primes are there below one million?
  6. # https://projecteuler.net/problem=35
  7. # Runtime: 0.405s
  8. func primes_from_digits(upto, digits, base = 10) {
  9. upto = prev_prime(upto+1)
  10. var list = []
  11. var end_digits = digits.grep { .is_coprime(base) }
  12. for k in (1 .. upto.ilog(base)) {
  13. digits.variations_with_repetition(k, {|*a|
  14. var v = a.digits2num(base)
  15. end_digits.each {|d|
  16. var n = (v*base + d)
  17. list << n if (n.is_prime && (n <= upto))
  18. }
  19. })
  20. }
  21. list.sort
  22. }
  23. var count = 4 # number of circular primes < 10
  24. var limit = 1e6
  25. primes_from_digits(limit, [1,3,7,9]).each {|p|
  26. var d = Str(p).chars
  27. if (d.range.all {|k| Num(d.rotate(k).join).is_prime }) {
  28. ++count
  29. }
  30. }
  31. say count