Çöken Matrisler


18

İlgili: Hadi tasarımı bir rakam mozaik , Baskı / Çıktı L-phabet . Korumalı alan yayını burada

Verilen 2 giriş C = columns and rows, S = starting pointaşağıdaki gibi bir matris çıkarır:

Input 4, 3

1   2   3   0
2   2   3   0
3   3   3   0
0   0   0   0

açıklama

verilmiş C = 4, S = 3

1) C x CDolu bir matris oluşturun0

         4 columns
4     _____|____
     |          |
r  --0  0   0   0
o |  0  0   0   0
w |  0  0   0   0
s  --0  0   0   0

2) SSatır ve sütun içindeki değerleri doldurun S, sonra 1'den çıkarın Sve tarihine kadar tekrarlayın S = 0. Bu durumS = 3

             Column 3 
S = 3           |
                v
        0   0   3   0
        0   0   3   0
Row 3-->3   3   3   0
        0   0   0   0


         Column 2
S = 2       |
            v
        0   2   3   0
Row 2-->2   2   3   0
        3   3   3   0
        0   0   0   0


     Column 1
S=1     |
        v
Row 1-->1   2   3   0
        2   2   3   0
        3   3   3   0
        0   0   0   0



Final Result

1   2   3   0
2   2   3   0
3   3   3   0
0   0   0   0

kurallar

  • üstlenmek C >= S >= 0
  • Çıktı bir matris, liste listesi, dizi (1 boyutlu veya 2 boyutlu) vb. Olabilir.
  • Girişleri herhangi bir varsayılan G / Ç formatı aracılığıyla alabilirsiniz
  • Programınız, işleviniz vb. 1 dizinleme veya 0 dizinleme olabilir. Lütfen hangisinin olduğunu belirtin.

Not Açıklama 1 endekslemedir


Kazanma kriterleri

Yanıtlar:


6

Jöle , 8 bayt

»>⁴¬×»µþ

Çevrimiçi deneyin!

Nasıl çalışır

Jelly'in Dış Ürünü Atom ( þ)

Jelly'in dış ürün atomunu, X ve Yþ tamsayı bağımsız değişkenleri (bu durumda X = Y = ilk bağımsız değişken  ) verildiğinde, aşağıdaki tuples matrisini üreten bir hızlı (operatör) olarak düşünebilirsiniz :XYX=Y=ilk tartışma 

[(1,1)(2,1)(3,1)(X,1)(1,2)(2,2)(3,2)(X,2)(1,Y)(2,Y)(3,Y)(X,Y)]

Ayrıca bağlantıyı tüm çiftlere hemen önce uygular, diyelim , iki argüman alan ve böyle bir şey üreten bir işlev gibi davranır:f

[f(1,1)f(2,1)f(3,1)f(X,1)f(1,2)f(2,2)f(3,2)f(X,2)f(1,Y)f(2,Y)f(3,Y)f(X,Y)]

Eldeki görevle ne kadar ilgili?

Bu, beklenen çıktıdaki her değerin yalnızca maksimal indeksler tablosu olduğunu veya bu maksimum değer ikinci argümanımızı aşarsa olduğunu fark ederek çalışır . Bu nedenle, bu eşlemeyi gerçekleştirmek için aşağıdaki bağlantıyı oluşturabiliriz:0

»>⁴¬×» – Dyadic (2-argument) link.
»      – Maximum of the X, Y coordinates.
 >⁴    – Check if this exceeds the second argument of the program.
   ¬   – Negate this boolean.
    ×» – And multiply by the maximum, computed again.

6

R , 47 41 bayt

function(C,S,m=outer(1:C,1:C,pmax))m*!m>S

Çevrimiçi deneyin!

1 endeksli. S==C(Sıfır yok) için çıktılar üretir, sonra >Smatris çarpımı kullanarak bir değeri olan hücreleri sıfırlar (4 bayt için Giuseppe teşekkürler!).


Temiz! çarpma size iyi bir kilometre kazandıracak: 43 bytes
Giuseppe

@Giuseppe tx! İki tane daha kurtarabildim :)
JayCe


5

Haskell , 47 45 bayt

Çıktı formatını tek boyutlu listeye değiştirerek -2 bayt.

c&s|x<-[1..c]=[sum[j|j<=s]|j<-x>>=(<$>x).max]

Çevrimiçi deneyin!

açıklama

Terim x >>= (<$> x) . max,

concat [ max i <$> x | i <- x ]

hangi değerlendirir [1,2,3,4..c, 2,2,3,4..c, 3,3,3,4..c, ..., c,c,c,c..c]. Şimdi değerleri 0ancak selde ettiğimiz değeri bir kez aşmaları için zorlamamız gerekiyor sum [ j | j <= s].



3

APL (Dyalog) , 12 bayt

o×⎕≥o←∘.⌈⍨⍳⎕

Çevrimiçi deneyin!


o×⎕≥o←∘.⌈⍨⍳İzin verilecek bir şey ister misiniz , yoksa sayılabilmesi için bir işleve atamanız gerekir mi?
Zacharý

@ Zacharý benim tahminim, bir argüman veya bir dfns ile bir tradfn içine koymak gerekir olacağını
Uriel

3

JavaScript (ES6), 61 bayt

Tımar sözdiziminde girişi alır (c)(s), s 1 endeksli bir. 1 boyutlu bir dizi döndürür.

c=>s=>[...Array(c*c)].map((_,k)=>(k=k%c>k/c?k%c:k/c)<s?-~k:0)

Çevrimiçi deneyin!


3

Jöle , 6 bayt

⁴Ri»µþ

