Bir matristeki her satırı ve sütunu döndürme


15

Meydan okuma

İle bir n x ntamsayılar matrisi verilirn >= 2

1 2
3 4

ve tam 2nöğeler içeren tam sayıların bir listesi

[1,2, -3, -1]

döndürülmüş matrisi çıkarır. Bu matris aşağıdaki şekilde yapılandırılmıştır:

  • Listedeki ilk tamsayıyı alın ve ilk satırı bu değerle sağa döndürün.
  • Bir sonraki tamsayıyı alın ve ilk sütunu bu değere göre aşağı döndürün.
  • Sonraki tamsayıyı alın ve matrisin her satırını ve sütununu bir kez döndürene kadar ikinci satırı bu değer vb. Sağa döndürün.

Liste negatif tamsayıları içerebilir, yani satır / sütunu sağ / aşağı yerine sola / yukarı kaydırırsınız. Tam sayı sıfırsa, satırı / sütunu döndürmeyin.

Yukarıdaki girişi kullanan örnek

Liste öğesi Matris Açıklaması
-------------------------------------------------- ----------
1 2 1 1. satırı sağa 1 döndür
                   3 4

2 2 1 1. sütunu 2 aşağı döndür
                   3 4

-3 2 1 2. sırayı 3 sola döndür
                   4 3

-1 2 3 2. sütunu 1 yukarı döndür
                   4 1

kurallar

  • En uygun giriş biçimini seçebilirsiniz. Hangisini kullandığınızı açıkça belirtin.
  • İşlev veya tam programa izin verilir.
  • Giriş / çıkış için varsayılan kurallar .
  • Standart boşluklar geçerlidir.
  • Bu , bu yüzden en düşük bayt sayısı kazanır. Tiebreaker daha erken sunuluyor.

Test senaryoları

Buradaki girdi biçimi, matris için bir liste ve tamsayılar için normal bir listedir.

[[1,2], [3,4]], [1,2, -3, -1] -> [[2,3], [4,1]]
[[1,2], [3,4]], [1,1,1,1] -> [[3,2], [4,1]]
[[1,2], [3,4]], [0,0,0,0] -> [[1,2], [3,4]]
[[1,2, -3], [- 4,5,6], [7, -8,0]], [1, -2,0, -1,3,4] -> [[7, 5,0], [- 3 -8,2], [- 4,1,6]]
[[1,2, -3], [- 4,5,6], [7, -8,0]], [3,12, -3,0, -6, -3] -> [[1 , 2, -3], [- 4,5,6], [7 -8,0]]

Mutlu Kodlama!


mapcar yardımcı olmalı…
msh210

Yanıtlar:


6

CJam, 13 bayt

{{a.m>1m<z}/}

Matrisi ve yığının üstündeki listeyi (bu sırayla) alan ve yeni matrisi yerinde bırakan adsız bir blok (işlev).

Tüm test senaryolarını çalıştırın.

Aynı fikir, aynı bayt sayısı, farklı uygulamalar:

{{\(@m>a+z}/}
{{(Im>a+z}fI}
{{:\Im>]z}fI}

açıklama

İdeal olarak, listedeki her komutu aynı şekilde ele almak ve sadece matrisin ilk satırını döndürmek için kullanmak istiyoruz. Bu, her komuttan sonra matrisi biraz dönüştürerek ve tüm bu ekstra dönüşümlerin sonunda iptal edildiğinden emin olarak kolayca yapılabilir. Bu nedenle, her bir komutu işledikten sonra, tüm satırları bir yukarı döndürürüz (aynı boyuttaki bir sonraki talimat bir sonraki satırı işleyecek şekilde) ve sonra matrisi, sonraki sütunları işleyeceğimiz şekilde dönüştürürüz. Bu ek dönüşümler listedeki talimatlarla dikeydir ve tam da 2nihtiyacımız olan tam bir süreye sahiptir .

Kod gelince:

{      e# For each instruction...
  a    e#   Wrap it in a singleton array.
  .m>  e#   Combine it element-wise with the matrix to rotate right. This is
       e#   a fairly common idiom to apply a binary operation only to the first
       e#   element of an array, since element-wise operations just retain all the
       e#   unpaired elements of the longer array.
  1m<  e#   Rotate the rows one up.
  z    e#   Transpose.
}/

4

APL (Genişletilmiş Dyalog) , 17 15 14 13 bayt

Adám tarafından -3 bayt

(⍉1⊖⌽`@1⍢⌽)/⌽

Çevrimiçi deneyin!

İlk elemanın matris olduğu ve geri kalan elemanların rotasyon miktarları olduğu bir liste olarak girdiyi alır. Left sol yerine sağa döndürülürse CJam'i yener.

(⍉1⊖⌽@1 1⍢⌽)/⌽    Monadic train:
(⍉1⊖⌽@1 1⍢⌽)      Helper function to rotate and transpose once.
                        Takes args  (amount to rotate) and  (current array)
                      Function to rotate left
        1 1             2-element vector containing 1.
                        The second 1 is redundant, but saves 1 byte over (,1).
     ⌽@1 1             Function to rotate the 1st row left by ⍺.
     ⌽@1 1⍢⌽          Reverse ⍵, rotate 1st row left by ⍺, then reverse again.
                        This rotates the first row of  to the *right*.
  1                   Rotate all the rows upward,
                                                  then transpose.
(⍉1⊖⌽@1 1⍢⌽)/⌽   Fold (/) this function over the reversed input.
                     If our input is ⍵, _1, _2, ..., _2n,
                     the reversed input will be _2n, ..., _1, ⍵.
                     The / operator applies the function right to left,
                     so the  is necessary.

{⍉1⊖⌽⍺⌽@(⍳1)⌽⍵}(⍉1⊖⌽@(⍳1)⍢⌽)ama bana neden veya @1yerine çalışmadığını açıklayabilir misiniz ? Ayrıca OP, girişi tersine almanıza izin verebilir. @(⍳1)@(,1)
ADAM

Yani atgenişletilmiş arkasındaki dfns ' ın @uyumlu bir uzantı olmadığı ortaya çıkıyor . Ancak, yerli kullanabilirsiniz @ile `@1üzerinden bir bayt kazandırır @1 1.
Adám

vs apl'de rotate farklı çalışır mı? Bunu J'ye çevirmeye çalışıyorum ve çok daha ayrıntılı buluyorum ...
Jonah

2

Python 2, 96 bayt

def f(m,v):
    for i,x in enumerate(v):x%=len(m);r=m[i/2];m[i/2]=r[-x:]+r[:-x];m=zip(*m)
    return m

Testler

ftuples listesini döndürür. İşlev gövdesindeki her satır 1 sekme karakteri ile girintilidir.


Bir düz return zip(*m)sizi 5 bayt kurtaramaz mı?
Denker

@DenkerAffe: m=zip(*m);return mSadece yerine koymayı mı öneriyorsunuz return zip(*m)? Bunu yapamam çünkü döngünün m=zip(*m)bir parçasıfor
Vaultah

Evet, benim fikrimdi. Döngüde olduğunu görmedim, benim kötü.
Denker

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.