Готовясь к предстоящему Google Code Jam, я начал работать над некоторыми проблемами. Вот одна из практических задач, которую я попробовал:
http://code.google.com/codejam/contest/32016/dashboard#s=p0
И вот суть моего текущего решения Haskell:
{-
- Problem URL: http://code.google.com/codejam/contest/32016/dashboard#s=p0
-
- solve takes as input a list of strings for a particular case
- and returns a string representation of its solution.
-}
import Data.List
solve :: [String] -> String
solve input = show $ minimum options
where (l1:l2:l3:_) = input
n = read l1 :: Int
v1 = parseVector l2 n
v2 = parseVector l3 n
pairs = [(a,b) | a <- permutations v1, b <- permutations v2]
options = map scalar pairs
parseVector :: String -> Int -> [Int]
parseVector line n = map read $ take n $ (words line) :: [Int]
scalar :: ([Int],[Int]) -> Int
scalar (v1,v2) = sum $ zipWith (*) v1 v2
Это работает с предоставленным образцом входных данных, но умирает на небольшом входе из-за ошибки нехватки памяти. Увеличение максимального размера кучи, по-видимому, ничего не делает, кроме как позволяет ей работать бесконечно.
Мой главный вопрос заключается в том, как оптимизировать это, чтобы оно действительно возвращало решение, кроме передачи флага -O в ghc, что я уже и сделал.