Điểm cao nhất trên sân


18

Giới thiệu

Hãy để một lĩnh vực là một hình chữ nhật đầy chỉ các nhân vật -[0-9]. Một ví dụ về một lĩnh vực là:

11-011123
111-010--
0010---01
111-01234

Bạn thấy rằng lĩnh vực này đã được tách thành ba khu vực nhỏ hơn:

nhập mô tả hình ảnh ở đây

Để tính điểm của một khu vực nhỏ hơn, chúng ta chỉ cần thêm tất cả các số lên. Ví dụ:

11
111
0010
111

1 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 = 9

Tổng số điểm cho khu vực này là 9 . Bây giờ chúng tôi làm điều tương tự cho khu vực thứ hai:

   011123
    010

0 + 1 + 1 + 1 + 2 + 3 + 0 + 1 + 0 = 9

Tổng số điểm cũng là 9 . Bây giờ chúng ta phải kiểm tra khu vực cuối cùng:

       01
    01234

0 + 1 + 0 + 1 + 2 + 3 + 4 = 11

Điều này có tổng số điểm là 11 . Điểm số cao nhất trên sân là 11, vì vậy đây là những gì chúng ta cần đầu ra.

Nhiệm vụ

Cho một trường (dưới dạng chuỗi 2D, mảng, v.v.), xuất ra số điểm cao nhất trên trường. Bạn có thể giả định rằng các trường đã cho sẽ luôn chứa ít nhất 1 chữ số. Đây là , vì vậy bài nộp có số byte ít nhất sẽ thắng!

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

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

Input:
1

Output:
1

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

Input:
1-1-1-1
-1-1-1-
2-1-1-1
-1-1-1-

Output:
2

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

Input:
12-45-
4-65-9
87-654
12-487
45----
684764

Output:
69

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

Input:
111-12
------
21--10

Output:
3

1
Wow ... thử thách tốt đẹp.
R. Kap

"0010 --- 01" không phải là ["0010", "", "", "01"] thay vào đó?
Ven

còn "111-01234", tại sao không ["111", "01234"]?
Ven

Tôi không hiểu Tôi nghĩ rằng -các khu vực tách biệt? Bạn có thể làm cho phần "xác định một khu vực" rõ ràng hơn không?
Ven

bạn có thể vui lòng điều chỉnh lại các thách thức để giải thích điều đó?
Ven

Câu trả lời:


3

MATL , 54 51 49 byte

n:"G~1@(2Y6Z+leG45>1e*5M@)*]vtz:"otY*g]G48-X:*sX>

Đầu vào là một mảng char 2D ở định dạng MATL (AB), với ;dấu phân cách hàng. Các đầu vào trong ví dụ và trong các trường hợp thử nghiệm tương ứng là:

['11-011123';'111-010--';'0010---01';'111-01234']
['1']
['1-1-1-1';'-1-1-1-';'2-1-1-1';'-1-1-1-']
['12-45-';'4-65-9';'87-654';'12-487';'45----';'684764']
['111-12';'------';'21--10']

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

Giải trình

Điều này hoạt động bằng cách xây dựng một ma trận kề của biểu đồ được xác định bởi mối quan hệ "đang được kết nối". Ví dụ: xem xét trường 3 × 4

52-4
15-8
3-72

Các mục trong một mảng 2D được mô tả dễ dàng trong MATL bằng cách sử dụng lập chỉ mục tuyến tính (cột chính). Trong trường hợp 3 × 4, chỉ số tuyến tính của mỗi mục được đưa ra là

1  4  7 10
2  5  8 11
3  6  9 12

Ma trận kề được xây dựng theo các bước sử dụng phép nhân ma trận. Trong bước đầu tiên, hàng xóm ngay lập tức được xem xét. Ví dụ: điểm được lập chỉ mục 3 là hàng xóm của chính nó và điểm đó với chỉ số 2. Nó không phải là hàng xóm của 6 vì điểm đó không chứa một số theo trường. Trong ví dụ này, ma trận kề của mối quan hệ "hàng xóm ngay lập tức" là ma trận 12 × 12 L được cho là

