--Returns last N elements in list
lastN :: Int -> [a] -> [a]
lastN n xs = let m = length xs in drop (m-n) xs
--create contiguous array starting from index b within list a
produceContiguous :: [a] -> Int -> [[a]]
produceContiguous [] _ = [[]]
produceContiguous arr ix = scanl (\acc x -> acC++ [x]) [arr !! ix] inset
where inset = lastN (length arr - (ix + 1)) arr
--Find maximum sum of all possible contiguous sub arrays, modulo [n]
--d is dummy data
let d = [1,2,3,10,6,3,1,47,10]
let maxResult = maximum $ map (\s -> maximum s) $ map (\c -> map (\ac -> (sum ac)`mod` (last n)) c) $ map (\n -> produceContiguous d n) [0..(length d) -1]
Я Haskell Newb - всего несколько дней в нем .. Если я делаю что-то явно не так, whoopsiesКакие оптимизации можно сделать для этого кода Haskell?
Если код работает и вам просто нужны предложения по улучшению, вы должны отправить сообщение на codereview.stackexchange.com. В противном случае вам нужно точно указать, в чем проблема, которую вы хотите решить. – chepner
Это странная вариация проблемы с максимальным подмассивом. Я предполагаю, что бит modulo 'n' предназначен для нарушения стандартного (эффективного) решения. Я не уверен, есть ли такое же эффективное решение для этого варианта, но я сомневаюсь. Модульная арифметика и максимизация на самом деле не очень хороши в целом. – dfeuer
В таких вопросах вы всегда должны включать спецификацию, заявляя простым словам, что должна делать программа. Это обеспечит большую видимость - я думаю, большинство читателей просто видят блок кода и перестают читать. В комментарии в комментарии выше 'd' есть очень короткий код, но он потерян в шуме. – chi