Sexy primes: Difference between revisions

Content added Content deleted
Line 741: Line 741:
</pre>
</pre>
Slight variation which only holds on to the display results. Does not perform any better than above though. Both run ~ 250ms.
Slight variation which only holds on to the display results. Does not perform any better than above though. Both run ~ 250ms.
<lang haskell>import Control.Lens (_1, _2, _3, _4, _5, over)
<lang haskell>{-# LANGUAGE TemplateHaskell #-}
import Control.Lens (makeLenses, over, (^.), to, view)
import Data.Numbers.Primes (isPrime, primes)
import Data.Numbers.Primes (isPrime, primes)
import Text.Printf (printf)
import Text.Printf (printf)


data Group a = Group { _count :: Int, _results :: [a] } deriving (Show)
type Pair = (Int, [(Int, Int)])
makeLenses ''Group
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 Result = ( Group (Int, Int)
type DisplayResult = ((Int, String), (Int, String), (Int, String), (Int, String), (Int, String))
, Group (Int, Int, Int)
, Group (Int, Int, Int, Int)
, Group (Int, Int, Int, Int, Int)
, Group Int)


emptyGroups :: Result
initialGroups :: Result
initialGroups = let newGroup = Group 0 []
emptyGroups = ((0, []), (0, []), (0, []), (0, []), (0, []))
in (newGroup, newGroup, newGroup, newGroup, newGroup)


groups :: Result -> Int -> Result
compute :: Result -> Int -> Result
groups r@(pr, tt, qd, qn, un) n
compute 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 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 n3 && isPrime n2 && isPrime n1 = (addPair pr, addTriplet tt, addQuad qd, qn, un)
Line 771: Line 773:
n4 = n-24
n4 = n-24


addPair = over _1 succ . over _2 (take 5 . (:) (n1, n))
addPair = over count succ . over results (take 5 . (:) (n1, n))
addTriplet = over _1 succ . over _2 (take 5 . (:) (n2, n1, n))
addTriplet = over count succ . over results (take 5 . (:) (n2, n1, n))
addQuad = over _1 succ . over _2 (take 5 . (:) (n3, n2, n1, n))
addQuad = over count succ . over results (take 5 . (:) (n3, n2, n1, n))
addQuin = over _1 succ . over _2 (take 1 . (:) (n4, n3, n2, n1, n))
addQuin = over count succ . over results (take 1 . (:) (n4, n3, n2, n1, n))
addUnSexy = over _1 succ . over _2 (take 10 . (:) n)
addUnSexy = over count succ . over results (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 :: IO ()
main = do
main = do
let (pairs, triplets, quads, quins, unsexy) = collectGroups primes
let (pr, tt, qd, qn, un) = collectGroups primes
uncurry (printf "Number of sexy prime pairs: %d\n Last 5 : %s\n\n") pairs
printf "Number of sexy prime pairs: %d\n Last 5 : %s\n\n" (pr ^. count) (pr ^. results . to (show . reverse))
uncurry (printf "Number of sexy prime triplets: %d\n Last 5 : %s\n\n") triplets
printf "Number of sexy prime triplets: %d\n Last 5 : %s\n\n" (tt ^. count) (tt ^. results . to (show . reverse))
uncurry (printf "Number of sexy prime quadruplets: %d\n Last 5 : %s\n\n") quads
printf "Number of sexy prime quadruplets: %d\n Last 5 : %s\n\n" (qd ^. count) (qd ^. results . to (show . reverse))
uncurry (printf "Number of sexy prime quintuplets: %d\n Last 1 : %s\n\n") quins
printf "Number of sexy prime quintuplets: %d\n Last 1 : %s\n\n" (qn ^. count) (qn ^. results . to (show . reverse))
uncurry (printf "Number of unsexy primes: %d\n Last 10: %s\n\n") unsexy
printf "Number of unsexy primes: %d\n Last 10: %s\n\n" (un ^. count) (un ^. results . to (show . reverse))
where
where
collectGroups = display . foldl groups emptyGroups . takeWhile (< 1000035)
collectGroups = foldl compute initialGroups . takeWhile (< 1000035)</lang>
</lang>


=={{header|Java}}==
=={{header|Java}}==