Düşünmek
[
"ABCD"
"EFGH"
"IJKL"
]
Ana diyagonal ve üstündeki diyagonalleri elde etmek için ikinci sıranın ilk karakterini ve üçüncüsünün ilk ikisini değiştirebiliriz:
[
"ABCD"
"FGH"
"KL"
]
Tüm sütunların bir diyagonale karşılık geldiğine dikkat edin, bu nedenle diziyi "sıkıştırmak" (yani, satırları ve sütunları transpoze etmek) yukarıda belirtilen dört diyagonal içeren bir dizi verecektir:
[
"AFK"
"BGL"
"CH"
"D"
]
Ana köşegen altındaki köşegenleri hala kaçırıyoruz.
A'nın kendisini sıkıştırır ve yukarıdaki işlemi tekrarlarsak, ana diyagonal ve altındaki tüm diyagonalleri içeren bir dizi elde ederiz . Her iki dizinin de birliğini hesaplamak için geriye kalan tek şey.
Hepsini bir araya koy:
[.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.
Çevrimiçi deneyin.
Son olarak, yalnızca diyagonallere ihtiyacımız varsa, çünkü onların içinde bir dize arıyoruz ( bu sorudan ilham aldığımı düşündüğüm Word Search Puzzle'da olduğu gibi), "daha az temiz" bir yaklaşım da uygun olabilir.
Kullanabilirsiniz
..,n**\.0=,\,+)/zip
Tüm köşegenleri ve ayrıca bazı gereksiz satır besleme karakterlerini elde etmek için.
Bu cevapta süreci ayrıntılı olarak açıkladım .
Çevrimiçi deneyin.