Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module Solver1 where
- import Data.Ord (comparing)
- import Data.Foldable (minimumBy)
- maxVal :: [(Int, Int)] -> Int
- maxVal l = max (maximum l1) (maximum l2)
- where
- (l1, l2) = unzip l
- best :: [[(Int, Int)]] -> [(Int, Int)]
- best = minimumBy $ comparing maxVal
- gen :: Int -> Int -> (Int, Int) -> (Int, Int) -> [(Int, Int)]
- gen 0 _ _ __ = []
- gen n m p@(ap, bp) (an, bn) = best $ assign <$> els
- where
- els = if n == 1
- then [(a, b) | a <- [1..m], b <- [1..m], a /= b, a /= an, b /= bn, a /= bn, b /= an, a /= ap, b /= bp, a /= bp, b /= ap]
- else [(a, b) | a <- [1..m], b <- [1..m], a /= b, a /= an, b /= bn, a /= bn, b /= an]
- assign e = e : gen (n - 1) m p e
- solve :: Int -> Int -> [(Int, Int)]
- solve n m = best $ assign <$> els
- where
- els = [(a, b) | a <- [1..m], b <- [1..m], a /= b]
- assign e = e : gen (n - 1) m e e
- main :: IO ()
- main = do
- putStrLn $ "result for 4: " ++ show (solve 4 6)
- putStrLn $ "result for 5: " ++ show (solve 5 6)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement