Hình vuông ô nhiễm


17

Giới thiệu

Chúng ta hãy quan sát hình vuông sau, chỉ bao gồm các chữ số 0 - 9:

1034
4167
8414
3542

Vỏ ngoài của hình vuông này là:

1034
4  7
8  4
3542

Nó chứa các số không, vì vậy chúng ta cần bóc lớp vỏ bên ngoài, để lại:

16
41

Vỏ ngoài của hình vuông này là:

16
41

không chứa bất kỳ số không và do đó là một hình vuông không bị ô nhiễm . Về cơ bản, định nghĩa của một hình vuông không bị ô nhiễm là khi lớp vỏ ngoài của hình vuông không chứa số không.

Nhiệm vụ

Cho một hình vuông các chữ số (chỉ chứa các số nguyên không âm) ở bất kỳ định dạng hợp lý nào, tạo ra ô vuông không bị ô nhiễm lớn nhất bằng cách liên tục bóc lớp vỏ bên ngoài, ở bất kỳ định dạng hợp lý nào.

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

Trường hợp thử nghiệm 1:

Input         Output

1234          1234
2345          2345
3456          3456
4567          4567

Trường hợp thử nghiệm 2:

Input         Output

123           123
204           204
346           346

Trường hợp thử nghiệm 3:

Input         Output

101           1
010           
101           

Trường hợp thử nghiệm 4:

Input         Output

000           (none)
000
000

Đây là , vì vậy bài nộp có số byte ít nhất sẽ thắng!


Tôi không thể làm ví dụ 416\n841\n354\n(góc dưới bên trái)?
Nữ tu bị rò rỉ

Chà, bạn đã nói " quảng trường không bị ô nhiễm lớn nhất "
Leaky Nun

Được phép lỗi?
Leaky Nun

@KennyLau Ý bạn là ở trường hợp kiểm tra cuối cùng? Có, miễn là nó không xuất ra 0hoặc một cái gì đó tương tự.
Ad Nam

2
"Bình phương số" sẽ được nói rõ hơn là "bình phương số"
Mego

Câu trả lời:


6

Thạch , 19 16 byte

Fœ^F}P
ḊṖZµ⁺⁸ßç?

Hãy thử trực tuyến!hoặc xác minh tất cả các trường hợp thử nghiệm .

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

ḊṖZµ⁺⁸ßç?  Main link. Argument: M (2D list)

Ḋ          Dequeue; remove the first row.
 Ṗ         Pop; remove the last row.
  Z        Zip; transpose rows with columns.
   µ       Combine the chain to the left into a link.
    ⁺      Copy the link, executing it twice.
           The copy removes the first and last column and restores the orientation.
       ç?  If the helper link returns a non-zero integer:
     ⁸       Return M unmodified.
      ß      Else, recursively call the main link on the "peeled" M.


Fœ^F}P     Helper link. Arguments: P ("peeled" M), M (unmodified)

F          Flatten P.
   F}      Flatten M.
 œ^        Perform multiset symmetric difference, removing the elements of P from
           the elements of M, respecting multiplicities, leaving precisely the
           elements of the outer shell.
     P     Return the product of the remaining elements.

8

JavaScript, 105 97 byte

Đã lưu 8 byte nhờ @Patrick Roberts!

l=a=>a.slice(1,-1)
p=a=>l(a).map(l)
c=a=>a.join``.replace(/[^0]/g,"")
s=a=>c(p(a))<c(a)?s(p(a)):a

Xác định hàm s, trả về một mảng số nguyên 2D khi được cung cấp một mảng số nguyên 2D làm đầu vào.

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

  • Hàm l: đưa ra một mảng a, trả về một bản sao không có chỉ mục đầu tiên và cuối cùng.

  • Hàm p: đưa ra một mảng 2D a, gọi lđể xóa hàng đầu tiên và hàng cuối cùng, sau đó cho mỗi lệnh gọi còn lại lđể xóa cột đầu tiên và cột cuối cùng. Điều này thực hiện lột hành tây.

  • Hàm c: đã cho một mảng 2D a, trả về một chuỗi chỉ chứa 0s ở dạng chuỗi a.

  • Hàm s: đưa ra một mảng 2D a, gọi ccác dạng bóc của mảng được cung cấp bởi pvà trên chính mảng đó. So sánh các chuỗi này theo từ vựng để xác định xem dạng bóc có ít 0s hơn bản gốc hay không. Nếu có, thì bản gốc bị ô nhiễm, vì vậy hãy gọi sđệ quy trên mẫu đã bóc. Nếu không thì trả lại bản gốc.


