Magic squares of doubly even order: Difference between revisions
Magic squares of doubly even order (view source)
Revision as of 22:09, 18 December 2016
, 7 years ago→{{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
|
| 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 =
scale $ scale <$>
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 =
(
main :: IO ()
main = mapM_ print $ magicSquare 8
----------------------------------------------------------------------
-- Summed and checked
checked :: Int -> (Int, Bool)
Line 617:
where
square = magicSquare n
h:t = sum <$>
diagonals :: [[Int]] -> [[Int]]
diagonals xs =
(\x -> zipWith (!!) x [0..]) <$> [xs, reverse xs]
main2 :: IO ()
main2 = print $ checked 8</lang>
|