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> |
<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 Quin = (Int, [(Int, Int, Int, Int, Int)]) |
|||
type UnSexy = (Int, [Int]) |
|||
type Result = ( |
type Result = ( Group (Int, Int) |
||
, Group (Int, Int, Int) |
|||
⚫ | |||
⚫ | |||
, Group Int) |
|||
initialGroups :: Result |
|||
initialGroups = let newGroup = Group 0 [] |
|||
emptyGroups = ((0, []), (0, []), (0, []), (0, []), (0, [])) |
|||
in (newGroup, newGroup, newGroup, newGroup, newGroup) |
|||
compute :: Result -> Int -> Result |
|||
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 |
addPair = over count succ . over results (take 5 . (:) (n1, n)) |
||
addTriplet = over |
addTriplet = over count succ . over results (take 5 . (:) (n2, n1, n)) |
||
addQuad = over |
addQuad = over count succ . over results (take 5 . (:) (n3, n2, n1, n)) |
||
addQuin = over |
addQuin = over count succ . over results (take 1 . (:) (n4, n3, n2, n1, n)) |
||
addUnSexy = over |
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 ( |
let (pr, tt, qd, qn, un) = collectGroups primes |
||
printf "Number of sexy prime pairs: %d\n Last 5 : %s\n\n" (pr ^. count) (pr ^. results . to (show . reverse)) |
|||
printf "Number of sexy prime triplets: %d\n Last 5 : %s\n\n" (tt ^. count) (tt ^. results . to (show . reverse)) |
|||
printf "Number of sexy prime quadruplets: %d\n Last 5 : %s\n\n" (qd ^. count) (qd ^. results . to (show . reverse)) |
|||
printf "Number of sexy prime quintuplets: %d\n Last 1 : %s\n\n" (qn ^. count) (qn ^. results . to (show . reverse)) |
|||
printf "Number of unsexy primes: %d\n Last 10: %s\n\n" (un ^. count) (un ^. results . to (show . reverse)) |
|||
where |
where |
||
collectGroups = |
collectGroups = foldl compute initialGroups . takeWhile (< 1000035)</lang> |
||
</lang> |
|||
=={{header|Java}}== |
=={{header|Java}}== |