2
Bạn có thể xóa a.lengthkhỏi endđối số array.slicetrong lvà lưu 8 byte. endđược phép là một chỉ số tiêu cực.
Patrick Roberts

7

Võng mạc , 60 57 byte

Số lượng byte giả định mã hóa ISO 8859-1. Các linefeed trailing là đáng kể.

+`(?<=(?=.*0|[^_]+(¶0|0¶|0.*$))^[^_]*)(^.+¶|¶.+$|.?\b.?)

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

Giải trình

Do nguồn cấp dữ liệu theo dõi, điều này tìm thấy tất cả các kết quả khớp của biểu thức chính sau `và loại bỏ chúng khỏi đầu vào. Do việc dẫn đầu, +điều này được thực hiện lặp đi lặp lại cho đến khi đầu ra dừng thay đổi (điều này sẽ do regex sẽ ngừng khớp).

Đối với bản thân regex, nó bao gồm hai phần:

(?<=(?=.*0|[^_]+(¶0|0¶|0.*$))^[^_]*)

Phần này kiểm tra xem có 0chỗ nào ở vỏ ngoài không. Nó thực hiện điều này bằng cách di chuyển "con trỏ" của công cụ regex đến đầu chuỗi bằng giao diện (chúng tôi sử dụng [^_]để khớp cả hai chữ số và nguồn cấp dữ liệu):

(?<=...^[^_]*)

Và sau đó từ vị trí đó, chúng tôi sử dụng một cái nhìn để tìm một 0trong dòng đầu tiên, liền kề với một nguồn cấp dữ liệu hoặc trong dòng cuối cùng:

(?=.*0|[^_]+(¶0|0¶|0.*$))

Sau đó, kết quả khớp thực tế sẽ bao gồm một trong hai dòng đầu tiên (bao gồm cả dòng tiếp theo của nó), dòng cuối cùng (bao gồm cả dòng cấp hàng đầu của nó) hoặc ký tự đầu tiên hoặc cuối cùng của dòng, trong đó chúng ta lạm dụng ranh giới từ \blàm đầu / cuối của dòng mỏ neo:

(^.+¶|¶.+$|.?\b.?)

6

MATL , 26 21 byte

t"t5LY)y5LZ)h?}6Lt3$)

Đầu vào có định dạng sau

[1 0 3 4; 4 1 6 7; 8 4 1 4; 3 5 4 2]

Vì vậy, bốn trường hợp thử nghiệm khác là

[1 2 3 4; 2 3 4 5; 3 4 5 6; 4 5 6 7]
[1 0 1; 0 1 0; 1 0 1]
[1 2 3; 2 0 4; 3 4 6]
[0 0 0; 0 0 0; 0 0 0]

Các lỗi chương trình trong trường hợp thử nghiệm cuối cùng, nhưng tạo ra đầu ra chính xác (không có gì). Cảm ơn @Dennis đã chú ý!

Hãy thử trực tuyến! . Hoặc xác minh tất cả các trường hợp thử nghiệm (điều này bao gồm mã gói).

Giải trình

Điều này lặp đi lặp lại nhiều lần như số lượng cột trong ma trận đầu vào, quá đủ. Ở mỗi lần lặp, shell được loại bỏ hoặc giữ tùy thuộc vào giá trị của nó.

t            % Take a matrix as input. Duplicate
"            % For each column (i.e. repeat that many times)
  t5LY)      %   Duplicate top of the stack. Extract first and last rows
  y5LZ)      %   Duplicate the element below the top. Extract first and last columns
  h          %   Concatenate the two arrays into a row vector
  ?          %   If all its entries are non-zero: do nothing
  }          %   Else
    6Lt3$)   %     Get the central part
             % End if, end for. Implicitly display

5

Bình thường, 19 byte

.W}\0.-`H`JutCPG2HJ

Bộ kiểm tra

