El código funciona bien, es simplemente feo mirarlo, especialmente porque en mi caso tengo que hacer eso no solo anterior y siguiente, sino 3 superior, 3 inferior en una lista 2d, por lo que se vuelve bastante detallado. ¿Hay una forma más corta de hacer esto, tal vez usando "eso"?
val nums = mutableListOf("0", "X", "0", "X", "0") for (num in 0 until nums.size) { if (nums[num] == "X") { var a = nums[num - 1] if ( nums[num - 1] != "X") nums[num - 1] = (nums[num - 1].toInt() + 1).toString() if ( nums[num + 1] != "X") nums[num + 1] = (nums[num + 1].toInt() + 1).toString() } }En lugar de buscar "X" y aumentar los valores a su alrededor, puede buscar números y modificarlos según los valores que los rodean. De esta manera, puede hacer uso de las funciones Iterable<T>.map o Iterable<T>.mapIndexed .
Para cada elemento, solo tiene que mirar la cantidad de valores que lo surrounding , tanto antes como después del elemento. Una forma de hacerlo es usar List<out E>.subList(fromIndex: Int, toIndex: Int) . Por lo que entendí, el valor debe aumentarse por cada "X" que se encuentre en esa sublista.
Combinando esto, puede terminar con algo como:
fun increase(numbers: List<String>, surrounding: Int): List<String> { return numbers.mapIndexed { index, value -> val intValue = value.toIntOrNull() ?: return@mapIndexed value val lowerSublistBound = (index - surrounding).coerceAtLeast(0) val upperSublistBound = (index + surrounding + 1).coerceAtMost(numbers.size) val increaseBy = numbers.subList(lowerSublistBound, upperSublistBound).count { it == "X" } "${intValue + increaseBy}" } }No es más corto en sí, pero funciona con una cantidad arbitraria de valores circundantes, en lugar de una codificación rígida para recuperar los n elementos anteriores y posteriores.
Usando esto, arroja los siguientes resultados:
fun main() { val baseNumbers = listOf("X", "X", "0", "1", "X", "2", "X") println(increase(baseNumbers, 0) == baseNumbers) println(increase(baseNumbers, 1) == listOf("X", "X", "1", "2", "X", "4", "X")) println(increase(baseNumbers, 2) == listOf("X", "X", "3", "3", "X", "4", "X")) println(increase(baseNumbers, 3) == listOf("X", "X", "3", "5", "X", "4", "X")) println(increase(baseNumbers, 4) == listOf("X", "X", "4", "5", "X", "5", "X")) println(increase(baseNumbers, 5) == listOf("X", "X", "4", "5", "X", "6", "X"))}