Golfscript Диагональный массив

11

Есть ли в Golfscript способ объединить все диагонали массива в один массив?

Например, для массива

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

возвращение

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

(не обязательно в таком порядке) и для

["ABCD""EFGH""IJKL"]

возвращение

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

(Необязательно в этом порядке). Предположим, длины массивов одинаковы.

Я борюсь с выяснением этого. Я пытался что-то делать с =итерациями по (length+1)строкам, но это не сработало. Кто-нибудь может мне помочь?

Я хотел бы самый короткий способ сделать это, если это возможно.

Джозия Уинслоу
источник
Это не ваш обычный сайт вопросов и ответов; вам нужно иметь критерий победы. Я предлагаю контент популярности для начинающих.
Timtech
@ Тимтех, я понимаю. Я попробую обычный стек-обмен.
Джозия Уинслоу
7
Официальные вопросы по гольфу для конкретных советов по теме: meta.codegolf.stackexchange.com/a/1725/20260
xnor
5
@xnor Вы связались с неправильным ответом. Это один из тех списков советов, которые у нас есть. Но просить конкретные советы также по теме, поэтому было бы неплохо, если бы люди прекратили голосовать и закрыли голосование.
Мартин Эндер
7
@ Steveverrill Я не согласен, что они должны быть сделаны CW. Это относится только к списочным вопросам (на самом деле, я даже не согласен с тем, что это должны быть CW), но на самом деле нет никаких оснований для того, чтобы конкретный вопрос о совете был CW - это в основном соревнования по мини-оптимизации в гольфе, и люди, отвечающие на вопросы они заслуживают повторения за него (как и спрашивающий, если вопрос интересен).
Мартин Эндер

Ответы:

8

Рассматривать

[
    "ABCD"
    "EFGH"
    "IJKL"
]

Чтобы получить основную диагональ и диагонали над ней, мы можем сместить первый символ второго ряда и первые два третьего:

[
    "ABCD"
    "FGH"
    "KL"
]

Обратите внимание, что все столбцы соответствуют диагонали, поэтому «сжатие» массива (т. Е. Транспонирование строк и столбцов) приведет к массиву, содержащему вышеупомянутые четыре диагонали:

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

Нам все еще не хватает диагоналей ниже основной диагонали.

Если мы застегнем A на себя и повторим описанный выше процесс, мы получим массив, содержащий основную диагональ и все диагонали под ней. Все, что осталось, это вычислить объединение множеств обоих массивов.

Собираем все вместе:

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

Попробуйте онлайн.

Наконец, если нам нужны только диагонали, потому что мы ищем строку внутри них (как в « Головоломке поиска слов» , которая, как я полагаю, вдохновила этот вопрос), «менее чистый» подход также может быть подходящим.

Ты можешь использовать

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

чтобы получить все диагонали, а также некоторые ненужные символы перевода строки.

Я объяснил процесс подробно в этом ответе .

Попробуйте онлайн.

Деннис
источник