The Solitude of Prime Numbers
PowerShell v2+, 237 149 147 231 216 181 174 169 166 bytes
param($n)filter f($a){'1'*$a-match'^(?!(..+)\1+$)..'}for($i=$n;!((f $i)-and(f($i+2)))){$i++}for(){if(f(--$i)){if((f($i-2))-or(f($i+2))){if($i-lt$n-1){exit}}else{$i}}}
Takes input $n
. Defines a new function f
as the regex prime function (here returning a Boolean if the input is a prime or not).
The next part sets $i
to be equal to $n
, then loops upward until we find the bottom half of our twin prime pair upper bound. E.g., for input 90
, this stops at $i=101
.
Then, we loop from the upper bound downward. I know, it looks like an infinite loop, but it'll eventually end.
If the current number is a prime (f(--$i)
), but its +/- 2
isn't a prime, we add $i
to the pipeline. However, if its +/- 2
is a prime, we check whether we're lower than $n-1
(i.e., to account for the situation when it's inside a twin prime pair), at which point we exit
. At program completion, the pipeline is printed to screen via implicit Write-Output
.
NB - Due to the looping structure, prints the primes in descending order. OP has clarified that's OK.
Examples
Output here is space-separated, as that's the default stringification method for an array.
PS C:\Tools\Scripts\golfing> 70,71,72,73,90,201,499,982|%{"$_ --> "+(.\the-solitude-of-prime-numbers.ps1 $_)}
70 --> 67
71 --> 67
72 --> 97 89 83 79 67
73 --> 97 89 83 79
90 --> 97 89 83 79
201 --> 223 211
499 --> 509 503 499 491 487 479 467
982 --> 1013 1009 997 991 983 977 971 967 953 947 941 937 929 919 911 907 887
Haskell, 105 bytes
p x=all((>0).mod x)[2..x-1]
a%x=until(\z->p z&&p(z+2*a))(+a)x
f n=[x|x<-[(-1)%n+1..1%n-1],p x,1%x>x,(-1)%x<x]
Try it Online
JavaScript, 186 183 168 158 Bytes
// solution:
function d(d){function p(n){for(i=n;n%--i;);return!--i}u=d;for(;!p(d--)||!p(--d););for(;!p(u++)||!p(++u););for(;++d<u;)if(p(d)&&!p(d-2)&&!p(d+2))console.log(d)}
// runnable test cases:
console.info('Test ' + 70);
d(70);
console.info('Test ' + 71);
d(71);
console.info('Test ' + 72);
d(72);
console.info('Test ' + 73);
d(73);
console.info('Test ' + 90);
d(90);
console.info('Test ' + 201);
d(201);
console.info('Test ' + 499);
d(499);