Truncatable primes: Difference between revisions

Content added Content deleted
Line 825: Line 825:


=={{header|Elena}}==
=={{header|Elena}}==
<lang elena>#import system.
<lang elena>#import extensions.
#import extensions.


#symbol MAXN = 1000000.
const MAXN = 1000000.


#class(extension)mathOp
extension mathOp
{
{
#method is &prime
is &prime
[
[
#var(type:int)n := self int.
int n := self int.
(n < 2) ? [ ^ false. ].
if (n < 2) [ ^ false. ].
(n < 4) ? [ ^ true. ].
if (n < 4) [ ^ true. ].
(n mod:2 == 0) ? [ ^ false. ].
if (n mod:2 == 0) [ ^ false. ].
(n < 9) ? [ ^ true. ].
if (n < 9) [ ^ true. ].
(n mod:3 == 0) ? [ ^ false. ].
if (n mod:3 == 0) [ ^ false. ].
#var(type:int)r := n sqrt.
int r := n sqrt.
#var(type:int)f := 5.
int f := 5.
#loop (f <= r)?
while (f <= r)
[
[
((n mod:f == 0) || (n mod:(f + 2) == 0))
if ((n mod:f == 0) || (n mod:(f + 2) == 0))
? [ ^ false. ].
[ ^ false. ].
f := f + 6.
].
f := f + 6.
].
^ true.
^ true.
]
]
#method is &rightTruncatable
is &rightTruncatable
[
[
#var(type:int)n := self int.
int n := self.
#loop (n != 0)?
while (n != 0)
[
[
(n is &prime)
ifnot (n is &prime)
! [ ^ false. ].
[ ^ false. ].
n := n / 10.
n := n / 10.
].
].
^ true.
^ true.
]
]


#method is &leftTruncatable
is &leftTruncatable
[
[
#var(type:int)n := self int.
int n := self.
#var(type:int)tens := 1.
int tens := 1.
#loop (tens < n)
? [ tens := tens * 10. ].
while (tens < n)
[ tens := tens * 10. ].
#loop (n != 0)?
while (n != 0)
[
[
(n is &prime)
ifnot (n is &prime)
! [ ^ false. ].
[ ^ false. ].

tens := tens / 10.
tens := tens / 10.
n := n - (n / tens * tens).
n := n - (n / tens * tens).
].
].
^ true.
^ true.
]
]
}
}


#symbol program =
program =
[
[
#var n := MAXN.
var n := MAXN.
#var max_lt := 0.
var max_lt := 0.
#var max_rt := 0.
var max_rt := 0.

#loop ((max_lt == 0) || (max_rt == 0))?
while ((max_lt == 0) || (max_rt == 0))
[
[
(n literal indexOf:"0" == -1) ?
(n literal indexOf:"0" == -1) ?
[
[
((max_lt == 0) and:[ n is &leftTruncatable ])
if ((max_lt == 0) and:[ n is &leftTruncatable ])
? [ max_lt := n. ].
[
((max_rt == 0) and:[ n is &rightTruncatable ])
max_lt := n.
? [ max_rt := n. ].
].
].
if ((max_rt == 0) and:[ n is &rightTruncatable ])
[
max_rt := n.
].
].
n := n - 1.
n := n - 1.
].
].

console writeLine:"Largest truncable left is ":max_lt.
console writeLine:"Largest truncable left is ":max_lt.
console writeLine:"Largest truncable right is ":max_rt.
console writeLine:"Largest truncable right is ":max_rt.
console readChar.
].</lang>
].</lang>
{{out}}
{{out}}