Golfscript Çapraz Dizi


11

Golfscript'te bir dizinin tüm köşegenlerini tek bir diziye getirmenin bir yolu var mı?

Örneğin, dizi için

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

dönüş

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

(bu sırada olması gerekmez) ve

["ABCD""EFGH""IJKL"]

dönüş

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

(bu sırada olması gerekmez). Dizilerin uzunluklarının aynı olduğunu varsayalım.

Bunu anlamakta zorlanıyorum. Dizelerle karakter arasında bir şey yapmayı =ve yinelemeyi denedim (length+1), ama bu işe yaramadı. Birisi bana yardım edebilir mi?

Mümkünse bunu yapmanın en kısa yolunu istiyorum.


Bu sizin normal soru-cevap siteniz değil; kazanan bir kritere sahip olmanız gerekir. Yeni başlayanlar için popüler bir içerik öneriyorum.
Timtech

@Timtech anlıyorum. Düzenli yığın değiş tokuşunu deneyeceğim.
Josiah Winslow

7
Dile özgü golf danışma soruları resmi olarak konuyla ilgilidir: meta.codegolf.stackexchange.com/a/1725/20260
xnor

5
@xnor Orada yanlış cevaba bağladınız. Bu, sahip olduğumuz ipucu listeleriyle ilgili. Ancak belirli bir tavsiye istemek de konuyla ilgili olduğundan, insanların oylamayı durdurabilmeleri ve oy vermeyi kapatmaları güzel olurdu.
Martin Ender

7
@steveverrill Bunların CW yapılması gerektiğine katılmıyorum. Bu sadece (aslında, ben bile kabul etmiyoruz liste sorulara geçerlidir olanlar onlar temelde mikro optimizasyon golf yarışmalar ve insanlar yanıtlayan - CW olmalıdır), ancak CW olmaya belirli tavsiye soru için hiçbir neden orada gerçekten Temsilciyi bunun için hak ediyorlar (soru ilginçse asker de öyle).
Martin Ender

Yanıtlar:


8

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.