Extra primes

From Rosetta Code
Revision as of 20:19, 1 December 2020 by Chunes (talk | contribs) (Add Factor)
Extra primes is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.

n is an extra prime if n is prime and its digits and sum of digits are also primes.




Factor

Translation of: Wren
Works with: Factor version 0.99 2020-08-14

<lang factor>USING: formatting io kernel math math.functions math.primes sequences sequences.extras ;

digit ( seq seq -- seq ) [ suffix ] cartesian-map concat ;
front ( -- seq ) { { 2 } { 3 } { 5 } { 7 } } ;
middle ( seq -- newseq ) { 2 3 5 7 } digit ;
end ( seq -- newseq ) { 3 7 } digit ;
candidates ( -- seq )
   front
   front end
   front middle end
   front middle middle end
   append append append ;
digits>number ( seq -- n )
   <reversed> 0 [ 10^ * + ] reduce-index ;

"The extra primes with up to 4 digits are:" print candidates [ sum prime? ] filter [ digits>number ] [ prime? ] map-filter [ 1 + swap "%2d: %4d\n" printf ] each-index</lang>

Output:
The extra primes with up to 4 digits are:
 1:    2
 2:    3
 3:    5
 4:    7
 5:   23
 6:  223
 7:  227
 8:  337
 9:  353
10:  373
11:  557
12:  577
13:  733
14:  757
15:  773
16: 2333
17: 2357
18: 2377
19: 2557
20: 2753
21: 2777
22: 3253
23: 3257
24: 3323
25: 3527
26: 3727
27: 5233
28: 5237
29: 5273
30: 5323
31: 5527
32: 7237
33: 7253
34: 7523
35: 7723
36: 7727

Ring

<lang ring> load "stdlib.ring"

limit = 1000 num = 0 for n = 1 to limit

   x1 = prime1(n)
   x2 = prime2(n)
   if x1 = 1 and x2 = 1
      num = num + 1
      see "The " + num + "th Extra Prime is: " + n + nl
   ok

next

func prime1(x)

    pstr = string(x)
    len = len(pstr)
    count = 0
    for n = 1 to len 
        if isprime(number(pstr[n]))
           count = count + 1
        ok
    next
    if count = len 
       return 1
    else
       return 0
    ok

func prime2(x)

    pstr = string(x)
    len = len(pstr)
    sum = 0
    for n = 1 to len
        sum = sum + number(pstr[n])
    next
    if isprime(sum)
       return 1
    else
       return 0
    ok

</lang> Output:

The 1th Extra Prime is: 2
The 2th Extra Prime is: 3
The 3th Extra Prime is: 5
The 4th Extra Prime is: 7
The 5th Extra Prime is: 23
The 6th Extra Prime is: 25
The 7th Extra Prime is: 32
The 8th Extra Prime is: 52
The 9th Extra Prime is: 223
The 10th Extra Prime is: 227
The 11th Extra Prime is: 232
The 12th Extra Prime is: 272
The 13th Extra Prime is: 322
The 14th Extra Prime is: 335
The 15th Extra Prime is: 337
The 16th Extra Prime is: 353
The 17th Extra Prime is: 355
The 18th Extra Prime is: 373
The 19th Extra Prime is: 377
The 20th Extra Prime is: 533
The 21th Extra Prime is: 535
The 22th Extra Prime is: 553
The 23th Extra Prime is: 557
The 24th Extra Prime is: 575
The 25th Extra Prime is: 577
The 26th Extra Prime is: 722
The 27th Extra Prime is: 733
The 28th Extra Prime is: 737
The 29th Extra Prime is: 755
The 30th Extra Prime is: 757
The 31th Extra Prime is: 773
The 32th Extra Prime is: 775

Wren

Library: Wren-math
Library: Wren-fmt

Unsure of the task - see talk page. <lang ecmascript>import "/math" for Int import "/fmt" for Fmt

var digits = [2, 3, 5, 7] // the only digits which are primes var digits2 = [3, 7] // a prime > 5 can't end in 2 or 5 var candidates = [[2, 2], [3, 3], [5, 5], [7, 7]] // [number, sum of its digits]

for (a in digits) {

   for (b in digits2) candidates.add([10*a + b, a + b])

}

for (a in digits) {

   for (b in digits) {
      for (c in digits2) candidates.add([100*a + 10*b + c, a + b + c])
   }

}

for (a in digits) {

   for (b in digits) {
       for (c in digits) {
           for (d in digits2) candidates.add([1000*a + 100*b + 10*c + d, a + b + c + d])
       }
   }

}

System.print("The extra primes with up to 4 digits are:") var count = 0 for (cand in candidates) {

  if (Int.isPrime(cand[0]) && Int.isPrime(cand[1])) {
     count = count + 1
     Fmt.print("$2d: $4d", count, cand[0])
  }

}</lang>

Output:
The extra primes with up to 4 digits are:
 1:    2
 2:    3
 3:    5
 4:    7
 5:   23
 6:  223
 7:  227
 8:  337
 9:  353
10:  373
11:  557
12:  577
13:  733
14:  757
15:  773
16: 2333
17: 2357
18: 2377
19: 2557
20: 2753
21: 2777
22: 3253
23: 3257
24: 3323
25: 3527
26: 3727
27: 5233
28: 5237
29: 5273
30: 5323
31: 5527
32: 7237
33: 7253
34: 7523
35: 7723
36: 7727