折叠矩阵


18

相关:让我们设计一个数字马赛克打印/输出L-phabet沙盒发布在这里

给定2个输入,C = columns and rows, S = starting point输出矩阵如下:

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,然后从中减去1 S并重复直到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
  • 输出可以是矩阵,列表列表,数组(一维或二维)等。
  • 您可以通过任何默认的I / O格式进行输入
  • 您的程序,函数等可能是1索引或0索引。请指定是哪一个。

注意说明是1索引


获胜标准

Answers:


6

果冻,8 字节

»>⁴¬×»µþ

在线尝试!

怎么运行的

果冻的外部产品原子(þ

您可以将Jelly的外部乘积原子þ视为一个快速(运算符),给定整数参数Y(在这种情况下X = Y = 第一个参数 ),该运算符将生成以下元组矩阵:XÿX=ÿ=第一个论点 

[1个1个21个31个X1个1个22232X21个ÿ2ÿ3ÿXÿ]

它还将链接之前的链接应用于所有对,我们称之为链接 ,其行为类似于带有两个参数的函数,产生如下所示:F

[F1个1个F21个F31个FX1个F1个2F22F32FX2F1个ÿF2ÿF3ÿFXÿ]

它与手头任务有什么关系?

通过注意到预期输出中的每个值只是一个最大索引表来工作,如果该最大值超过了我们的第二个参数,则为。因此,我们可以创建以下链接来执行此映射: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使用矩阵乘法将具有值的单元归零(感谢Giuseppe提供4个字节!)。


整齐!乘法会为您带来不错的成绩:43个字节
朱塞佩

@朱塞佩TX!我还可以保存两个:)
JayCe


5

Haskell47 45字节

通过将输出格式更改为一维列表来增加-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

JavaScript(ES6),61个字节

以currying语法接受输入(c)(s),其中s为1索引。返回一维数组。

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

在线尝试!


3

果冻,6 个字节

⁴Ri»µþ

一个完整的程序* CS它使用整数,并按定义的方式(1索引)打印整数列表列表的Jelly表示形式。

在线尝试!(将二元组的结果格式化为数字网格,以便于阅读)

怎么样?

⁴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

PHP,92字节

这是“ 1-索引”。

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

要运行它:

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

例:

php -n collapsing_matrice.php 8 6

在线尝试!


2

Stax,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]和从范围输出[C1].Resize([A1],[A1])

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

输入输出

输入范围内 [A1:B1]

输入输出



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)它来保护一些字节。您还看到了这个 Octave答案吗,我想它也可以在Matlab中使用吗?
ბიმო

@OMᗺOctave,您无法在matlab的匿名函数中命名变量。另外,max()必须采取相同形式的论点
aaaaa说,请恢复莫妮卡(Monica)

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θ⌈⟦ιλ⟧∧‹λη⊕λ 

在线尝试!链接是详细版本的代码。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

1

干净,67字节

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

在线尝试!

定义$ :: Int Int -> [[Int]]使用基于1的索引给出答案。



0

Mathematica 44字节

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

您确定空格是必需的吗?我无法测试Mathematica,但我认为不是。
小麦巫师
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.