Magic squares of doubly even order: Difference between revisions
Magic squares of doubly even order (view source)
Revision as of 19:02, 19 December 2016
, 7 years ago→{{header|Haskell}}: layout
m (→{{header|Haskell}}: (Slightly simpler diagonals function – dropped a lambda)) |
m (→{{header|Haskell}}: layout) |
||
Line 570:
magicSquare :: Int -> [[Int]]
magicSquare n
splitEvery n $
-- Taken directly from the integer series where True▼
zipWith (\x i -> if x then i else limit - i)▼
(\x i
series
where
sqr = n * n
limit = sqr + 1
series
| otherwise =
where
▲ limit = sqr + 1
▲ series
▲ -- For integer powers of 2, the (append not) 'magic' series directly
▲ -- yields the truth table that we need
▲ magicSeries $ floor (logBase 2 (fromIntegral sqr))
▲ -- where n is not an integer power of 2, we can replicate a
▲ -- minimum truth table, horizontally and vertically
▲ | otherwise = concat . concat . concat .
▲ scale $ scale <$> splitEvery 4 (magicSeries 4)
▲ where
------------------------------------------------------------------------
magicSeries :: Int -> [Bool]
magicSeries = (iterate (\xs -> xs ++ (not <$> xs)) [True] !!)
Line 603 ⟶ 605:
isPowerOf :: Int -> Int -> Bool
isPowerOf k n = until (\x -> rem x k /= 0) (`quot` k) n == 1
main :: IO ()
main = mapM_ print $ magicSquare 8
--
checked :: Int -> (Int, Bool)
checked n = (h, all (h ==) t)
sum <$>
transpose square ++ -- cols▼
diagonals square -- diagonals
diagonals :: [[Int]] -> [[Int]]
diagonals xs = flip (zipWith (!!)) [0 ..] <$> [xs, reverse xs]
main2 :: IO ()
|