Xây dựng lại một mảng hình chữ nhật từ một góc


30

Tôi đã từng có một mảng hình chữ nhật đẹp. Nó rất cân xứng, nhưng thật không may, nó đã sụp đổ và bây giờ tôi chỉ có góc trên cùng bên trái. Nhiệm vụ của bạn sẽ là xây dựng lại mảng ban đầu.

Chương trình của bạn sẽ nhận được một mảng số nguyên 2 chiều. Để dễ phân tích cú pháp, bạn có thể giả sử tất cả chúng đều nằm trong khoảng từ 1 đến 9. Nhiệm vụ của bạn là đảo ngược các cột của hàng, các hàng của nó và cả hai, ghép các góc kết quả lại với nhau và trả về mảng kết quả.

Bạn có thể giả sử kích thước mảng sẽ ít nhất là 1x1.

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

Input:
1 2 3
4 5 6

Output:
1 2 3 3 2 1
4 5 6 6 5 4
4 5 6 6 5 4
1 2 3 3 2 1

Input:
1

Output:
1 1
1 1

Input:
9
9
9

Output:
9 9
9 9
9 9
9 9
9 9
9 9

Đây là , ít byte thắng nhất!


1
Tôi sẽ đặt cược than có thể làm điều này dưới 10
FantaC

1
@tbfninja chat.stackexchange.com/transcript/message/43184083#43184083 nhưng có thể ngắn hơn với định dạng đầu vào khác.
Pavel

@MagicOctopusUrn vâng
Pavel

2
@tfbninja WS⟦ι⟧‖M→↓có lẽ? 5 byte để đọc đầu vào và 4 để phản ánh nó.
Neil

4
Tôi chắc chắn 99% rằng có một lang làm điều này với (hoặc một số nhân vật tương tự) chỉ không thể nhớ cái nào: c
Rod

Câu trả lời:


1

Proton , 29 byte

a=>[b+b[by-1]for b:a+a[by-1]]

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

Có một vài cách tiếp cận thú vị khác:

Proton , 29 byte

a=>map(g,(g=x=>x+x[by-1])(a))

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

Bạn có thể định nghĩa hàm phụ gương gtrong dòng, vì Proton. Nó không ngắn hơn mặc dù.

Proton , 36 byte

(a=>[x[0]for x:zip(*(a+a[by-1]))])*2

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

Đây phải (a=>zip(*(a+a[by-1])))*2là 24 byte, nhưng chức năng zip bị hỏng hoàn toàn. Về cơ bản, bạn phản chiếu nó và zip, sau đó thực hiện hai lần (bạn có thể nhân một hàm với một số nguyên dương để áp dụng hàm nhiều lần).




5

Python 3, 38 byte

lambda a:[b+b[::-1]for b in a+a[::-1]]

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

Đưa ra một danh sách các danh sách và trả về một danh sách các danh sách.

Giải trình:

lambda a:                              # anonymous lambda function
                   for b in a+a[::-1]  # for each row in the array and the upside-down array
          b+b[::-1]                    # the row with its reverse appended
         [                           ] # return in a list


5

Võng mạc , 13 byte

\%`$
$^$`
Vs`

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

Giải trình

\%`$
$^$`

Trên mỗi dòng ( %), khớp phần cuối của dòng ( $) và chèn đảo ngược ( $^) của toàn bộ dòng ( $`) và in kết quả bằng một dòng feedfeed ( \). Điều này thực hiện sự phản chiếu dọc theo trục dọc và in nửa đầu ra.