.W}\0.-`H`JutCPG2HJ
.W                     While the first function returns true, apply the second
                       function, starting with the input.
           u    2H     Apply the following twice to the input:
              PG       Remove the last row
             C         Transpose
            t          Remove the first row
                       This removes the outermost shell.
          J            Save it to J
         `             Stringify the matrix
       `H              Stringify the input
     .-                Multiset difference
  }\0                  Check if there is a '0' in the resulting string.
                  J    If that succeeds, update the current value to J.
                       When it fails, return the current value.

4

JavaScript (ES6), 74 byte

f=s=>/^.*0|0\n|\n0|0.*$/.test(s)?f(s.replace(/^.*\n?|.(.*).|\n.*$/g,"$1")):s

Đưa đầu vào dưới dạng một chuỗi với các dòng mới phân tách từng hàng (nhưng không có dòng mới hàng đầu hoặc dấu). Giải thích: /^.*0|0\n|\n0|0.*$/là một biểu thức chính quy phù hợp với các ô vuông bị ô nhiễm, trong khi /^.*\n?|.(.*).|\n.*$/khớp với các phần của hình vuông cần phải xóa, ngoại trừ phần (.*)cần giữ lại. (Điều này ngắn hơn so với việc nhìn về phía trước hoặc phía sau cho ký tự dòng mới.)


4

Perl 5, 63 + 3 = 66 byte

$_=<>;s/\A.*\n?|^.|.$|\n.*\Z//mg while/\A.*0|0$|^0|0.*\Z/;print

Yêu cầu -0cờ. Đầu vào không được chứa ký tự dòng mới.


3

Pyke, 29 byte

"D3lt%sBR,"2*ER3*I
/)tOmtmOr;

Hãy thử nó ở đây!

Ngoài ra 29 byte

QeQhQmhQme]4sBI
/)QtOmtmO=Qr;

Hãy thử nó ở đây!


2
Tôi nhận được lỗi trong cả hai liên kết. Chúng ta có cần phải làm gì trước khi nhấn "chạy" không!
Luis Mendo

Tôi có lẽ nên đề cập rằng sẽ luôn có một lỗi khi chạy. Đầu ra nằm trên dòng thứ hai ở đâu đó (Nó thực sự được in và không phải là một phần của thông báo lỗi)
Blue

2

Bình thường , 31 30 byte

L+hbeb.W!*F+1iRTs+yHyMHPtmPtdZ

Bộ thử nghiệm. (Lỗi testcase cuối cùng)

Cải thiện: tạo một phần của trình trích xuất vòng ngoài một hàm ( L+hbeb).

Phiên bản 31 byte trước:

.W!*F+1iRTs++hHm+hdedHeHPtmPtdZ

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

Mã về cơ bản là: trong khi sản phẩm của đầu ra bằng không, hãy bóc nó.

Hãy để chúng tôi phân tích mã chính (Q được ẩn ở đây):

.W<lambda:H><lambda:Z>Q

Bắt đầu từ Q(đầu vào), whilelambda đầu tiên, thực hiện lambda thứ hai.

Phần đầu tiên sẽ là lambda trong H:

!*F+1iRTs++hHm+hdedHeH

Phần thứ hai sẽ là lambda trong Z:

PtmPtdZ

Phần đầu tiên

!*F+1iRTs++hHm+hdedHeH

Hãy để chúng tôi phân tích điều này:

s++hHm+hdedHeH

s++             Concatenate:
   hH              1. the first row
     m+hdedH       2. the first and last item of each row
            eH     3. the last row

Vì Pyth sử dụng ký hiệu tiền tố , nên điều này sẽ được đánh giá:

!*F+1iRT

     iRT  Convert each to integer
 *F+1     Product
!         Negate. If any element of the outer shell is zero, this would return 1.

Phần thứ hai

PtmPtdZ
  mPtdZ   the inner of each row
Pt        the inner rows

2

Toán học, 78 byte

NestWhile[#[[a=2;;-2,a]]&,#,Count[{#[[b={1,-1}]],#[[;;,b]]},0,3]>0&]~Check~{}&

Hàm ẩn danh, lấy đầu vào làm ma trận. Bỏ qua bất kỳ lỗi nào có thể dẫn đến trong khi thực hiện.

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.