Matriz Diagonal Golfscript

11

Existe uma maneira no Golfscript de trazer todas as diagonais de uma matriz em uma única matriz?

Por exemplo, para a matriz

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

Retorna

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

(não necessariamente nessa ordem) e para

["ABCD""EFGH""IJKL"]

Retorna

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

(Não necessariamente nesta ordem). Suponha que os comprimentos das matrizes sejam os mesmos.

Estou lutando para descobrir isso. Eu tentei fazer algo com =e iterando o (length+1)caráter th das strings, mas isso não funcionou. Alguém pode me ajudar?

Gostaria da maneira mais curta de fazer isso, se possível.

Josiah Winslow
fonte
Este não é o seu site comum de perguntas e respostas; você precisa ter um critério de vitória. Sugiro um conteúdo de popularidade para iniciantes.
Timtech
@ Timtech eu entendo. Vou tentar uma troca de pilha regular.
Josiah Winslow
7
Específicos do idioma perguntas conselhos golfe são oficialmente sobre o tema: meta.codegolf.stackexchange.com/a/1725/20260
xnor
5
@xnor Você vinculou a resposta errada lá. Essa é sobre as listas de dicas que temos. Mas pedir conselhos específicos também está no tópico, então seria bom se as pessoas parassem de votar e fechem a votação.
Martin Ender
7
@steveverrill Não concordo que estes devam ser feitos CW. Isso se aplica apenas às perguntas da lista (na verdade, eu nem concordo que elas devam ser CW), mas não há realmente nenhuma razão para uma pergunta de aconselhamento específica ser CW - elas são basicamente competições de golfe por micro-otimização e as pessoas que respondem eles merecem o representante por isso (assim como o solicitante, se a pergunta for interessante).
Martin Ender

Respostas:

8

Considerar

[
    "ABCD"
    "EFGH"
    "IJKL"
]

Para obter a diagonal principal e as diagonais acima dela, podemos mudar o primeiro caractere da segunda linha e os dois primeiros da terceira:

[
    "ABCD"
    "FGH"
    "KL"
]

Observe que todas as colunas correspondem a uma diagonal; portanto, "compactando" a matriz (isto é, transpondo linhas e colunas) produzirá uma matriz contendo as quatro diagonais mencionadas acima:

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

Ainda faltam as diagonais abaixo da diagonal principal.

Se fizermos o zip de A e repetirmos o processo acima, obteremos uma matriz contendo a diagonal principal e todas as diagonais abaixo dela. Tudo o que resta para calcular a união definida de ambas as matrizes.

Juntando tudo:

[.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.

Experimente online.

Por fim, se precisarmos apenas das diagonais porque estamos procurando uma string dentro delas (como no quebra-cabeça do Word Search , que suponho ter inspirado essa pergunta), uma abordagem "menos limpa" também pode ser adequada.

Você pode usar

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

para obter todas as diagonais, além de alguns caracteres desnecessários de avanço de linha.

Expliquei o processo em detalhes nesta resposta .

Experimente online.

Dennis
fonte