Last active
April 11, 2019 23:46
-
-
Save scott-fleischman/901b05d201ca0d359f003b39f16a7080 to your computer and use it in GitHub Desktop.
Multiplicative persistence
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{-# LANGUAGE ScopedTypeVariables #-} | |
module Main where | |
import qualified Data.Digits | |
biggie :: Integer | |
biggie = 277777788888899 | |
mDecimalDigitsRev :: Integer -> Maybe [Integer] | |
mDecimalDigitsRev = Data.Digits.mDigitsRev 10 | |
persistence :: Integer -> Integer | |
persistence input | input <= 10 = 0 | |
persistence input = | |
case mDecimalDigitsRev input of | |
Just xs@(_ : _ : _) -> | |
let p = product xs | |
in | |
if p <= 9 | |
then 1 | |
else 1 + persistence p | |
_ -> 0 | |
persistenceList :: [Integer] -> Integer | |
persistenceList [] = 0 | |
persistenceList (_ : []) = 0 | |
persistenceList digits@(_ : _ : _) = | |
let p = product digits | |
in 1 + persistence p | |
digitGenerator :: Integer -> Int -> [[Integer]] | |
digitGenerator d maxDigits = [replicate x d | x <- [0..maxDigits]] | |
digitNumberGenerator :: Int -> [[Integer]] | |
digitNumberGenerator maxDigits = | |
[d2++d3++d4++d5++d7++d8++d9 | |
| d2 <- digitGenerator 2 1 | |
, d3 <- digitGenerator 3 1 | |
, d4 <- digitGenerator 4 1 | |
, d5 <- digitGenerator 5 maxDigits | |
, d7 <- digitGenerator 7 maxDigits | |
, d8 <- digitGenerator 8 maxDigits | |
, d9 <- digitGenerator 9 maxDigits | |
, (null d2 && null d4 && null d8) || null d5 | |
, not (not (null d2) && not (null d4)) | |
] | |
loop :: [Integer] -> IO () | |
loop [] = print "Ran out of numbers" | |
loop (n : ns) = do | |
print n | |
let p = persistence n | |
if p >= 3 | |
then print (n, p) | |
else return () | |
loop ns | |
loopList :: [[Integer]] -> IO () | |
loopList [] = print "Ran out of numbers" | |
loopList (n : ns) = do | |
let p = persistenceList n | |
if p > 11 | |
then print (n, p) | |
else return () | |
loopList ns | |
main :: IO () | |
main = loopList $ digitNumberGenerator 1000 | |
-- main = print $ length $ digitNumberGenerator 40 | |
-- main = mapM_ print $ take 1000 $ digitNumberGenerator 3 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: persistence | |
version: 0.1.0 | |
dependencies: | |
- aeson | |
- attoparsec | |
- base | |
- bytestring | |
- containers | |
- digits | |
- lens | |
- lens-aeson | |
- mtl | |
- parsers | |
- QuickCheck | |
- text | |
- transformers | |
ghc-options: | |
- -Wall | |
- -O2 | |
executable: | |
main: Main.hs |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
([2,7,7,7,7,7,8,9,9,9,9,9,9,9,9,9,9],11) | |
([2,7,7,7,7,7,7,8,8,8,8,8,8,9,9],11) | |
[3,8,8,8,8,8,8,8,8,8,8,8,9],10) | |
([3,7,7,8,8,8,8,9,9,9],10) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
resolver: lts-12.24 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment