From fb301042ac6df183bb3c59a2d036844ae5c094d0 Mon Sep 17 00:00:00 2001 From: Steven Date: Tue, 4 Jun 2019 21:34:40 -0400 Subject: Removed shadowed bindings & redundant imports --- src/Main.hs | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) (limited to 'src/Main.hs') diff --git a/src/Main.hs b/src/Main.hs index e6ed4e2..190e997 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -1,12 +1,8 @@ -{-# LANGUAGE FlexibleContexts #-} - module Main where import Data.List import Data.Matrix -import Data.String import System.Environment -import System.IO main :: IO () main = do @@ -16,26 +12,26 @@ main = do data Square = O | X | Qu deriving (Show, Eq) -solve :: (Eq t, Num t) => t -> [Matrix Square] +solve :: (Eq n, Num n) => n -> [Matrix Square] solve n = nub $ solveN n where - solveN 1 = solve [initBoard] - solveN x = solve (solveN (x-1)) + solveN 1 = solve' [initBoard] + solveN x = solve' (solveN (x-1)) + solve' bs = concatMap (\bn -> map ((`placeQueen` bn)) (openPositions bn)) bs initBoard = matrix 8 8 (const O) - solve bs = concatMap (\b -> map (\p -> placeQueen p b) (openPositions b)) bs openPositions b = [(i,j) | i <- [1..8], j <- [1..8], b ! (i,j) == O ] placeQueen p b = mark Qu p $ markAttacks b where - markAttacks b = markAll X positions b - positions = concat $ map walk directions + markAttacks bo = markAll X positions bo + positions = concatMap walk directions step (fx,fy) = (\(k,l) -> (fx k, fy l)) walk s = takeWhile inBounds $ iterate (step s) $ step s p - directions = let a = (+1); s = (subtract 1); n = (id) - in [ (a,n),(s,n) -- up, down - , (n,a),(n,s) -- right, left, diags: - , (a,a),(a,s),(s,a),(s,s) ] + directions = let a = (+1); s = subtract 1; nc = id + in [ (a,nc),(s,nc) -- up, down + , (nc,a),(nc,s) -- right, left + , (a,a),(a,s),(s,a),(s,s) ] -- diags inBounds (i,j) = i >= 1 && i <= nrows b && j >= 1 && j <= ncols b - markAll x [] b = b - markAll x (p:ps) b = let nb = mark x p b - in markAll x ps nb - mark x p b = setElem x p b + markAll _ [] mb = mb + markAll x (mp:mps) mb = let nb = mark x mp mb + in markAll x mps nb + mark x mp mb = setElem x mp mb -- cgit v1.2.3