Chuyển vị và đường chéo


21

Đối với thử thách này, bạn nên viết chương trình hoặc hàm xuất ra các đường chéo của ma trận vuông đã cho. Tuy nhiên, nếu bạn hoán đổi các hàng và cột trong mã nguồn của giải pháp, thay vào đó, nó sẽ trở thành một chương trình hoặc hàm trả về các antidiagonals của ma trận. Đọc để biết chi tiết ...

Quy tắc

  • Mã nguồn của giải pháp của bạn được coi là một lưới các ký tự 2D, được phân tách bằng một dòng mới tiêu chuẩn mà bạn chọn (nguồn cấp dữ liệu, trả về vận chuyển hoặc kết hợp cả hai).
  • Không có dòng nào trong mã nguồn của bạn có thể dài hơn dòng trước. Dưới đây là một số ví dụ về bố cục hợp lệ:

    ###
    ###
    ###
    

    ########
    #######
    ###
    ###
    #
    

    Và đây là một ví dụ về bố cục không hợp lệ (vì dòng thứ ba dài hơn dòng thứ hai):

    ######
    ####
    #####
    ###
    
  • Hai giải pháp của bạn nên hoán chuyển cho nhau, nghĩa là bạn nên lấy một giải pháp khác bằng cách hoán đổi các hàng và cột. Đây là hai cặp hợp lệ:

    abc
    def
    ghi
    

    adg
    beh
    cfi
    

    print 10
    (~^_^)~
    foo
    bar
    !
    

    p(fb!
    r~oa
    i^or
    n_
    t^
     )
    1~
    0
    

    Lưu ý rằng không gian được xử lý như bất kỳ nhân vật khác. Cụ thể, không gian dấu là rất quan trọng vì chúng có thể không phải là dấu cách trong khoảng cách.

  • Mỗi giải pháp nên là một chương trình hoặc hàm lấy ma trận vuông không rỗng gồm các số nguyên có một chữ số làm đầu vào. Một giải pháp sẽ xuất ra một danh sách tất cả các đường chéo của ma trận và giải pháp kia sẽ đưa ra một danh sách tất cả các antidiagonals. Bạn có thể sử dụng bất kỳ định dạng đầu vào và đầu ra hợp lý, rõ ràng nào, nhưng chúng phải giống hệt nhau giữa hai giải pháp (điều này cũng có nghĩa là chúng phải là cả hai chức năng hoặc cả hai chương trình).

  • Mỗi đường chéo chạy từ trên cùng bên trái xuống dưới cùng bên phải, và chúng nên được sắp xếp từ trên xuống dưới.
  • Mỗi antidia Cross chạy từ dưới cùng bên trái lên trên cùng bên phải, và chúng nên được sắp xếp từ trên xuống dưới.

Chấm điểm

Để khuyến khích các giải pháp càng "vuông" càng tốt, điểm chính là số lượng hàng hoặc số cột của giải pháp của bạn, tùy theo giá trị nào lớn hơn . Ít hơn là tốt hơn. Ties bị phá vỡ bởi số lượng ký tự trong giải pháp, không tính các dòng mới. Một lần nữa, ít hơn là tốt hơn. Thí dụ:

abcd
efg
h

Điều này và chuyển vị của nó sẽ có điểm chính là 4 (vì có 4 cột) và điểm hòa là 8 (vì có 8 ký tự không phải dòng mới). Vui lòng trích dẫn cả hai giá trị trong tiêu đề câu trả lời của bạn.

Các trường hợp thử nghiệm

Nhiệm vụ thực tế được thực hiện bởi hai giải pháp không phải là thách thức chính ở đây, nhưng đây là hai ví dụ để giúp bạn kiểm tra các giải pháp của mình:

Input:
1 2 3
4 5 6
7 8 9
Diagonals:
3
2 6
1 5 9
4 8
7
Antidiagonals:
1
4 2
7 5 3
8 6
9

Input:
1 0 1 0
0 1 0 1
1 0 1 0
0 1 0 1
Diagonals:
0
1 1
0 0 0 
1 1 1 1
0 0 0
1 1
0
Antidiagonals:
1
0 0
1 1 1
0 0 0 0
1 1 1
0 0
1


Khi tôi nhận ra bài đăng trên hộp cát là của bạn trước khi đi được nửa chừng, trước khi tôi vào SE sáng nay tôi nhận ra bạn đã đăng bài này ... lúc này tôi bắt đầu nghĩ mình phải là người tâm lý: P
ETHproductions

Câu trả lời:


19

