037 Truncatable primes.sf 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #!/usr/bin/ruby
  2. # Daniel "Trizen" Șuteu
  3. # Edit: 04 February 2019
  4. # Edit: 28 March 2023
  5. # https://github.com/trizen
  6. # Find the sum of the only eleven primes that are both truncatable from left to right and right to left.
  7. # NOTE: 2, 3, 5, and 7 are not considered to be truncatable primes.
  8. # https://projecteuler.net/problem=37
  9. # Runtime: 0.265s
  10. func is_left_truncatable_prime(digits, base) {
  11. ^digits -> all {|k| digits.first(k+1).digits2num(base).is_prime }
  12. }
  13. func generate_from_prefix(p, base) {
  14. var seq = [p]
  15. for n in (1 ..^ base) {
  16. var t = [n, p...]
  17. if (t.digits2num(base).is_prime) {
  18. seq << __FUNC__(t, base).grep { is_left_truncatable_prime(_, base) }...
  19. }
  20. }
  21. return seq
  22. }
  23. func both_truncatable_primes(base) { # finite sequence for each base
  24. var prime_digits = (base-1 -> primes) # prime digits < base
  25. prime_digits.map {|p| generate_from_prefix([p], base)... }\
  26. .map {|t| digits2num(t, base) }\
  27. .sort
  28. }
  29. var base = 10
  30. var T = both_truncatable_primes(base)
  31. say T.grep { _ >= base }.sum