1 1 0 1 0 0 0 0 0 0 0 0
1 1 1 0 1 0 0 0 0 0 0 0
0 1 1 0 0 0 0 0 0 0 0 0
1 0 0 1 1 0 0 0 0 0 0 0
0 1 0 1 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 1
0 0 0 0 0 0 0 0 0 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1
0 0 0 0 0 0 0 0 1 0 1 1

(Có thể thấy rằng cột 3 có giá trị 1ở hàng 2 và 3.) Ma trận này luôn đối xứng và đường chéo của nó có giá trị 1cho các điểm không chứa -.

Bước tiếp theo sẽ là ma trận kề của mối quan hệ "được kết nối với nhiều nhất một điểm ở giữa ". Để có được nó, nó đủ để nhân L với chính nó và đặt các mục nhập khác không 1. Nói chung, ma trận kề của mối quan hệ "được kết nối bởi một số đường dẫn", M , có được bằng cách nâng L lên một số mũ (theo nghĩa ma trận) đại diện cho độ dài đường dẫn tối đa có thể. Một trên ràng buộc của chiều dài đường truyền tối đa là số khác không mục trong L .

Tính toán công suất ma trận trực tiếp có thể gây ra tràn, vì số lượng lớn nhanh chóng xảy ra. Vì vậy, tốt hơn là nhân dần theo cùng một ma trận, chuyển đổi các mục nhập khác thành 1 sau mỗi bước để ngăn chặn số lượng lớn xây dựng.

Cột i của M đại diện cho các điểm được kết nối (bằng bất kỳ đường dẫn nào) với điểm i . Bây giờ, trường mức có thể được giảm xuống thành một vectơ cột c theo thứ tự tuyến tính, trong đó mỗi mục chứa số tương ứng hoặc giá trị không xác định cho -. Vì vậy, trong trường hợp này c sẽ là

5
1
3
2
5
-
-
-
7
4
8
2

Tương tự mỗi cột của M theo c phần tử khôn ngoan và tính tổng của mỗi cột cho, đối với mỗi điểm i , tổng số điểm của điểm khu vực i thuộc về. Một khu vực được xác định bởi tất cả các điểm được kết nối lẫn nhau. Lưu ý rằng nhiều cột sẽ cho kết quả tương tự; cụ thể, các cột ij sẽ cho cùng một tổng nếu các điểm ij được kết nối (thuộc cùng một khu vực). Kết quả cuối cùng là tối đa của những khoản tiền đó.

        % Implicitly take input: 2D char array
n:      % Range [1,...,N], where N is number of entries in the input
"       % For loop. Each iteration builds a row of matrix L
  G     %   Push input again
  ~     %   Logical negate: transform into matrix of zeros
  1     %   Push 1, to be written into a matrix entry
  @     %   Iteration index. Ranges from 1 to N
  (     %   Write that 1 into the N-th entry (linear order)
  2Y6   %   Push array [0 1 0; 1 1 1; 0 1 0]: mask of immediate neighbours
  Z+    %   Convolve and keep same-size result
  le    %   Linearize into row array
  G45>  %   Array of same size as the input that contains 1 for numbers, 0 for '-'
  1e    %   Linearize into row array
  *     %   Multiply element-wise
  5M    %   Push last array again: 1 for numbers, 0 for '-'
  @)    %   Get 0 or 1 value of that array corresponding to current iteration
  *     %   Multiply. This is to give a row of zeros for non-numbers
]       % End. We have all rows of L in the stack
v       % Concatenate all rows into a matrix: L.
tz:     % Duplicate. Range [1,...,K], where K is the number of nonzeros in L
"       % For loop. Repear K times. This loop computes the 0/1 matrix power
  o     %   Convert matrix entries to double
  tY*   %   Duplicate and matrix-multiply
  g     %   Convert to logical values, that is, nonzero values become 1
]       % End. We have matrix M
G48-    % Convert input chars to the corresponding numbers by subtractig 48
X:      % Linearize into column array. This is vector c
*       % Element-wise multiplication with broadcast (implicit repetition)
s       % Sum of each column. Gives a row array
X>      % Maximum of that row array
        % Implicitly display

3

JavaScript (ES6), 157 byte