Tamsayıları alan Cve Stanımlandığı şekilde (1 dizinli) tamsayı listelerinin Jelly temsilini basan tam bir program * .

Çevrimiçi deneyin! (daha kolay okuma için ikili sonucun bir sayı ızgarası olarak biçimlendirilmesi)

Nasıl?

⁴Ri»µþ - Main Link: C, S
     þ - outer product with:
    µ  -   the monadic function (i.e. f(x,y) for x in [1..C] for y in [1..C]):
   »   -     maximum (of x and y)
⁴      -     program's 4th argument = 2nd input = S
 R     -     range = [1,2,3,...S]
  i    -     first index of (the maximum) in (the range) or 0 if not found
       - as a full program: implicit print

* Bunun tam bir program olmasının nedeni, program bağımsız değişken erişiminin kullanılmasıdır . İkili bir bağlantı olarak bu kod, onu kullanan programın nasıl çağrıldığına bağlıdır.
8 baytta yeniden kullanılabilir ikili bağlantı (solda S ve sağda C alarak): 8 baytta yeniden kullanılabilir ikili bağlantı (solda C ve sağda S alarak):RiⱮⱮ»þ`}
RiⱮⱮ⁹»þ¤


2

Java 10, 88 bayt

C->S->{var r=new int[C][C];for(;S>0;)for(int s=S--;s-->0;)r[S][s]=r[s][S]=S+1;return r;}

Çevrimiçi deneyin.

Açıklama:

C->S->{                     // Method with two int parameters and int-matrix return-type
  var r=new int[C][C];      //  Result-matrix of size `C` by `C`
  for(;S>0;)                //  Loop as long as `S` is not 0 yet:
    for(int s=S--;s-->0;)   //   Inner loop `s` in the range (`S`, 0]
                            //   (and decrease `S` by 1 in the process with `S--`)
      r[S][s]=r[s][S]=S+1;  //    Set the values at both {`S`,`s`} and {`s`,`S`} to `S+1`
  return r;}                //  Return the result

2

PHP , 92 bayt

Bu "1 endeksleme" dir.

<?list(,$c,$s)=$argv;for(;$i++<$c;print"\n")for($j=0;$j++<$c;)echo$s<$i||$s<$j?0:max($i,$j);

Çalıştırmak için:

php -n <filename> <c> <s>

Misal:

php -n collapsing_matrice.php 8 6

Veya çevrimiçi deneyin!


2

Stax , 10 bayt

▓╜.→,cΘ○╤æ

Çalıştır ve hata ayıkla

Nasıl çalışır:

R(Xm]i*xit+J Full program, implicit input.
R            1-based range of S
 (           Right-pad with zeroes to length C
  X          Save to X register
   m         Map (same as here):
    ]          Wrap in list
     i*        repeat by iteration index
       xit     Remove first  elements from X register
          +    Append
           J   Stringify each element, and join by space


2

Excel VBA, 65 bayt

[A1:B1]Aralıktan girdi alan ve aralıktan çıktı alan anında pencere işlevi [C1].Resize([A1],[A1]).

[C1].Resize([A1],[A1])=0:For s=-[B1]To-1:[C1].Resize(-s,-s)=-s:Next

Giriş çıkış

Giriş aralık dahilinde [A1:B1]

I / O



2

MATLAB, 58 bayt (İsimsiz kullanıcı sayesinde)

function o=f(c,s);o=zeros(c);for j=s:-1:1;o(1:j,1:j)=j;end

Matris elemanlarını uygun sayı ile doldurmak, bir döngü çalıştırmak. Belki daha zeki olmak mümkünarrayfun


İşlevi adlandırmanıza gerek yoktur ve zeros(c)bazı kasaları bayt olarak kullanabilirsiniz. Ayrıca bu Octave cevabını gördünüz mü , sanırım Matlab'da da işe yarayacaktı?
ბიმო

@ OMᗺ Octave, matlab'daki anonim işlevler içindeki değişkenleri adlandıramazsınız. Ayrıca, max()aynı şekilli argümanlar almak zorunda
aaaaa Monica yeniden

1
Anonim bir kullanıcı önerdi function o=f(c,s);o=zeros(c);for j=s:-1:1;o(1:s,1:s)=j;end.
Jonathan Frech

@JonathanFrech oh benim çok daha basit :-( sadece olmak gerekiro(1:j,1:j)=j
aaaaa diyor Monica eski haline



1

Kömür , 19 bayt

Eθ⪫IEEθ⌈⟦ιλ⟧∧‹λη⊕λ 

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Çıkışı ondalığa dönüştürmek ve güzelce biçimlendirmek için kullanılan 3 bayt. Açıklama:

 θ                  Input `C`
E                   Map over implicit range
      θ             Input `C`
     E              Map over implicit range
          λ         Inner index
         ι          Outer index
       ⌈⟦  ⟧        Maximium
    E               Map over results
              λ     Current value
               η    Input `S`
             ‹      Less than
                 λ  Current value
                ⊕   Incremented
            ∧       Logical AND
   I                Cast to string
  ⪫                 Join with spaces
                    Implicitly print on separate lines

1

Temiz , 67 bayt

import StdEnv
$n s=[[if(i>s||j>s)0(max i j)\\i<-[1..n]]\\j<-[1..n]]

Çevrimiçi deneyin!

$ :: Int Int -> [[Int]]1 tabanlı indeksleme kullanarak cevap vermeyi tanımlar .



0

Mathematica 44 bayt

Table[If[i <= s && j <= s, Max[i, j], 0], {i, c}, {j, c}]

Boşluğun gerekli olduğundan emin misiniz? Mathematica'yı test edemiyorum ama öyle olduğunu sanmıyorum.
Rock Garf Hunter Post
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.