import Data.List (sortBy)
import Data.Time (getCurrentTime, diffUTCTime)
import Data.Function (on)
data NodeList = NodeList
map1 _ q [] = q
map1 f q (x:xs) = f x : map1 f q xs
makeSums
:: [Int] -> Int -> [NodeList
] -> [NodeList
]makeSums [] _ acc = acc
makeSums
(x:xs
) maxlen acc
= makeSums xs maxlen
$ addNodeList
$ map1 addNode acc
$ filter lessLen acc
where addNodeList y = (NodeList [x] 1 x) : y
addNode
(NodeList root len
sum) = NodeList
(x:root
) (len
+1) (sum+x
) lessLen y = nlLength y < maxlen
makePairs
:: [NodeList
] -> [([Int], [Int])] -> [([Int], [Int])]makePairs [] acc = acc
makePairs
(x:xs
) acc
= makePairs xs
$ (++) acc
$ map pairNodes
$ takeWhile sameSum xs
where sameSum y = nlSum x == (nlSum y)
pairNodes y = (nlRoot x, nlRoot y)
solve nums maxlen = makePairs (sortBy compareNodes (makeSums nums maxlen [])) []
where compareNodes x y
= compare (nlSum x
) (nlSum y
)
makePairs1 [] acc = acc
makePairs1
(x:xs
) acc
= makePairs1 xs
$ map1 pairNodes acc
$ takeWhile sameSum xs
where sameSum y = nlSum x == (nlSum y)
pairNodes y = (nlRoot x, nlRoot y)
solve1 nums maxlen = do
let a1 = makeSums nums maxlen []
let a2
= sortBy
(compare `on` nlSum
) a1
let a3 = makePairs1 a2 []
a3
bench f nums maxlen title = do
begT <- getCurrentTime
endT <- getCurrentTime
print $ (++) "solve1 " $ show (diffUTCTime endT begT
)
test m
= bench solve1
[1..m
] (m `
div`
2) ""
main = test 10 --print $ solve1 [1..4] 3
aW1wb3J0IERhdGEuTGlzdCAoc29ydEJ5KQppbXBvcnQgRGF0YS5UaW1lIChnZXRDdXJyZW50VGltZSwgZGlmZlVUQ1RpbWUpCmltcG9ydCBEYXRhLkZ1bmN0aW9uIChvbikKCmRhdGEgTm9kZUxpc3QgPSBOb2RlTGlzdCAKICAgIHsgbmxSb290ICA6OiBbSW50XQogICAgLCBubExlbmd0aCA6OiBJbnQKICAgICwgbmxTdW0gICAgOjogSW50IH0KICAgIGRlcml2aW5nIChTaG93KQogICAgCm1hcDEgXyBxIFtdICAgID0gcQptYXAxIGYgcSAoeDp4cykgID0gZiB4IDogbWFwMSBmIHEgeHMKIAptYWtlU3VtcyA6OiBbSW50XSAtPiBJbnQgLT4gW05vZGVMaXN0XSAtPiBbTm9kZUxpc3RdCm1ha2VTdW1zIFtdIF8gIGFjYyAgICAgICAgID0gYWNjICAgIAptYWtlU3VtcyAoeDp4cykgbWF4bGVuIGFjYyA9IG1ha2VTdW1zIHhzIG1heGxlbiAkIGFkZE5vZGVMaXN0ICQgbWFwMSBhZGROb2RlIGFjYyAkIGZpbHRlciBsZXNzTGVuIGFjYwoJd2hlcmUgYWRkTm9kZUxpc3QgeSA9IChOb2RlTGlzdCBbeF0gMSB4KSA6IHkKCSAgICAgIGFkZE5vZGUgKE5vZGVMaXN0IHJvb3QgbGVuIHN1bSkgPSBOb2RlTGlzdCAoeDpyb290KSAobGVuKzEpIChzdW0reCkKCSAgICAgIGxlc3NMZW4geSA9IG5sTGVuZ3RoIHkgPCBtYXhsZW4KIAptYWtlUGFpcnMgOjogW05vZGVMaXN0XSAtPiBbKFtJbnRdLCBbSW50XSldIC0+IFsoW0ludF0sIFtJbnRdKV0KbWFrZVBhaXJzIFtdIGFjYyAgICAgPSBhY2MKbWFrZVBhaXJzICh4OnhzKSBhY2MgPSBtYWtlUGFpcnMgeHMgJCAoKyspIGFjYyAkIG1hcCBwYWlyTm9kZXMgJCB0YWtlV2hpbGUgc2FtZVN1bSB4cyAKICAgIHdoZXJlIHNhbWVTdW0geSA9IG5sU3VtIHggPT0gKG5sU3VtIHkpCiAgICAgICAgICBwYWlyTm9kZXMgeSA9IChubFJvb3QgeCwgbmxSb290IHkpCiAgICAgICAgICAgCiAKc29sdmUgOjogW0ludF0gLT4gSW50IC0+IFsoW0ludF0sIFtJbnRdKV0Kc29sdmUgbnVtcyBtYXhsZW4gPSBtYWtlUGFpcnMgKHNvcnRCeSBjb21wYXJlTm9kZXMgKG1ha2VTdW1zIG51bXMgbWF4bGVuIFtdKSkgW10KCXdoZXJlIGNvbXBhcmVOb2RlcyB4IHkgPSBjb21wYXJlIChubFN1bSB4KSAobmxTdW0geSkKCm1ha2VQYWlyczEgW10gYWNjICAgICA9IGFjYwptYWtlUGFpcnMxICh4OnhzKSBhY2MgPSBtYWtlUGFpcnMxIHhzICQgbWFwMSBwYWlyTm9kZXMgYWNjICQgdGFrZVdoaWxlIHNhbWVTdW0geHMKICAgIHdoZXJlIHNhbWVTdW0geSA9IG5sU3VtIHggPT0gKG5sU3VtIHkpCiAgICAgICAgICBwYWlyTm9kZXMgeSA9IChubFJvb3QgeCwgbmxSb290IHkpCgpzb2x2ZTEgbnVtcyBtYXhsZW4gPSBkbwoJbGV0IGExID0gbWFrZVN1bXMgbnVtcyBtYXhsZW4gW10KCWxldCBhMiA9IHNvcnRCeSAoY29tcGFyZSBgb25gIG5sU3VtKSBhMQoJbGV0IGEzID0gbWFrZVBhaXJzMSBhMiBbXQoJYTMKCmJlbmNoIGYgbnVtcyBtYXhsZW4gdGl0bGUgPSBkbwogICAgICAgYmVnVCA8LSBnZXRDdXJyZW50VGltZQogICAgICAgcHJpbnQgJCB0YWtlIDEgJCByZXZlcnNlICQgZiBudW1zIG1heGxlbgogICAgICAgZW5kVCA8LSBnZXRDdXJyZW50VGltZQogICAgICAgcHJpbnQgJCAoKyspICJzb2x2ZTEgICAiICQgc2hvdyAoZGlmZlVUQ1RpbWUgZW5kVCBiZWdUKSAKICAgICAgIAp0ZXN0IG0gPSBiZW5jaCBzb2x2ZTEgWzEuLm1dIChtIGBkaXZgIDIpICIiICAgCgptYWluID0gdGVzdCAxMCAtLXByaW50ICQgc29sdmUxIFsxLi40XSAzCgk=