Rebol3 Code Examplex
Additive primes
Identify primes whose digit sums are also prime.
Rebol [
title: "Rosetta code: Additive primes"
file: %Additive_primes.r3
url: https://rosettacode.org/wiki/Additive_primes
note: "Based on Red language solution"
]
primes: function [n [integer!]][
;; See: https://rosettacode.org/wiki/Sieve_of_Eratosthenes#Rebol
poke prim: make bitset! n 1 true
r: 2 while [r * r <= n][repeat q n / r - 1 [poke prim q + 1 * r true]
until [not pick prim r: r + 1]]
collect [repeat i n [unless prim/:i [keep i]]]
]
;; Compute the digit sum (cross-sum) of an integer n
cross-sum: function [n][
out: 0 ;; accumulator for sum of digits
foreach m form n [ ;; iterate over the characters of n's string form
out: out - 48 + m ;; convert char to integer, add to out
]
out
]
;; Return all additive primes <= n:
;; A prime p is "additive" if its digit-sum is also prime.
additive-primes: function [n][
collect [
foreach p ps: primes n [ ;; generate primes up to n and iterate over them
if find ps cross-sum p [ ;; check if digit-sum of p is itself in the prime set
keep p ;; keep p if digit-sum is prime
]
]
]
]
;; Generate additive primes up to 500
result: additive-primes 500
;; Format nicely by rows of 10 (with newlines)
print [length? result "additive primes < 500:"]
forall result [
prin pad result/1 -4
if zero? ((index? result) % 10) [print ""]
]
print ""