崩壊する行列


18

関連:レッツ・デザイン桁モザイク印刷/出力L-phabetサンドボックスの投稿はこちら

C = columns and rows, S = starting point次のように2つの入力が行列を出力するとします。

Input 4, 3

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

説明

与えられた C = 4, S = 3

1)でC x C満たされた行列を作成する0

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

2)S行と列内の値を入力してSからS、1を減算し、まで繰り返しS = 0ます。この場合S = 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

ルール

  • 仮定する C >= S >= 0
  • 出力は、マトリックス、リストのリスト、配列(1次元または2次元)などです。
  • デフォルトのI / O形式で入力を取得できます
  • プログラム、関数などは1インデックスまたは0インデックスの場合があります。どちらを指定してください。

説明は1インデックスです


受賞基準

回答:


6

ゼリー、8 バイト

»>⁴¬×»µþ

オンラインでお試しください!

使い方

ゼリーの外積原子(þ

Jellyの外積アトムを、þ整数引数および(この場合は)が与えられると、次のタプルのマトリックスを生成するクイック(演算子)と考えることができます。Y X = Y = 最初の引数 バツYバツ=Y=最初の引数 

[112131バツ1122232バツ21Y2Y3YバツY]

また、リンクをその直前にすべてのペアに適用します。これをと呼びましょう。これは、2つの引数を取る関数のように動作し、次のようなものを生成します。f

[f11f21f31fバツ1f12f22f32fバツ2f1Yf2Yf3YfバツY]

目の前のタスクにどのように関連していますか?

これは、予想される出力のすべての値が最大インデックスのテーブルにすぎないこと、またはこの最大値が2番目の引数を超える場合はことを認識することで機能します。したがって、次のリンクを作成してこのマッピングを実行できます。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

R47 41バイト

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

オンラインでお試しください!

1インデックス付き。S==C(ゼロなし)の出力を生成し、>S行列乗算を使用して値を持つセルをゼロにします(4バイトのGiuseppeに感謝します!)。


きちんとした!乗算はあなたにいくつかの良い燃費を取得します:43バイト
ジュゼッペ・

@Giuseppe tx!さらに2つ保存できました:)
JayCe


5

Haskell47 45バイト

出力形式を1次元リストに変更して-2バイト。

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

オンラインでお試しください!

説明

用語x >>= (<$> x) . maxは、ゴルフバージョンです

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

これはに評価され[1,2,3,4..c, 2,2,3,4..c, 3,3,3,4..c, ..., c,c,c,c..c]ます。これで、値が0を超えるsと、値を強制するだけで済みsum [ j | j <= s]ます。





3

ゼリー、6 バイト

⁴Ri»µþ

整数Cを取得しS、定義済みの整数リストのリストのゼリー表現を出力する完全なプログラム* (1-indexed)。

オンラインでお試しください!(読みやすいように、ダイアドの結果を数字のグリッドとしてフォーマットします)

どうやって?

⁴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

*これが完全なプログラムである理由は、プログラム引数アクセスの使用にあります。二項リンクとして、このコードはそれを使用しているプログラムがどのように呼び出されるかに依存します。
8バイトの再利用可能なダイアディックリンク(左側にS、右側にCを取得): 8バイトの再利用可能なダイアディックリンク(左側にCを、右側にSを取得):RiⱮⱮ»þ`}
RiⱮⱮ⁹»þ¤


2

Java 10、88バイト

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;}

オンラインでお試しください。

説明:

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

スタックス、10 バイト

▓╜.→,cΘ○╤æ

実行してデバッグする

使い方:

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バイト

[A1:B1]range から入力を受け取り、rangeに出力するイミ​​ディエイトウィンドウ関数[C1].Resize([A1],[A1])

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

入出力

入力は範囲内です [A1:B1]

I / O



2

MATLAB、58バイト(匿名ユーザーのおかげ)

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

マトリックスの要素を適切な数で埋め、ループを実行するだけです。たぶん巧妙になることが可能arrayfun


関数に名前を付ける必要はなく、zeros(c)どちらを使用しても安全に使用できます。また、このオクターブの答えを見ましたか?Matlabでも機能すると思いますか?
ბიმო

@OMᗺOctaveでは、matlabの匿名関数内の変数に名前を付けることはできません。また、max()同じ形状の引数を取らなければならない
AAAAAはモニカ回復言う

1
匿名ユーザーが提案しましたfunction o=f(c,s);o=zeros(c);for j=s:-1:1;o(1:s,1:s)=j;end
ジョナサンフレッチ

ああ@JonathanFrech私そんなに単純:-(ちょうど必要があることをo(1:j,1:j)=j
AAAAAはモニカ回復言う



1

、19バイト

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。出力を10進数に変換し、適切にフォーマットするために使用される3バイト。説明:

 θ                  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



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.