# HG changeset patch # User Jordi GutiƩrrez Hermoso # Date 1513117268 18000 # Node ID 13f69301183f817bef150dbd90eca9bec5ed0c30 # Parent a991288f3d5578042687926f1cd8f9475b806688 day 12 diff --git a/2017/day12.d b/2017/day12.d new file mode 100644 --- /dev/null +++ b/2017/day12.d @@ -0,0 +1,42 @@ +import std.stdio; +import std.regex: regex, matchFirst; +import std.conv: to; +import std.string: split; +import std.algorithm: sort, map, setDifference; +import std.array: array; + +static nodeRegex = regex(r"(?P\d+) <-> (?P.*)"); + +auto buildGraph(T)(T lines) { + int[][int] graph; + foreach(line; lines) { + auto row = matchFirst(line, nodeRegex); + graph[to!int(row["src"])] = row["dests"].split(", ").map!(to!int).array; + } + return graph; +} + +bool[int] dfsFindNodes(int[][int] graph, int start, bool[int] seen = null) { + seen[start] = true; + foreach(node; graph[start]) { + if (node !in seen) { + seen[node] = true; + seen = dfsFindNodes(graph, node, seen); + } + } + return seen; +} + +void main(string[] args) { + auto graph = buildGraph(File(args[1]).byLine); + auto seen = dfsFindNodes(graph, 0); + writeln(seen.keys.length); + auto unseen = setDifference(sort(graph.keys), sort(seen.keys)).array; + auto numcomponents = 1; + while (unseen) { + numcomponents++; + seen = dfsFindNodes(graph, unseen[0], seen); + unseen = setDifference(unseen, sort(seen.keys)).array; + } + writeln(numcomponents); +}