Adds parallelism
This commit is contained in:
parent
f8aa4d7766
commit
c6cc365151
@ -15,6 +15,8 @@ dependencies:
|
|||||||
- base >= 4.7 && < 5
|
- base >= 4.7 && < 5
|
||||||
- containers
|
- containers
|
||||||
- vector
|
- vector
|
||||||
|
- parallel
|
||||||
|
- deepseq
|
||||||
|
|
||||||
executables:
|
executables:
|
||||||
sudoku:
|
sudoku:
|
||||||
@ -22,6 +24,9 @@ executables:
|
|||||||
source-dirs: src
|
source-dirs: src
|
||||||
ghc-options:
|
ghc-options:
|
||||||
- -O2
|
- -O2
|
||||||
|
- -threaded
|
||||||
|
- -rtsopts
|
||||||
|
- -with-rtsopts=-N
|
||||||
dependencies:
|
dependencies:
|
||||||
- split
|
- split
|
||||||
|
|
||||||
|
@ -14,6 +14,8 @@ import qualified Data.Bits
|
|||||||
import Data.Vector.Unboxed ((!))
|
import Data.Vector.Unboxed ((!))
|
||||||
import qualified Data.Vector.Unboxed.Mutable
|
import qualified Data.Vector.Unboxed.Mutable
|
||||||
import qualified Data.Vector.Unboxed
|
import qualified Data.Vector.Unboxed
|
||||||
|
import qualified Data.Maybe
|
||||||
|
import Control.Parallel.Strategies (withStrategy, rdeepseq, parBuffer)
|
||||||
|
|
||||||
fixM :: (Eq t, Monad m) => (t -> m t) -> t -> m t
|
fixM :: (Eq t, Monad m) => (t -> m t) -> t -> m t
|
||||||
fixM f x = f x >>= \x' -> if x' == x then return x else fixM f x'
|
fixM f x = f x >>= \x' -> if x' == x then return x else fixM f x'
|
||||||
@ -250,10 +252,14 @@ solve grid = pruneGrid grid >>= solve'
|
|||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = do
|
main = do
|
||||||
inputs <- lines <$> getContents
|
grids <- lines <$> getContents
|
||||||
Control.Monad.forM_ inputs $ \input ->
|
let solutions = parMap readAndSolve grids
|
||||||
case readGrid input of
|
putStrLn $
|
||||||
Nothing -> putStrLn "Invalid input"
|
show (length $ filter Data.Maybe.isJust solutions) ++ "/" ++ show (length grids) ++ " solved"
|
||||||
Just grid -> case solve grid of
|
where
|
||||||
Nothing -> putStrLn "No solution found"
|
readAndSolve grid = case readGrid grid of
|
||||||
Just grid' -> putStrLn $ showGrid grid'
|
Nothing -> Nothing
|
||||||
|
Just b -> solve b
|
||||||
|
|
||||||
|
chunkSize = 1000
|
||||||
|
parMap f = withStrategy (parBuffer chunkSize rdeepseq) . map f
|
||||||
|
Loading…
Reference in New Issue
Block a user