Golfscript Diagonal Array

11

Czy w Golfscript jest sposób na połączenie wszystkich przekątnych tablicy w jedną tablicę?

Na przykład dla tablicy

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

powrót

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

(niekoniecznie w tej kolejności) i dla

["ABCD""EFGH""IJKL"]

powrót

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

(niekoniecznie w tej kolejności). Załóżmy, że długości tablic są takie same.

Mam trudności z rozgryzieniem tego. Próbowałem coś zrobić z =iteracją (length+1)ciągów znaków, ale to nie zadziałało. Czy ktoś może mi pomóc?

Jeśli to możliwe, chciałbym to zrobić najkrótszym sposobem.

Josiah Winslow
źródło
To nie jest twoja zwykła strona z pytaniami i odpowiedziami; musisz mieć kryterium wygranej. Sugeruję popularność treści na początek.
Timtech
@Timtech Rozumiem. Spróbuję regularnej wymiany stosów.
Josiah Winslow,
7
Pytania dotyczące golfa dotyczące konkretnych języków są oficjalnie na ten temat: meta.codegolf.stackexchange.com/a/1725/20260
xnor
5
@ xnor Podałeś tam błędną odpowiedź. To dotyczy tych list wskazówek, które mamy. Ale prośba o konkretną radę jest również na ten temat, więc byłoby miło, gdyby ludzie mogli przestać głosować i zamknąć to.
Martin Ender
7
@steveverrill Nie zgadzam się, że powinny być wykonane CW. Że odnosi się tylko do pytań lista (w rzeczywistości, nawet nie zgadzają się, że te powinny być CW), ale naprawdę nie ma powodu, dla sprawdzenia szczegółowych zaleceń dotyczących kwestii być CW - są to w zasadzie mikro optymalizacji konkursy golfa, a lud odpowiadając zasługują na to za powtórzenie (podobnie jak pytający, jeśli pytanie jest interesujące).
Martin Ender

Odpowiedzi:

8

Rozważać

[
    "ABCD"
    "EFGH"
    "IJKL"
]

Aby uzyskać główną przekątną i przekątne nad nią, możemy przesunąć pierwszy znak drugiego rzędu i pierwsze dwa trzeciego:

[
    "ABCD"
    "FGH"
    "KL"
]

Zauważ, że wszystkie kolumny odpowiadają przekątnej, więc „skompresowanie” tablicy (tj. Transpozycja wierszy i kolumn) da tablicę zawierającą wyżej wymienione cztery przekątne:

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

Nadal brakuje przekątnych poniżej głównej przekątnej.

Jeśli skompresujemy sam A i powtórzymy powyższy proces, otrzymamy tablicę zawierającą główną przekątną i wszystkie przekątne poniżej . Wszystko, co pozostało, to obliczyć ustawione połączenie obu tablic.

Kładąc wszystko razem:

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

Wypróbuj online.

Wreszcie, jeśli potrzebujemy tylko przekątnych, ponieważ szukamy w nich łańcucha (jak w Puzzle wyszukiwania słowa , która, jak zakładam, zainspirowała to pytanie), odpowiednie może być również podejście „mniej czyste”.

Możesz użyć

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

aby uzyskać wszystkie przekątne oraz niepotrzebne znaki linii.

Szczegółowo wyjaśniłem ten proces w tej odpowiedzi .

Wypróbuj online.

Dennis
źródło