Діагональний масив 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

@Timtech Я розумію. Я спробую регулярний stackexchange.
Джосія Уінслоу

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.

Спробуйте в Інтернеті.

Нарешті, якщо нам потрібні лише діагоналі, оскільки ми шукаємо рядок всередині них (як, наприклад, у головоломці Word Search , яка, напевно, надихнула на це питання), може бути також підходящим "менш чистий" підхід.

Можна використовувати

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

щоб отримати всі діагоналі, а також кілька непотрібних символів, що передаються в рядку.

Я детально пояснив процес у цій відповіді .

Спробуйте в Інтернеті.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.