s=>[...o=s].map((n,i)=>o=n<'.'|(a=[...s]).map(_=>a.map((c,j)=>c>'-'&c<10&(a[j+1]|a[j-1]|a[j+l]|a[j-l])>90?a[n-=-c,j]=99:0),a[i]=99)|o>n?o:n,l=~s.search`
`)|o

Giải trình

Lấy một trường đầu vào dưới dạng một chuỗi. Đối với mỗi số trong trường, tính tổng tất cả các số trong khu vực. Nó thực hiện điều này bằng cách lặp qua từng số trong trường nhiều lần, thêm số đó vào điểm nếu một ô liền kề chứa một số được đếm trước đó. Các số được tính là một phần của khu vực được thể hiện bằng cách đặt chúng thành 99 để chúng không được tính lại. Xuất ra số điểm cao nhất dưới dạng số.

var solution =

s=>
  [...o=s].map((n,i)=>o=n<'.'|             // for each number on the field
                                           // n = area score
      (a=[...s])                           // a = array of each field character
      .map(_=>                             // loop to ensure whole area is found
        a.map((c,j)=>                      // for each cell c at index j
          c>'-'&c<10&                      // if the current cell is a number
          (a[j+1]|a[j-1]|a[j+l]|a[j-l])>90 // and an adjacent cells is in the area
          ?a[n-=-c,j]=99:0                 // add the cell to the area
        ),                                 // and the number to the score
        a[i]=99                            // mark the starting cell as counted
      )
      |o>n?o:n,                            // o = output (max of o and n)
    l=~s.search`
`                                          // l = line length of field
  )
  |o                                       // return o
<textarea id="input" rows="6" cols="40">12-45-
4-65-9
87-654
12-487
45----
684764</textarea><br />
<button onclick="result.textContent=solution(input.value)">Go</button>
<pre id="result"></pre>


2

Bình thường, 93 byte

A,hlh.zjJ\-.zKsm?qdJd\#HD'b=KXKbJR+i@HbTsm?&&gd0<dlKq@Kd\#'d0[tbhb-bG+bG;Wh=NxK\#=+Y'N)h.MZY

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

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


Bước đầu tiên: đọc đầu vào

A,hlh.zjJ\-.zKsm?qdJd\#H
A,                           Assign the following to G and H:
  hlh.z                          G = increment(length(first(all_input())))
       jJ\-.z                    H = join(J="-",all_input())
                m       H    for d in H:
                 ?qdJ            if equal(d,J):
                     d               add d to the list
                                 else:
                      \#             add "#" to the list
                             end
               s             sum the list
              K              assign to K

Sample input:
11-011123
111-010--
0010---01
111-01234

G = 10
H = "11-011123-111-010---0010---01-111-01234" (note the extra dashes connecting each line)
J = "-"
K = "##-######-###-###---####---##-###-#####"

Bước thứ hai: xác định một chức năng để đánh giá một khu vực

D'b=KXKbJR+i@HbTsm?&&gd0<dlKq@Kd\#'d0[tbhb-bG+bG;
D'b                                             ;  def quote(b):
   =KXKbJ                                              K[b] = J
         R+                                            return the sum of A and B, where:
           i@HbT                                         A = to_integer(H[b],10)

                 m                   [tbhb-bG+bG         for d in {dec(b), inc(b), minus(b,G), add(b,G)}:
                  ?&&                                      if .... and ........ and ............... :
                     gd0                                      d>=0
                        <dlK                                           d<len(K)
                            q@Kd\#                                                  equal(K[d],"#")
                                  'd                           add quote(d) to temp_list
                                                           else:
                                    0                          add 0 to temp_list
                s                                        B = sum(temp_list)

Basically, this function (quote) is given a starting
point (b), and then recursively find its neighbour and
add their values to the output.

Bước thứ ba: đọc tất cả các lĩnh vực và tìm mức tối đa được yêu cầu

Wh=NxK\#=+Y'N)h.MZY
Wh=NxK\#     )         while inc(N=find(K,"#")):   --while K still has "#"
        =+Y'N              Y+= quote(N)
               .MZY    find the maximum of Y,
              h        then print the first.
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.