Golfscript Diagonal Array

11

Gibt es in Golfscript eine Möglichkeit, alle Diagonalen eines Arrays in einem einzigen Array zusammenzufassen?

Zum Beispiel für das Array

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

Rückkehr

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

(nicht unbedingt in dieser Reihenfolge) und für

["ABCD""EFGH""IJKL"]

Rückkehr

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

(nicht unbedingt in dieser Reihenfolge). Angenommen, die Längen der Arrays sind gleich.

Ich habe Probleme damit, es herauszufinden. Ich habe versucht, etwas mit =dem (length+1)th-Zeichen der Saiten zu tun und es zu durchlaufen , aber das hat nicht funktioniert. Kann mir jemand helfen?

Ich würde gerne den kürzesten Weg dazu finden, wenn möglich.

Josiah Winslow
quelle
Dies ist nicht Ihre reguläre Q & A-Site. Sie müssen ein Gewinnkriterium haben. Ich schlage für den Anfang einen Beliebtheitsgehalt vor.
Timtech
@ Timtech Ich verstehe. Ich werde versuchen, regelmäßig Stapel auszutauschen.
Josiah Winslow
7
Sprachspezifische Golfberatungsfragen
xnor
5
@xnor Du hast dort auf falsche Antwort verlinkt. In diesem Fall geht es um die Tippslisten, die wir haben. Aber auch um konkrete Ratschläge zu bitten, ist ein Thema. Es wäre also schön, wenn die Leute aufhören könnten, ihre Stimme abzustimmen und dies zu beenden.
Martin Ender
7
@steveverrill Ich stimme nicht zu, dass diese CW gemacht werden sollten. Das gilt nur für die Liste Fragen (in der Tat, ich bin nicht einverstanden , auch , dass diejenigen , CW sein sollen), aber es gibt wirklich keinen Grund für spezifische Beratung Frage CW zu sein - sie sind im Grunde Mikro-Optimierung Golf - Wettbewerbe, und die Leute , die Beantwortung Sie verdienen den Repräsentanten dafür (ebenso wie der Fragesteller, wenn die Frage interessant ist).
Martin Ender

Antworten:

8

Erwägen

[
    "ABCD"
    "EFGH"
    "IJKL"
]

Um die Hauptdiagonale und die darüber liegenden Diagonalen zu erhalten, können wir das erste Zeichen der zweiten Reihe und die ersten beiden der dritten Reihe verschieben:

[
    "ABCD"
    "FGH"
    "KL"
]

Beachten Sie, dass alle Spalten einer Diagonale entsprechen. Wenn Sie also das Array "zippen" (dh Zeilen und Spalten transponieren), erhalten Sie ein Array mit den oben genannten vier Diagonalen:

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

Wir vermissen immer noch die Diagonalen unterhalb der Hauptdiagonale.

Wenn wir A selbst komprimieren und den obigen Vorgang wiederholen, erhalten wir ein Array, das die Hauptdiagonale und alle darunter liegenden Diagonalen enthält . Alles, was übrig bleibt, um die Mengenvereinigung beider Arrays zu berechnen.

Alles zusammen:

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

Probieren Sie es online aus.

Wenn wir nur die Diagonalen benötigen, weil wir nach einer Zeichenfolge in ihnen suchen (wie im Wortsuchrätsel , von dem ich annehme , dass es diese Frage inspiriert hat), ist möglicherweise auch ein "weniger sauberer" Ansatz geeignet.

Sie können verwenden

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

um alle Diagonalen sowie einige unnötige Zeilenvorschubzeichen zu erhalten.

Ich habe den Prozess in dieser Antwort ausführlich erklärt .

Probieren Sie es online aus.

Dennis
quelle