import Data.Array
yoba rangeArr end start = minimumOp [arr ! (end, x) | x <- [0 .. sizeX]]
where bounds' @ ((0, 0), (sizeY, sizeX)) = bounds rangeArr
arr = listArray bounds' [value y x | y <- [0 .. sizeY], x <- [0 .. sizeX]]
value y _ | y == start = Just 0
value _ 0 = Nothing
value y x = minimumOp [(arr ! (n, x - 1)) `addOp` (rangeArr ! (n, y)) | n <- [0 .. sizeY]]
addOp = liftM2 (+)
minimumOp
= foldl minOp Nothing
where Just v1 `minOp` Just v2
= Just
$ min v1 v2
Just v1 `minOp` Nothing = Just v1
Nothing `minOp` Just v2 = Just v2
Nothing `minOp` Nothing = Nothing
main
= print $ yoba
(toArray2D graph
) end start
where end = 4
start = 0
graph = [[Nothing, Just 7, Just 9, Nothing, Nothing, Just 14],
[Just 7, Nothing, Just 10, Just 15, Nothing, Nothing],
[Just 9, Just 10, Nothing, Just 11, Nothing, Just 2],
[Nothing, Just 15, Just 11, Nothing, Just 6, Nothing],
[Nothing, Nothing, Nothing, Just 6, Nothing, Just 9],
[Just 14, Nothing, Just 2, Nothing, Just 9, Nothing]]
toArray2D source = listArray ((0, 0), (size, size)) [source !! y !! x | y <- [0 .. size], x <- [0 .. size]]
where size
= length source
- 1
aW1wb3J0IENvbnRyb2wuTW9uYWQKCmltcG9ydCBEYXRhLkFycmF5Cgp5b2JhIHJhbmdlQXJyIGVuZCBzdGFydCA9IG1pbmltdW1PcCBbYXJyICEgKGVuZCwgeCkgfCB4IDwtIFswIC4uIHNpemVYXV0KIAogIHdoZXJlIGJvdW5kcycgQCAoKDAsIDApLCAoc2l6ZVksIHNpemVYKSkgPSBib3VuZHMgcmFuZ2VBcnIKICAgICAgICAKICAgICAgICBhcnIgPSBsaXN0QXJyYXkgYm91bmRzJyBbdmFsdWUgeSB4IHwgeSA8LSBbMCAuLiBzaXplWV0sIHggPC0gWzAgLi4gc2l6ZVhdXQogICAgICAgIAogICAgICAgIHZhbHVlIHkgXyB8IHkgPT0gc3RhcnQgPSBKdXN0IDAKICAgICAgICB2YWx1ZSBfIDAgICAgICAgICAgICAgID0gTm90aGluZwogICAgICAgIHZhbHVlIHkgeCAgICAgICAgICAgICAgPSBtaW5pbXVtT3AgWyhhcnIgISAobiwgeCAtIDEpKSBgYWRkT3BgIChyYW5nZUFyciAhIChuLCB5KSkgfCBuIDwtIFswIC4uIHNpemVZXV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgIGFkZE9wID0gbGlmdE0yICgrKQogICAgICAgIAogICAgICAgIG1pbmltdW1PcCA9IGZvbGRsIG1pbk9wIE5vdGhpbmcKICAgICAgICAKICAgICAgICAgIHdoZXJlIEp1c3QgdjEgYG1pbk9wYCBKdXN0IHYyID0gSnVzdCAkIG1pbiB2MSB2MgogICAgICAgICAgICAgICAgSnVzdCB2MSBgbWluT3BgIE5vdGhpbmcgPSBKdXN0IHYxCiAgICAgICAgICAgICAgICBOb3RoaW5nIGBtaW5PcGAgSnVzdCB2MiA9IEp1c3QgdjIKICAgICAgICAgICAgICAgIE5vdGhpbmcgYG1pbk9wYCBOb3RoaW5nID0gTm90aGluZyAgICAgICAgCiAgICAgICAgIAoKbWFpbiA9IHByaW50ICQgeW9iYSAodG9BcnJheTJEIGdyYXBoKSBlbmQgc3RhcnQKCiAgd2hlcmUgZW5kICAgPSA0CiAgICAgICAgc3RhcnQgPSAwCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgZ3JhcGggPSBbW05vdGhpbmcsIEp1c3QgIDcsIEp1c3QgIDksIE5vdGhpbmcsIE5vdGhpbmcsIEp1c3QgMTRdLAogICAgICAgICAgICAgICAgIFtKdXN0ICA3LCBOb3RoaW5nLCBKdXN0IDEwLCBKdXN0IDE1LCBOb3RoaW5nLCBOb3RoaW5nXSwKICAgICAgICAgICAgICAgICBbSnVzdCAgOSwgSnVzdCAxMCwgTm90aGluZywgSnVzdCAxMSwgTm90aGluZywgSnVzdCAgMl0sCiAgICAgICAgICAgICAgICAgW05vdGhpbmcsIEp1c3QgMTUsIEp1c3QgMTEsIE5vdGhpbmcsIEp1c3QgIDYsIE5vdGhpbmddLAogICAgICAgICAgICAgICAgIFtOb3RoaW5nLCBOb3RoaW5nLCBOb3RoaW5nLCBKdXN0ICA2LCBOb3RoaW5nLCBKdXN0ICA5XSwKICAgICAgICAgICAgICAgICBbSnVzdCAxNCwgTm90aGluZywgSnVzdCAgMiwgTm90aGluZywgSnVzdCAgOSwgTm90aGluZ11dCiAgICAgICAgICAgICAgICAgCiAgICAgICAgdG9BcnJheTJEIHNvdXJjZSA9IGxpc3RBcnJheSAoKDAsIDApLCAoc2l6ZSwgc2l6ZSkpIFtzb3VyY2UgISEgeSAhISB4IHwgeSA8LSBbMCAuLiBzaXplXSwgeCA8LSBbMCAuLiBzaXplXV0KICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgd2hlcmUgc2l6ZSA9IGxlbmd0aCBzb3VyY2UgLSAx