Sexy primes: Difference between revisions

m
Line 740:
Last 10: [999853,999863,999883,999907,999917,999931,999961,999979,999983,1000003]
</pre>
Slight variation which only holds on to the display results. Does not perform any better than above though.
<lang haskell>import Control.Lens (_1, _2, _3, _4, _5, over)
import Data.Numbers.Primes (isPrime, primes)
import Text.Printf (printf)
 
type Pair = (Int, [(Int, Int)])
type Triplet = (Int, [(Int, Int, Int)])
type Quad = (Int, [(Int, Int, Int, Int)])
type Quin = (Int, [(Int, Int, Int, Int, Int)])
type UnSexy = (Int, [Int])
 
type Result = (Pair, Triplet, Quad, Quin, UnSexy)
type DisplayResult = ((Int, String), (Int, String), (Int, String), (Int, String), (Int, String))
 
emptyGroups :: Result
emptyGroups = ((0, []), (0, []), (0, []), (0, []), (0, []))
 
groups :: Result -> Int -> Result
groups r@(pr, tt, qd, qn, un) n
| isPrime n4 && isPrime n3 && isPrime n2 && isPrime n1 = (addPair pr, addTriplet tt, addQuad qd, addQuin qn, un)
| isPrime n3 && isPrime n2 && isPrime n1 = (addPair pr, addTriplet tt, addQuad qd, qn, un)
| isPrime n2 && isPrime n1 = (addPair pr, addTriplet tt, qd, qn, un)
| isPrime n1 = (addPair pr, tt, qd, qn, un)
| not (isPrime (n+6)) && not (isPrime n1) = (pr, tt, qd, qn, addUnSexy un)
| otherwise = r
where
n1 = n-6
n2 = n-12
n3 = n-18
n4 = n-24
 
addPair = over _1 succ . over _2 (take 5 . (:) (n1, n))
addTriplet = over _1 succ . over _2 (take 5 . (:) (n2, n1, n))
addQuad = over _1 succ . over _2 (take 5 . (:) (n3, n2, n1, n))
addQuin = over _1 succ . over _2 (take 1 . (:) (n4, n3, n2, n1, n))
addUnSexy = over _1 succ . over _2 (take 10 . (:) n)
 
display :: Result -> DisplayResult
display = over _1 f . over _2 f . over _3 f . over _4 f . over _5 f
where
f :: Show b => (a, [b]) -> (a, String)
f = over _2 show . over _2 reverse
 
main :: IO ()
main = do
let (pairs, triplets, quads, quins, unsexy) = collectGroups primes
uncurry (printf "Number of sexy prime pairs: %d\n Last 5 : %s\n\n") pairs
uncurry (printf "Number of sexy prime triplets: %d\n Last 5 : %s\n\n") triplets
uncurry (printf "Number of sexy prime quadruplets: %d\n Last 5 : %s\n\n") quads
uncurry (printf "Number of sexy prime quintuplets: %d\n Last 1 : %s\n\n") quins
uncurry (printf "Number of unsexy primes: %d\n Last 10: %s\n\n") unsexy
where
collectGroups = display . foldl groups emptyGroups . takeWhile (< 1000035)
</lang>
 
=={{header|Java}}==
Anonymous user