Vs`

Điều này chỉ đảo ngược toàn bộ chuỗi, tương đương với xoay 180 độ hoặc trong trường hợp của chúng tôi (do tính đối xứng ngang) một phản xạ dọc theo trục ngang. Cách này hoạt động là Vregex mặc định (đảo ngược) (?m:^.*$), thường khớp với từng dòng của chuỗi. Tuy nhiên, chúng tôi kích hoạt tùy chọn singleline s, điều này cũng tạo ra các dòng .phù hợp và do đó regex mặc định này thực sự khớp với toàn bộ chuỗi.

Kết quả của việc này được in tự động vào cuối chương trình, cho chúng ta nửa sau của đầu ra.


Điều này không giống với bất kỳ hương vị regex nào tôi biết: P
Pavel

@Pavel Bởi vì Retina không chỉ là regex. :)
Erik the Outgolfer

@Pavel phần duy nhất của mã đó là regex thực tế là $trên dòng đầu tiên. ;) Tôi sẽ thêm một lời giải thích sau.
Martin Ender

5

05AB1E , 2 byte

∞∊

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


   # Input:Array of String | ['12','34']
---#-----------------------+------------------------------------------
∞  # Mirror horizontally.  | [12,34]       -> [1221,3443]
 ∊ # Mirror vertically.    | [1221,3443]   -> [1221\n3443\n3443\n1221]

Tín dụng cho ông Xcoder chỉ ra rằng các mảng chuỗi có thể được tính là mảng 2D và Pavel để xác nhận nó.



Để dễ phân tích cú pháp, bạn có thể cho rằng tất cả chúng đều nằm trong khoảng từ 1 đến 9 - Vì vậy, tôi nghĩ rằng điều này là hợp lệ. Đang chờ xác nhận của Pavel, tôi đoán
Ông Xcoder

@ Mr.Xcoder đó là những gì tôi đã có ban đầu, sau đó các mảng TIO 2D vì đầu vào là lạ ... vì vậy phải đưa ra công cụ tiêu đề đó.
Bạch tuộc ma thuật Urn

Chuỗi là một mảng các ký tự, vì vậy danh sách các chuỗi vẫn là mảng 2d. Giải pháp @ Mr.Xcoder là hợp lệ.
Pavel

Coolio, làm việc cho tôi.
Bạch tuộc ma thuật Urn






3

ôi, 88 byte

{s="";for(i=NF;i>0;i--)s=" "$i s" "$i;a[FNR]=s;print s}END{for(i=NR;i>0;i--)print a[i]}

3
Chào mừng đến với PPCG! Câu trả lời đầu tiên rất hay :)
HyperNeutrino

2

Hình tam giác , 31 byte

...)...
..IEM..
.DRs+}.
DRs+...

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

Giải trình

Loại bỏ các ký tự tạo nên phần đệm, đây là những gì chương trình thực hiện:

)IEMDRs+}DRs+ – Full program. Takes a matrix as a 2D list from STDIN.
)             – Push a 0 onto the stack.
 I            – Take the input at that index.
  E           – Evaluate it.
   M    }     – For each row...
    DR        – Duplicate and replace the second copy by its reverse.
      s+      – Swap and append.
         DR   – Duplicate the result and replace the second copy by its reverse.
           s+ – Swap and append.


2

APL + THẮNG, 11 byte

Nhắc cho một mảng 2d số nguyên.

m⍪⊖m←m,⌽m←⎕

2

Stax , 5 byte

:mm:m

Chạy và gỡ lỗi trực tuyến

:mcó nghĩa là gương, đó là input.concat(reverse(input)). m, trong ngữ cảnh này có nghĩa là đầu ra mỗi dòng sau khi áp dụng ...

Vì vậy, phản chiếu mảng của các hàng, và sau đó phản chiếu từng hàng và đầu ra.






2

Ruby , 35 byte

->a{r=->b{b+b.reverse}
r[a].map &r}

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

Một lambda chấp nhận một mảng 2D và trả về một mảng 2D. Thật đơn giản, nhưng dù sao đây cũng là phiên bản không có bản quyền:

->a{
  r=->b{ b+b.reverse } # r is a lambda that returns the argument and its reverse
  r[a].map &r          # Add the array's reverse, then add each row's reverse
}

2

Java 8, 140 131 byte

m->{String r="";for(int a=m.length,b=m[0].length,i=a+a,j;i-->0;r+="\n")for(j=b+b;j-->0;)r+=m[i<a?i:a+a+~i][j<b?j:b+b+~j];return r;}

Giải trình:

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

m->{                      // Method with integer-matrix parameter and String return-type
  String r="";            //  Result-String, starting empty
  for(int a=m.length,     //  Amount of rows of the input-matrix
          b=m[0].length,  //  Amount of columns of the input-matrix
          i=a+a,j;        //  Index integers
      i-->0;              //  Loop over double the rows
      r+="\n")            //    After every iteration: append a new-line to the result
     for(j=b+b;j-->0;)    //   Inner loop over double the columns
       r+=                //    Append the result with:
          m[i<a?          //     If `i` is smaller than the amount of rows
             i            //      Use `i` as index in the input-matrix
            :             //     Else:
             a+a+~i]      //      Use `a+a+i-1` as index instead
           [j<b?          //     If `j` is smaller than the amount of columns
             j            //      Use `j` as index in the input-matrix
            :             //     Else:
             b+b+~j];     //      Use `b+b+j-1` as index instead
  return r;}              //  Return the result-String

2

J , 11 byte

Chức năng tiền tố ẩn danh.

|:@(,|.)^:2

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

|: hoán vị

@(…) kết quả của:

, cuộc tranh cãi theo sau

|. nó đảo ngược

^:2 và tất cả điều này được thực hiện hai lần


2

SNOBOL4 (CSNOBOL4) , 119 113 byte

	T =TABLE()
I	X =X + 1
	I =INPUT	:F(D)
	OUTPUT =T<X> =I REVERSE(I)	:(I)
D	X =X - 1
	OUTPUT =GT(X) T<X>	:S(D)
END	

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

Lấy đầu vào dưới dạng chuỗi trên STDIN, không có khoảng trắng. Điều này chỉ hoạt động vì các chữ số được 1-9và sẽ thất bại.


Tôi có thể thấy tại sao mọi người không sử dụng ngôn ngữ này nữa. Điều này thật kỳ lạ.
Pavel

1
@Pavel SNOBOL thực sự là một ngôn ngữ khủng khiếp để làm việc. đây là một triển khai C hiện đại hơn của nó có các hàm dựng sẵn như REVERSE; số nguyên chỉ được hỗ trợ là tốt, theo như tôi có thể nói.
Giuseppe

2

C (gcc) , 114 111 byte

  • Đã lưu ba byte nhờ Kevin Cruijssen ; đảo ngược các vòng lặp.
j,i;f(A,w,h)int*A;{for(i=h+h;i-->0;puts(""))for(j=w+w;j-->0;)printf("%d,",A[(i<h?i:h+h+~i)*w+(j<w?j:w+w+~j)]);}

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

C (gcc) , 109 byte (lạm dụng dễ phân tích cú pháp)

  • Cảm ơn Kevin Cruijssen đã đề nghị chỉ cho phép số nguyên đầu vào một chữ số; lưu hai byte.
j,i;f(A,w,h)int*A;{for(i=h+h;i-->0;puts(""))for(j=w+w;j-->0;)putchar(A[(i<h?i:h+h+~i)*w+(j<w?j:w+w+~j)]+48);}

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


Bạn có thể lưu 3 byte bằng cách đảo ngược các vòng lặp. for(i=h+h;i-->0;puts(""))for(j=w+w;j-->0;)
Kevin Cruijssen

Không hoàn thành thông số kỹ thuật; in các mảng, thay vì trả lại nó.

" Để dễ phân tích cú pháp, bạn có thể giả sử tất cả chúng đều nằm trong khoảng từ 1 đến 9. ", vì vậy bạn có thể xóa dấu phẩy trong printf("%d"một byte -1 bổ sung.
Kevin Cruijssen

@Rogem Tôi sẽ nói rằng việc in mảng nằm trong i / o được chấp nhận.
Jonathan Frech

1
@KevinCruijssen Cảm ơn rất nhiều; bằng cách dễ dàng phân tích cú pháp tôi đã quản lý để loại bỏ một byte khác.
Jonathan Frech

2

Than , 5 byte

θ‖C→↓

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

Cảm ơn ASCII - chỉ cho định dạng đầu vào tốt hơn.


Tôi tự hỏi nếu định dạng đầu vào này là hợp lệ, vì tôi sợ Char than không thể xử lý đầu vào khác. Nếu không, tôi sẽ vui vẻ xóa câu trả lời này.
Erik the Outgolfer

Đây là hợp lệ I / o.
Pavel

@Pavel Tôi chỉ tự hỏi bởi vì bạn đã nói rằng "Chương trình của bạn sẽ nhận được một mảng số nguyên 2 chiều", trong khi một chuỗi là 1 chiều (và không, bên ngoài []không chính xác biến nó thành 2D).
Erik the Outgolfer

@ Than chỉ có ASCII thực sự cần một phương pháp I / O tốt hơn ...
Neil

@Neil Anh ấy đã không được ping ở đây, nhưng tôi đã ping anh ấy qua TNB. :)
Erik the Outgolfer


1

Julia 0,6 , 55 49 byte

~i=i:-1:1
!x=[x x[:,~end];x[~end,:] x[~end,~end]]

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

~(i)là một chức năng để tạo ra lát từ ixuống 1.
Vì vậy, ~endcho látend:-1:1

!(x) là chức năng để thực hiện việc xây dựng lại mảng.


1

V , 12 byte

yGæGPÎy$æ_|P

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

Giải trình:

yG              " Yank every line
  æG            " Reverse the order of the lines
    P           " Paste what we yanked
     Î          " On every line:
      y$        "   Yank the whole line
        æ_      "   Reverse the whole line
          |     "   Move to the beginning of the line
           P    "   Paste what we yanked
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.