#!/usr/bin/env node const stdin = process.openStdin(); let content = ''; Set.prototype.union = function(setB) { var union = new Set(this); for (var elem of setB) { union.add(elem); } return union; } function parseConnections(data) { let connections = {}; data.split("\n").forEach(line => { if (!line) { return; } let from, to; [from, to] = line.split(" <-> "); connections[from] = to.split(", "); }); return connections; } function getConnected(from, connections) { let todo = [from]; let connected = new Set(todo); for (let cur = 0; cur < todo.length; ++cur) { if (!connections[todo[cur]]) { continue; } connections[todo[cur]].forEach(n => { if (!connected.has(n)) { connected.add(n); todo.push(n); } }); } return connected; } stdin.addListener('data', d => { content += d.toString(); }); stdin.addListener('end', () => { let connections = parseConnections(content); let connected = getConnected("0", connections); console.log(connected.size); let groups = 1; for (let n in connections) { if (connected.has(n)) { continue; } connected = connected.union(getConnected(n, connections)); ++groups; } console.log(groups); });