Anonymous user
Sexy primes: Difference between revisions
m
→{{header|Haskell}}: improved performance after reviewing strategies used by other languages.
m (→{{header|Haskell}}: improved performance after reviewing strategies used by other languages.) |
|||
Line 685:
<lang haskell>
import Data.Maybe
import Data.List
import Text.Printf
import Data.Numbers.Primes
type UnSexy = ([Int], Int)
findPairs p (x:xs) ▼
| x - p == 6 = Just (p, x)▼
| x - p > 6 = Nothing▼
| otherwise = findPairs p xs▼
findSexy _ [] = []
findSexy p ps@(x:xs)
| x - p == 6 = p : x : findMore x xs
| x - p > 6 = []
| otherwise = findSexy p xs
filterSexy (x:xs) ys
| x `elem` ys = filter (/= x) $ filterSexy xs ys
| otherwise = filterSexy xs ys
searchPrimes p@(x:xs)
| resultSize == 2 = (addPairGroup, triplets, quads, quins, updateUnSexy)
| resultSize == 3 = (addPairGroup, addTripletGroup, quads, quins, updateUnSexy)
| resultSize == 4 = (addPairGroup, addTripletGroup, addQuadGroup, quins, updateUnSexy)
| resultSize == 5 = (addPairGroup, addTripletGroup, addQuadGroup, trimTo 5 $ result : quins, updateUnSexy)
| resultSize == 0 && x /= 1000033 = (pairs, triplets, quads, quins, trimTo 10 $ x : us)
| otherwise = ys
where ys@(pairs@(pr, pCount), triplets@(tr, tCount), quads@(qd, qCount), quins, us) = searchPrimes xs
result = findSexy x p
resultSize = length result
trimTo n zs = if length zs > n then drop 1 zs else zs
addPairGroup = (trimTo 5 $ take 2 result : pr, pCount + 1)
addTripletGroup = (trimTo 5 $ take 3 result : tr, tCount + 1)
addQuadGroup = (trimTo 5 $ take 4 result : qd, qCount + 1)
updateUnSexy = filterSexy result us
main :: IO ()
main = do
▲ printf "Number of sexy prime pairs: %d\n" $ length pairs
▲ printf lastFiveText (show $ lastFive pairs)
▲ printf "Number of sexy prime triplets: %d\n" $ length triples
▲ printf lastFiveText (show $ lastFive triples)
▲ printf "Number of sexy prime quadruplets: %d\n" $ length quads
▲ printf lastFiveText (show $ lastFive quads)
printf "Number of sexy prime quintuplets: %d\n" $ length quins
printf " Last 1 : %s\n\n" (show quins)
printf "Number of unsexy primes: %d\n" (totalUnSexy $
printf " Last 10 unsexy primes: %v\n\n" (show $
totalUnSexy = length . filter (\n -> (not $ isPrime(n+6)) && (not $ isPrime(n-6)))
(pairs, triplets, quads, quins, unsexy) = searchPrimes $ takeWhile (< 1000035) primes
▲ lastFiveText = " Last 5 : %s\n\n"
</lang>
{{out}}
<pre>
Number of sexy prime pairs: 16386
Last 5 : [
Number of sexy prime triplets: 2900
Last 5 : [
Number of sexy prime quadruplets: 325
Last 5 : [
Number of sexy prime quintuplets: 1
Last 1 : [
Number of unsexy primes: 48627
|