Matrice diagonale Golfscript


11

C'è un modo in Golfscript per portare tutte le diagonali di un array in un singolo array?

Ad esempio, per l'array

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

ritorno

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

(non necessariamente in quell'ordine) e per

["ABCD""EFGH""IJKL"]

ritorno

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

(Non necessariamente in questo ordine). Supponiamo che le lunghezze degli array siano uguali.

Sto lottando per capirlo. Ho provato a fare qualcosa con l' =iterazione attraverso il (length+1)th personaggio delle stringhe, ma non ha funzionato. Qualcuno può aiutarmi?

Vorrei il modo più breve per farlo, se possibile.


Questo non è il tuo normale sito di domande e risposte; devi avere un criterio vincente. Suggerisco un contenuto di popolarità per i principianti.
Timtech,

@Timtech ho capito. Proverò stackexchange regolare.
Josiah Winslow,

7
Le domande relative ai consigli sul golf specifici della lingua sono ufficialmente in tema: meta.codegolf.stackexchange.com/a/1725/20260
xnor

5
@xnor Hai collegato una risposta errata lì. Quello riguarda gli elenchi di suggerimenti che abbiamo. Ma chiedere consigli specifici è anche sull'argomento, quindi sarebbe bello se le persone potessero smettere di votare e votare a fondo.
Martin Ender,

7
@steveverrill Non sono d'accordo sul fatto che questi dovrebbero essere fatti in CW. Ciò vale solo per le domande della lista (in realtà, non ho nemmeno d'accordo che chi dovrebbe essere CW), ma non c'è davvero alcun motivo per una consulenza specifica domanda di essere CW - sono fondamentalmente micro-ottimizzazione gare di golf, e la gente risponde se lo meritano il rappresentante (come fa il richiedente, se la domanda è interessante).
Martin Ender,

Risposte:


8

Ritenere

[
    "ABCD"
    "EFGH"
    "IJKL"
]

Per ottenere la diagonale principale e le diagonali sopra di essa, possiamo spostare il primo carattere della seconda riga e i primi due della terza:

[
    "ABCD"
    "FGH"
    "KL"
]

Si noti che tutte le colonne corrispondono a una diagonale, quindi "zippare" l'array (ovvero trasporre righe e colonne) produrrà un array contenente le quattro diagonali di cui sopra:

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

Ci mancano ancora le diagonali sotto la diagonale principale.

Se comprimiamo A stesso e ripetiamo il processo sopra, otterremo un array contenente la diagonale principale e tutte le diagonali sottostanti . Tutto ciò che è rimasto per calcolare l'unione impostata di entrambi gli array.

Mettere tutto insieme:

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

Provalo online.

Infine, se abbiamo solo bisogno delle diagonali perché stiamo cercando una stringa al loro interno (come nel Word Search Puzzle , che presumo abbia ispirato questa domanda), potrebbe anche essere adatto un approccio "meno pulito".

Puoi usare

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

per ottenere tutte le diagonali, oltre ad alcuni caratteri di avanzamento riga non necessari.

Ho spiegato il processo in dettaglio in questa risposta .

Provalo online.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.