En este problema tenemos un mapa bidimensional, es decir una simulación de un espacio de dos dimensiones.
Lo que hay que hacer es encontrar los números que se encuentren adyacentes a los símbolos y sumar esos números.
Para este problema no vi necesario declarar una función input, debido a que no necesité formatear el texto, decidí iterar caracter por caracter en búsqueda de símbolos y con un poco de matematica determinar la ubicación de los vecinos de los símbolos.
Con el array “adjacents” iteraré en cada simbolo encontrado para buscar números vecinos.
Intentaré explicarlo con una imagen de bajo presupuesto que hice:
Cuando encontramos un simbolo en un index del string dado, es facil saber el caracter a la izquierda está mas cerca del inicio por lo que es el mismo “index - 1”, el caracter de la derecha está mas lejos del inicio por lo que sería “index + 1”, el vecino de arriba está una fila mas arriba, cada fila contiene una cantidad de caracteres (ancho), por lo que el caracter de arriba sería “index - ancho”, a la inversa el caracter de abajo sería “index + ancho”. Es importante tomar en cuenta que el mapa contiene saltos de línea (\n), por lo que cuenta también como un caracter.
La esquina superior izquierda se puede calcular como “index - ancho - 1”, la esquina superior derecha sería “index - ancho + 1”, la esquina inferior izquierda sería “index + ancho - 1” y la esquina inferior derecha sería “index + ancho + 1”.
Por este motivo, la variable local down la declaré como la cantidad de caracteres en la primera fila (ancho), aprovechando que el mapa tiene un ancho fijo.
Ahora si a iterar por cada caracter.
La idea principal en getSumOfParts es encontrar cada dígito vecino al símbolo, luego, una vez encontrado un dígito debemos expandir a la izquierda y derecha para descubrir el número entero.
Otro ejemplo de bajo presupuesto:
Parte 2
En la segunda parte nos piden hacer algo similar, pero con diferentes condiciones, buscar solo en los símbolos “*” que tengan exactamente 2 números.
Por lo que nos sirve casi todo el código que ya tenemos, solo vamos a agregar estas condiciones, modificando el getSumOfParts quedaría así.