Matriz Diagonal Golfscript

11

¿Hay alguna forma en Golfscript para reunir todas las diagonales de una matriz en una sola matriz?

Por ejemplo, para la matriz

[[1 2 3][4 5 6][7 8 9]]

regreso

[[7][4 8][1 5 9][2 6][3]]

(no necesariamente en ese orden) y para

["ABCD""EFGH""IJKL"]

regreso

["I""EJ""AFK""BGL""CH""D"]

(No necesariamente en ese orden). Suponga que las longitudes de las matrices son las mismas.

Estoy luchando para resolverlo. Intenté hacer algo =e iterar a través del (length+1)carácter th de las cadenas, pero eso no funcionó. ¿Alguien me puede ayudar?

Me gustaría la forma más corta de hacer esto, si es posible.

Josiah Winslow
fuente
Este no es su sitio habitual de preguntas y respuestas; Necesitas tener un criterio ganador. Sugiero un contenido de popularidad para empezar.
Timtech
@Timtech entiendo. Intentaré el stackexchange regular.
Josiah Winslow
77
Las preguntas de asesoramiento de golf específicas del idioma son oficialmente sobre el tema: meta.codegolf.stackexchange.com/a/1725/20260
xnor
55
@xnor Has vinculado a una respuesta incorrecta allí. Esa es sobre esas listas de consejos que tenemos. Pero pedir un consejo específico también es un tema, por lo que sería bueno que la gente dejara de votar y cerrar esta votación.
Martin Ender
77
@steveverrill No estoy de acuerdo en que estos deben hacerse CW. Que sólo se aplica a las preguntas de la lista (de hecho, ni siquiera de acuerdo en que los debe haber CW), pero no hay realmente ninguna razón para la pregunta asesoramiento específico a ser CW - que son básicamente concursos de golf micro-optimización, y las personas que responden ellos merecen el representante (al igual que el que pregunta, si la pregunta es interesante).
Martin Ender

Respuestas:

8

Considerar

[
    "ABCD"
    "EFGH"
    "IJKL"
]

Para obtener la diagonal principal y las diagonales por encima, podemos desplazar el primer carácter de la segunda fila y los dos primeros de la tercera:

[
    "ABCD"
    "FGH"
    "KL"
]

Tenga en cuenta que todas las columnas corresponden a una diagonal, por lo que "comprimir" la matriz (es decir, transponer filas y columnas) producirá una matriz que contiene las cuatro diagonales mencionadas anteriormente:

[
    "AFK"
    "BGL"
    "CH"
    "D"
]

Todavía nos faltan las diagonales debajo de la diagonal principal.

Si comprimimos A y repetimos el proceso anterior, obtendremos una matriz que contiene la diagonal principal y todas las diagonales debajo de ella. Todo lo que queda para calcular la unión establecida de ambas matrices.

Poniendolo todo junto:

[.zip]{:A,,{.A=>}%zip}/|


[.zip]{              }/  # For the original array and it's transpose, do the following:
       :A                # Store the array in A.
         ,,{    }%       # For each I in [ 0 1 ... len(A) ], do the following:
            .A=>         # Push A[I] and shift out its first I characters.
                  zip    # Transpose the resulting array.
                       | # Perform set union.

Pruébalo en línea.

Finalmente, si solo necesitamos las diagonales porque estamos buscando una cadena dentro de ellas (como en el Word Search Puzzle , que supongo que inspiró esta pregunta), un enfoque "menos limpio" también podría ser adecuado.

Puedes usar

..,n**\.0=,\,+)/zip

para obtener todas las diagonales, además de algunos caracteres innecesarios de salto de línea.

He explicado el proceso en detalle en esta respuesta .

Pruébalo en línea.

Dennis
fuente