Tuve este problema de programación que estoy tratando de resolver y como se me está acabando la paciencia, en lugar de codificar el script para que siga un algoritmo (que no pude codificar perfectamente), recurrí a resolverlo usando el patrón I ver en el problema.
Funciona, no me malinterpreten, pero me pregunto si generalmente está bien resolver un problema (que creo que tiene la intención de entrenar su cerebro para crear un algoritmo general a partir de una serie de patrones) con una solución que se deriva de cómo funciona el patrón.
Y el patrón que vi es que ya que el patrón de cómo se hace la espiral es este:
N (1s to the right) N-1 (1s downwards) N-1 (1s to the right) N-3 (1s upwards) N-3 (1s to the left) .. and so on and so forth.Hasta que sea el segundo nx donde la diferencia es 2, o el último nx donde la diferencia es 1, sigo imprimiendo 1 según el patrón anterior en la dirección en la que también estoy haciendo un bucle.
Lo resolví hasta el intento y es capaz de enviar, pero sentí que hice trampa en el problema.
No estoy pidiendo el mejor algoritmo para el problema, sino sus pensamientos sobre cómo resolví este problema. ¿Era una buena alternativa? Mientras funcione, ¿es un algoritmo?
No sé dónde más puedo hacer esta pregunta y esto es un poco amplio, pero espero poder obtener algunas ideas aquí. Gracias.
(JavaScript agregado ya que hice mi solución allí y la que tengo más experiencia)
function spiralize (n) { var output = Array(n).fill(0).map(_ => Array(n).fill(0)); var i = 0, j = -1, max = n; while(true) { if([[0,1], [1,0], [0,-1], [-1, 0]].find(([x, y], index) => { [output, i, j, max] = traverseArray(output, i, j, max, x, y, n); if((index % 2 == 0 && max == 2) || (index % 2 == 1 && max == 1)) return true; })) return output; } } function traverseArray(output, i, j, max, iter1, iter2, n) { iter1 ? max == n ? max-- : max -= 2 : max; temp = max; while(temp-- > 0) output[i += iter1][j += iter2] = 1; return [output, i, j, max]; }El diseño de algoritmos, y en gran medida las matemáticas generales, es el arte de encontrar patrones y regularidades. Esto le permite crear soluciones automatizadas generadas por cálculos en lugar de datos explícitos y exhaustivos.
No hay "moralidad" en la programación: si funciona y funciona bien, no hay razón para rechazar una forma de codificar. (A menos que necesite ser entendido por otros).
Si tuviera que programar esto, y suponiendo que se permite almacenar toda la matriz, probablemente dejaría que la espiral funcionara por sí sola: comenzando horizontalmente desde la esquina superior izquierda, rellene con O, hasta que se alcance el borde o un cero. (si es cero, retroceda una posición). Luego gire a la derecha un cuarto de vuelta. En algún momento, no son posibles más movimientos. El patrón se puede resumir como "avanzar hasta chocar con una pared y girar a la derecha".
Probablemente también extendería la matriz y llenaría el contorno con ceros, para que no tenga que distinguir entre golpear el borde o ver un cero.