Javascript, điểm 20 14, ( 258 176 ký tự không phải dòng mới)

///mmm()mu[=+r
///=.av=a,pr"=
///> p,>px=[ [
m=>//(yv()xp"]
m. ////.(=+]+)
map((////>y?u&
v,y)=>v//r]r:&
.map((u,x//[ur
)=>r[p=m.//p)
length-1-//],
x+y]=r[p]////
?r[p]+" "+u//
:u),r=[])&&r

///mmmv.)lx?:
///=.a,m=e+ru
///> pya>ny[)
m=>//()prg]p,
m. //(=([t=]r
map(//>(phr+=
(v,y//vu=-["[
)=>v.//,m1p ]
map((//x.-]")
u,x)=>r////+&
[p=x+y]////u&
=r[p]?r[p]//r
+" "+u:u),//
r=[])&&r

Đoạn mã ví dụ:

f=

///mmm()mu[=+r
///=.av=a,pr"=
///> p,>px=[ [
m=>//(yv()xp"]
m. ////.(=+]+)
map((////>y?u&
v,y)=>v//r]r:&
.map((u,x//[ur
)=>r[p=m.//p)
length-1-//],
x+y]=r[p]////
?r[p]+" "+u//
:u),r=[])&&r

console.log(f([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]))

f=

///mmmv.)lx?:
///=.a,m=e+ru
///> pya>ny[)
m=>//()prg]p,
m. //(=([t=]r
map(//>(phr+=
(v,y//vu=-["[
)=>v.//,m1p ]
map((//x.-]")
u,x)=>r////+&
[p=x+y]////u&
=r[p]?r[p]//r
+" "+u:u),//
r=[])&&r

console.log(f([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]))


Bạn có thể kích hoạt cú pháp tô sáng? Đặt <!-- language-all: lang-javascript -->trước khối mã đầu tiên.
Máy

8

MATL , điểm 10 (100 ký tự không phải dòng mới)

%P!       
  Q&%     
  TXd!    
  %d      
     P!   
      "@% 
       Xz 
      %z  
         q
         !

Có 10 dòng gồm 10 ký tự (lưu ý các dấu cách).

Đoạn mã trên tạo ra các đường chéo. Hãy thử trực tuyến!

Phiên bản chuyển đổi tạo ra các đường chéo. Hãy thử trực tuyến!

Giải trình

Lưu ý rằng

  • % là một biểu tượng bình luận, làm cho phần còn lại của dòng bị bỏ qua.

  • Các hàm hai char như Xdkhông thể được chia thành một Xvà một dtrong các dòng liên tiếp.

Mã gốc

Mã ban đầu, được tuyến tính hóa và không có phần nhận xét, là

Q&TXd!P!"@Xzq!

hoạt động như sau:

Q      % Implicit input. Add 1 to each entry to make them positive
&      % This modifes default inputs/ouputs of next function, which is Xd
       % Specifically, it specifies 2 inputs and 1 ouput
T      % Push true
Xd     % Diagonals of matrix. With second input true, it gives all diagonals,
       % starting from below. The columns are arranged as columns of a matrix,
       % padding with zeros
!P!    % Flip horizontally. This is to produce the correct display order
"      % For each column
  @    %   Push current column
  Xz   %   Remove zeros
  q    %   Subtract 1
  !    %   Transpose into a row
       % Implicit end. Implicit display of stack contents

Mã chuyển

Mã chuyển đổi, được tuyến tính hóa, là

P!QT&Xd!P!"@Xzq!

có hai điểm khác biệt sau so với mã gốc:

  • T&được hoán đổi. Điều này không có tác dụng, vì Tlà một nghĩa đen, không phải là một chức năng, vì vậy nó không chặn &đặc tả.
  • P! được thêm vào lúc bắt đầu.

Mã được thêm vào sẽ sửa đổi ma trận đầu vào sao cho các đường chéo của ma trận được sửa đổi là các đường chéo của đầu vào:

P      % Implicit input. Flip vertically
!      % Transpose

7

Jelly , Điểm 7, 49 byte không phải dòng mới

Chương trình in chéo

......U
......Œ
......D
......ṙ
......L
......Ṛ
ŒDṙLṚUU

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

Chương trình chống in chéo

......Œ
......D
......ṙ
......L
......Ṛ
......U  
UŒDṙLṚU

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

Câu trả lời cũ hơn (Đầu ra không có thứ tự), Điểm 3, 6 byte không phải dòng mới

Chương trình in chéo

UU
UŒ
ŒD

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

Chương trình in chống chéo

UUŒ
UŒD

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


6

