graph = {
const rows = input.trim().split("\n").map(s => s.trim().split(""));
const nodes = {};
const edges = {};
function getId(y, x) {
return `${x},${y},${rows[y][x].toLowerCase()}`;
}
function addEdge(sourceId, y, x) {
if (rows[y][x]) {
const targetId = getId(y, x);
edges[sourceId].push(targetId);
}
}
for (let y = 0; y < rows.length; y ++) {
const row = rows[y];
for (let x = 0; x < row.length; x ++) {
const value = row[x].toLowerCase();
const id = getId(y, x);
nodes[id] = value;
if (!edges[id]) {
edges[id] = [];
}
if (x > 0) {
addEdge(id, y, x - 1);
if (y > 0) {
addEdge(id, y - 1, x - 1);
}
if (y < rows.length - 1) {
addEdge(id, y + 1, x - 1);
}
}
if (x < row.length - 1) {
addEdge(id, y, x + 1);
if (y > 0) {
addEdge(id, y - 1, x + 1);
}
if (y < rows.length - 1) {
addEdge(id, y + 1, x + 1);
}
}
if (y > 0) {
addEdge(id, y - 1, x);
}
if (y < rows.length - 1) {
addEdge(id, y + 1, x)
}
}
}
return { nodes, edges };
}