Ma trận thu gọn


18

Liên quan: Hãy thiết kế khảm chữ số , In / Xuất L-ph.us . Sandbox đăng ở đây

Cho 2 đầu vào đầu C = columns and rows, S = starting pointra một ma trận như sau:

Input 4, 3

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

Giải trình

Được C = 4, S = 3

1) Tạo một C x Cma trận chứa đầy0

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

2) Điền vào Scác giá trị trong hàng và cột S, sau đó trừ 1 từ Svà lặp lại cho đến khi S = 0. Trường hợp nàyS = 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

Quy tắc

  • Giả định C >= S >= 0
  • Đầu ra có thể là một ma trận, danh sách các danh sách, mảng (1 chiều hoặc 2 chiều), v.v.
  • Bạn có thể nhận đầu vào thông qua bất kỳ định dạng I / O mặc định
  • Chương trình, chức năng của bạn, v.v ... có thể là lập chỉ mục 1 hoặc lập chỉ mục 0. Vui lòng xác định đó là một.

Lưu ý Giải thích là lập chỉ mục 1


Giành được tiêu chí

Câu trả lời:


6

Thạch , 8 byte

»>⁴¬×»µþ

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Nguyên tử sản phẩm bên ngoài của Jelly (þ )

Bạn có thể nghĩ về nguyên tử sản phẩm bên ngoài của Jelly þ, như một (toán tử) nhanh, đưa ra các đối số nguyên Y (trong trường hợp này là X = Y = đối số đầu tiên  ), tạo ra ma trận các bộ dữ liệu sau:XYX=Y=first argument 

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

Nó cũng áp dụng liên kết ngay trước khi nó cho tất cả các cặp, hãy gọi nó là , hoạt động giống như một hàm có hai đối số, tạo ra một cái gì đó như thế này: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)]

Làm thế nào nó có liên quan đến nhiệm vụ trong tầm tay?

Điều này hoạt động bằng cách nhận thấy rằng mọi giá trị trong đầu ra dự kiến ​​chỉ là một bảng các chỉ số tối đa hoặc nếu mức tối đa này vượt quá đối số thứ hai của chúng tôi. Do đó, chúng ta có thể tạo liên kết sau để thực hiện ánh xạ này: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 byte

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

Hãy thử trực tuyến!

1 chỉ mục. Tạo các kết quả đầu ra cho S==C(không có số không) sau đó chọn các ô có giá trị >Sbằng cách nhân ma trận (cảm ơn Giuseppe cho 4 byte!).


Khéo léo! phép nhân sẽ giúp bạn có một số dặm tốt: 43 byte
Giuseppe

@Giuseppe tx! Tôi đã có thể cứu thêm hai người nữa :)
JayCe


5

Haskell , 47 45 byte

-2 byte bằng cách thay đổi định dạng đầu ra thành danh sách một chiều.

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

Hãy thử trực tuyến!

Giải trình

Thuật ngữ x >>= (<$> x) . maxnày là một phiên bản chơi gôn của

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

mà đánh giá [1,2,3,4..c, 2,2,3,4..c, 3,3,3,4..c, ..., c,c,c,c..c]. Bây giờ chúng ta chỉ cần buộc các giá trị 0một khi chúng vượt quá mức schúng ta đạt được sum [ j | j <= s].



3

APL (Dyalog) , 12 byte

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

Hãy thử trực tuyến!


Điều gì đó giống như o×⎕≥o←∘.⌈⍨⍳được cho phép, hoặc bạn sẽ phải gán nó cho một chức năng để tính điều đó?
Zacharý

@ Zacharý tôi đoán là người ta sẽ cần phải đặt nó vào trong một tradfn với một đối số hoặc một dfns
Uriel

3

JavaScript (ES6), 61 byte

Đưa đầu vào theo cú pháp currying (c)(s), trong đó s là 1-index. Trả về mảng 1 chiều.

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

Hãy thử trực tuyến!


3

Thạch , 6 byte

⁴Ri»µþ

Một chương trình đầy đủ * lấy số nguyên CSin đại diện Jelly của danh sách danh sách các số nguyên theo quy định (1 chỉ mục).

Hãy thử trực tuyến! (định dạng kết quả của dyad như một lưới các số để dễ đọc hơn)

Làm sao?

⁴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

* Lý do đây là một chương trình đầy đủ là do việc sử dụng quyền truy cập đối số chương trình , . Là một liên kết dyadic, mã này sẽ dựa vào cách chương trình đang sử dụng nó được gọi.
Liên kết dyadic tái sử dụng trong 8 byte (lấy S ở bên trái và C ở bên phải): Liên kết dyadic tái sử dụng trong 8 byte (lấy C ở bên trái và S ở bên phải):RiⱮⱮ»þ`}
RiⱮⱮ⁹»þ¤


2

Java 10, 88 byte

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

Hãy thử trực tuyến.

Giải trình:

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 byte

Đây là "lập chỉ mục 1".

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

Để chạy nó:

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

Thí dụ:

php -n collapsing_matrice.php 8 6

Hoặc dùng thử trực tuyến!


2

Stax , 10 byte

▓╜.→,cΘ○╤æ

Chạy và gỡ lỗi nó

Làm thế nào nó hoạt động:

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

VBA Excel, 65 byte

Một chức năng cửa sổ ngay lập tức đưa đầu vào từ [A1:B1]và đầu ra vào phạm vi [C1].Resize([A1],[A1]).

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

Đầu ra đầu vào

Đầu vào trong phạm vi [A1:B1]

Tôi / O



2

MATLAB, 58 byte (Nhờ người dùng ẩn danh)

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

Chỉ cần điền các phần tử của ma trận với số thích hợp, chạy một vòng lặp. Có lẽ có thể thông minh hơn vớiarrayfun


Bạn không cần đặt tên hàm và bạn có thể sử dụng zeros(c)két nào một số byte. Ngoài ra bạn có thấy câu trả lời Octave này không , tôi đoán nó cũng sẽ hoạt động trong Matlab?
ბიმო

@ OMᗺ Octave bạn không thể đặt tên biến trong các hàm ẩn danh trong MATLAB. Ngoài ra, max()phải thực hiện các đối số có hình dạng tương tự
aaaaa nói rằng phục hồi Monica

1
Một người dùng ẩn danh đề nghị function o=f(c,s);o=zeros(c);for j=s:-1:1;o(1:s,1:s)=j;end.
Jonathan Frech

@JonathanFrech oh đơn giản hơn rất nhiều của tôi :-( chỉ cần lào(1:j,1:j)=j
aaaaa nói phục hồi Monica



1

Than , 19 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. 3 byte được sử dụng để chuyển đổi đầu ra thành số thập phân và định dạng độc đáo. Giải trình:

 θ                  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

Sạch , 67 byte

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

Hãy thử trực tuyến!

Xác định $ :: Int Int -> [[Int]]đưa ra câu trả lời bằng cách sử dụng lập chỉ mục dựa trên 1.



0

Toán học 44 byte

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

Bạn có chắc chắn khoảng trắng là cần thiết? Tôi không thể kiểm tra Mathicala nhưng tôi không nghĩ vậy.
Phù thủy lúa mì
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.