Jelly , điểm 4 (12 ký tự)

điểm trước: 5 (16 ký tự), 4 (16 ký tự)

Nguyên

ŒDṙṚ
D  ñ
ṙLñL

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

Chuyển

ŒDṙ
D L
ṙ ñ
ṚñL

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

Lý lịch

Đường chéo

Cách đơn giản để có được các đường chéo (trên cùng đến đáy) của một ma trận vuông như sau.

ŒDṙLṚ

Đối với ma trận đầu vào M , ŒDliệt kê các đường chéo của M , bắt đầu với đường chéo chính và di chuyển lên trên.

Đối với đầu vào

1 2 3
4 5 6
7 8 9

năng suất này

1 5 9
2 6
3
7
4 8

ṙLsau đó tính toán độ dài của M với Lvà xoay đơn vị độ dài kết quả (M) sang trái.

Ví dụ của chúng tôi, chiều dài là 3 và chúng tôi nhận được

7
4 8
1 5 9
2 6
3

Cuối cùng, đảo ngược thứ tự của các đường chéo, trở lại

3
2 6
1 5 9
4 8
7

cho ví dụ đầu vào của chúng tôi.

Chống chéo

Các khối xây dựng tương tự có thể được sử dụng để thu được các đường chéo (một lần nữa, trên cùng đến đáy) của một ma trận vuông.

ṚŒDṙL

Đối với ma trận đầu vào M , đầu tiên đảo ngược thứ tự của các hàng.

Đối với đầu vào

1 2 3
4 5 6
7 8 9

năng suất này

7 8 9
4 5 6
1 2 3

Như trước, ŒDṙLtạo các đường chéo (đáy đến đỉnh) của kết quả.

Ví dụ của chúng tôi, điều này trả về

1
4 2
7 5 3
8 6
9

như mong muốn.

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

Trong Jelly, mỗi dòng định nghĩa một liên kết (hàm). Cụ thể, dòng cuối cùng xác định liên kết chính , được thực thi khi chương trình bắt đầu.

Các liên kết khác phải được gọi. Câu trả lời này sử dụng ñ, thực thi các liên kết dưới đây một cách tự nhiên. ñkết thúc tốt đẹp, vì vậy khi nó được gọi từ liên kết chính, nó sẽ thực thi liên kết trên dòng đầu tiên.

Nguyên

Liên kết chính

ṙLñL

lấy một ma trận đầu vào M , tính toán độ dài của nó với L, sau đó xoay các đơn vị độ dài đầu vào (M) sang trái với (lưu ý rằng điều này không làm thay đổi M ) và cuối cùng gọi liên kết đầu tiên với kết quả ( M ) và độ dài ( M ) M) làm đối số.

Liên kết đầu tiên

ŒDṙṚ

tính các đường chéo của M với ŒD(như đã thấy trong phần trước), xoay các đơn vị độ dài kết quả (M) sang trái với , sau đó đảo ngược thứ tự của kết quả với .

Liên kết thứ hai không bao giờ được gọi.

Chuyển

Liên kết chính

 ṚñL

lấy một ma trận đầu vào M và tính ngược lại với nó . Sau đó, nó tính toán độ dài của M với Lvà gọi liên kết đầu tiên với các đối số ngược lại (M)chiều dài (M) .

Liên kết đầu tiên

ŒDṙ

sau đó tính các đường chéo của đảo ngược (M) với ŒD(như đã thấy trong phần trước), và cuối cùng xoay đơn vị chiều dài kết quả (M) sang trái với .

Các liên kết còn lại không bao giờ được gọi.


5

R, điểm 14 13 11 ( 99 95 ký tự không phải dòng mới)

Cảm ơn @Giuseppe đã cải thiện điểm số bằng cách 1. Loại bỏ một vài ký tự bằng cách sử dụng các khoản dự phòng trong các chuyển vị. Hiện tại điểm số tốt nhất cho một ngôn ngữ không chơi golf!

######`,scr
`::`(#:fpoo
pryr,#:)llw
f)(###`(i((
split (#tmm
p,col(p#())
)+row#r#m-)
(p)))#y#,#)
######r

Và chuyển đổi:

#`pfsp)(#
#:r)p,+p#
#:y(lcr)#
#`r#ioo)#
#(,#tlw)#
#### (###
`::`(pryr
,f)(####
split(m,
col(m)-#
row(m)))

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


1
row(m)+col(m)là ngắn hơn cho các đường chéo.
Giuseppe

@Giuseppe Tất nhiên, cảm ơn! Chỉnh sửa ngay.
rturnbull

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.