10 # (ok, i, f) = freadi f
22 # (preamble, [num:rest]) = splitAt 25 l
23 | isEmpty [()\\(x, y)<-diag2 preamble preamble | x+y==num] = [num]
27 # ls = fst (splitAt 25 ls) ++ pre ls
28 = let a = calc (last ls) ls in last a + hd a
30 calc num = sort o hd o hd o filter (not o isEmpty) o map (filter ((==)num o sum) o dropWhile ((<)num o sum) o inits) o tails