Magic squares of doubly even order: Difference between revisions

m
→‎{{header|Haskell}}: (pruning some redundant brackets )
m (→‎{{header|REXX}}: changed wording in the REXX section header.)
m (→‎{{header|Haskell}}: (pruning some redundant brackets ))
Line 567:
 
<lang Haskell>import Data.List (transpose, unfoldr)
 
magicSquare :: Int -> [[Int]]
magicSquare n
| (rem n 4) > 0 = []
| otherwise = splitEvery n $
-- Taken directly from the integer series where True
Line 583:
-- For integer powers of 2, the (append not) 'magic' series directly
-- yields the truth table that we need
| isPowerOf 2 n =
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
scale = replicate $ quot n 4
Line 595:
 
------------------------------------------------------------------------
 
magicSeries :: Int -> [Bool]
magicSeries = (iterate (\xs -> xs ++ (not <$> xs)) [True] !!)
Line 601:
splitEvery :: Int -> [a] -> [[a]]
splitEvery n = takeWhile (not . null) . unfoldr (Just . splitAt n)
 
isPowerOf :: Int -> Int -> Bool
isPowerOf k n =
(until (\x -> (rem x k) /= 0)
(\x -> `quot x` k) n) == 1
 
main :: IO ()
main = mapM_ print $ magicSquare 8
 
----------------------------------------------------------------------
 
-- Summed and checked
checked :: Int -> (Int, Bool)
Line 617:
where
square = magicSquare n
h:t = sum <$> (square) ++ -- rows
(transpose square) ++ -- cols
(diagonals square) -- diagonals
 
diagonals :: [[Int]] -> [[Int]]
diagonals xs =
(\x -> zipWith (!!) x [0..]) <$> [xs, reverse xs]
 
main2 :: IO ()
main2 = print $ checked 8</lang>
9,659

edits