Array Golfscript Diagonal

11

Apakah ada cara di Golfscript untuk membawa semua diagonal array menjadi satu array?

Misalnya, untuk array

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

kembali

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

(tidak harus dalam urutan itu) dan untuk

["ABCD""EFGH""IJKL"]

kembali

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

(tidak harus dalam urutan itu). Asumsikan panjang array adalah sama.

Saya berjuang dengan mencari tahu. Saya mencoba melakukan sesuatu dengan =dan mengulangi (length+1)karakter th string, tetapi itu tidak berhasil. Adakah yang bisa membantu saya?

Saya ingin cara terpendek untuk melakukan ini, jika memungkinkan.

Josiah Winslow
sumber
Ini bukan situs T&J reguler Anda; Anda harus memiliki kriteria kemenangan. Saya menyarankan konten popularitas untuk pemula.
Timtech
@Timtech saya mengerti. Saya akan mencoba stackexchange biasa.
Josiah Winslow
7
Bahasa-spesifik pertanyaan saran golf resmi on-topik: meta.codegolf.stackexchange.com/a/1725/20260
xnor
5
@ xnor Anda ditautkan ke jawaban yang salah di sana. Itu tentang daftar tips yang kami miliki. Tetapi meminta saran khusus juga pada topik sehingga akan lebih baik jika orang bisa berhenti downvoting dan menutup voting ini.
Martin Ender
7
@steveverrill Saya tidak setuju bahwa ini harus dibuat CW. Itu hanya berlaku untuk pertanyaan daftar (pada kenyataannya, saya bahkan tidak setuju bahwa itu harus CW), tetapi benar-benar tidak ada alasan untuk pertanyaan saran khusus untuk menjadi CW - mereka pada dasarnya kontes golf optimasi mikro, dan orang-orang yang menjawab mereka memang pantas mendapatkan perwakilan untuk itu (seperti halnya penanya, jika pertanyaannya menarik).
Martin Ender

Jawaban:

8

Mempertimbangkan

[
    "ABCD"
    "EFGH"
    "IJKL"
]

Untuk mendapatkan diagonal utama dan diagonal di atasnya, kita dapat menggeser karakter pertama dari baris kedua dan dua yang pertama dari baris ketiga:

[
    "ABCD"
    "FGH"
    "KL"
]

Perhatikan bahwa semua kolom sesuai dengan diagonal, jadi "zipping" array (yaitu, transposing baris dan kolom) akan menghasilkan array yang berisi empat diagonal yang disebutkan di atas:

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

Kami masih kehilangan diagonal di bawah diagonal utama.

Jika kita membuka zip sendiri dan mengulangi proses di atas, kita akan mendapatkan array yang berisi diagonal utama dan semua diagonal di bawahnya. Semua yang tersisa untuk menghitung gabungan set dari kedua array.

Menyatukan semuanya:

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

Cobalah online.

Akhirnya, jika kita hanya perlu diagonal karena kita sedang mencari string di dalamnya (seperti dalam Puzzle Pencarian Kata , yang saya asumsikan mengilhami pertanyaan ini), pendekatan "kurang bersih" mungkin juga cocok.

Kamu bisa menggunakan

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

untuk mendapatkan semua diagonal, ditambah beberapa karakter linefeed yang tidak perlu.

Saya telah menjelaskan proses secara terperinci dalam jawaban ini .

Cobalah online.

Dennis
sumber