I'm a software engineer, get me out of here: Difference between revisions
Content added Content deleted
(Realize Part 1 in F#) |
(→{{header|F_Sharp|F#}}: Complete Part 2) |
||
Line 103: | Line 103: | ||
[(11, 11); (12, 11); (15, 8); (18, 11); (22, 11)] |
[(11, 11); (12, 11); (15, 8); (18, 11); (22, 11)] |
||
[(11, 11); (11, 12); (14, 9); (18, 13); (22, 13)] |
[(11, 11); (11, 12); (14, 9); (18, 13); (22, 13)] |
||
</pre> |
|||
===Part 2=== |
|||
This task uses [[Floyd-Warshall algorithm#F.23]] |
|||
<lang fsharp> |
|||
let board=readCSV '\t' "gmooh.dat"|>Seq.choose(fun n->match n.value with |"0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9" as g->Some((n.row,n.col),int g)|_->None)|>Map.ofSeq |
|||
let nodes=board|>Seq.map(fun n->n.Key)|>Set.ofSeq |
|||
let adjacent (n,g) v=List.choose(fun y->if y=(n,g) then None else match Set.contains y nodes with |true->Some ((y),1)|_->None) [(n+v,g);(n-v,g);(n,g+v);(n,g-v);(n+v,g+v);(n+v,g-v);(n-v,g+v);(n-v,g-v);] |
|||
let adjacencyList=board |>Seq.collect (fun n->Seq.map(fun ((n'),g')->((n.Key,n'),g'))(adjacent n.Key n.Value))|> Map.ofSeq |
|||
let _,paths=Floyd (nodes|>Set.toArray) adjacencyList |
|||
paths (21,11) (1,11) |>Seq.iteri(fun n g->if n>0 then printf "->"; printf "%A" g else printf "%A" g) ; printfn "" |
|||
paths (1,11) (21,11) |>Seq.iteri(fun n g->if n>0 then printf "->"; printf "%A" g else printf "%A" g) ; printfn "" |
|||
</lang> |
|||
{{out}} |
|||
<pre> |
|||
(20, 10)->(19, 9)->(18, 9)->(13, 4)->(6, 11)->(4, 11)->(1, 11) |
|||
(2, 10)->(5, 13)->(9, 9)->(15, 3)->(20, 8)->(20, 10)->(21, 11) |
|||
</pre> |
</pre> |