Golfscript Diagonal Array

11

Existe-t-il un moyen dans Golfscript de rassembler toutes les diagonales d'un tableau dans un seul tableau?

Par exemple, pour le tableau

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

revenir

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

(pas nécessairement dans cet ordre) et pour

["ABCD""EFGH""IJKL"]

revenir

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

(Pas nécessairement dans cet ordre). Supposons que les longueurs des tableaux soient identiques.

J'ai du mal à le comprendre. J'ai essayé de faire quelque chose avec =et d'itérer le (length+1)caractère des cordes, mais cela n'a pas fonctionné. Est-ce que quelqu'un peut m'aider?

J'aimerais la manière la plus courte de le faire, si possible.

Josiah Winslow
la source
Ce n'est pas votre site de questions / réponses habituel; vous devez avoir un critère gagnant. Je suggère un contenu de popularité pour les débutants.
Timtech
@Timtech je comprends. Je vais essayer stackexchange régulièrement.
Josiah Winslow
7
Les questions de conseils de golf spécifiques à la langue sont officiellement sur le sujet: meta.codegolf.stackexchange.com/a/1725/20260
xnor
5
@xnor Vous avez lié une mauvaise réponse là-bas. Celui-ci concerne les listes de conseils que nous avons. Mais demander des conseils spécifiques est également sur le sujet, donc ce serait bien si les gens pouvaient arrêter de voter et fermer le vote.
Martin Ender
7
@steveverrill Je ne suis pas d'accord pour que cela soit fait CW. Cela ne s'applique qu'aux questions de la liste (en fait, je ne suis même pas d'accord pour dire que celles-ci devraient être CW), mais il n'y a vraiment aucune raison pour que la question de conseil spécifique soit CW - ce sont essentiellement des concours de golf de micro-optimisation et les personnes qui répondent ils méritent le représentant pour cela (tout comme le demandeur, si la question est intéressante).
Martin Ender

Réponses:

8

Considérer

[
    "ABCD"
    "EFGH"
    "IJKL"
]

Pour obtenir la diagonale principale et les diagonales au-dessus, nous pouvons décaler le premier caractère de la deuxième ligne et les deux premiers de la troisième:

[
    "ABCD"
    "FGH"
    "KL"
]

Notez que toutes les colonnes correspondent à une diagonale, donc "zipper" le tableau (c'est-à-dire transposer des lignes et des colonnes) produira un tableau contenant les quatre diagonales susmentionnées:

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

Il nous manque encore les diagonales sous la diagonale principale.

Si nous compressons A lui-même et répétons le processus ci-dessus, nous obtiendrons un tableau contenant la diagonale principale et toutes les diagonales en dessous . Tout ce qui reste pour calculer l'union définie des deux tableaux.

Mettre tous ensemble:

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

Essayez-le en ligne.

Enfin, si nous n'avons besoin que des diagonales parce que nous recherchons une chaîne à l'intérieur (comme dans le casse - tête de recherche de mots , qui, je suppose, a inspiré cette question), une approche "moins propre" pourrait également convenir.

Vous pouvez utiliser

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

pour obtenir toutes les diagonales, plus quelques caractères de saut de ligne inutiles.

J'ai expliqué le processus en détail dans cette réponse .

Essayez-le en ligne.

Dennis
la source