Tìm số có tổng hàng xóm cao nhất


12

Các thách thức

Cho một lưới các số (10 <= N <= 99) Trả về số có tổng cao nhất trong bốn số liền kề với nó; đó là các số ở trên, dưới, phải và trái của số, nhưng không phải là chính nó.

  1. Con số không được tính, chỉ có bốn người hàng xóm của nó.
  2. Một số trên cạnh phải được xử lý như thể số còn thiếu là 0.
  3. Tôi sẽ thiết kế thử nghiệm để tránh quan hệ.
  4. Số sẽ không lặp lại.
  5. Đây là .

Thí dụ

Được

56 98 32 96
12 64 45 31
94 18 83 71

Trở về

18

Một thử nghiệm thực sự

Được

98 95 67 66 57 16 40 94 84 37
87 14 19 34 83 99 97 78 50 36
18 44 29 47 21 86 24 15 91 61
60 41 51 26 10 58 11 62 55 71
42 85 56 12 46 81 93 65 49 77
89 13 74 39 54 76 92 33 82 90
96 88 70 79 80 28 25 20 75 68
38 63 17 72 53 48 73 30 45 69
64 35 32 31 23 43 22 52 27 59

Trở về

13

Được

82 43 79 81 94 36 17 64 58
24 52 13 87 70 18 28 61 69
16 99 75 21 50 44 89 90 51
49 80 63 31 54 65 41 55 38
67 91 76 78 23 86 83 14 73
46 68 62 77 34 48 20 74 10
33 35 26 97 59 66 25 37 32
12 92 84 27 85 56 22 40 45
96 15 98 53 39 30 88 71 29
60 42 11 57 95 19 93 72 47

Trở về

15

1
" Một số ở cạnh có thể được coi như thể số còn thiếu là 0. " - Điều đó ngụ ý rằng chúng ta có một lựa chọn là làm thế nào để xử lý các số trên một cạnh của lưới. Do đó, chúng ta có thể chọn quấn quanh phía bên kia của lưới không?
Xù xì

@Shaggy Không. Điều đó có thể thay đổi kết quả mong đợi. Tất cả hãy làm theo cùng một cách. Văn bản được cập nhật s / can / nên /
Ô

2
chờ đợi câu trả lời MATL không thể tránh khỏi
Gây tử vong vào

Tôi nhận thấy hầu hết các giải pháp làm thay đổi đầu vào theo một cách nào đó. Đó có phải là thông thường ở đây? Giải pháp của tôi (chưa được đăng) bao gồm các byte cần thiết để thay đổi đầu vào và tôi tự hỏi tại sao nhiều người khác không làm như vậy.
Ô

1
@Umhima Chúng tôi thường không quan tâm nếu đầu vào bị sửa đổi. Chúng tôi quan tâm đến mã ngắn, không phải mã sạch. Miễn là đầu ra đúng, chúng ta có xu hướng khá dễ dãi.

Câu trả lời:


9

MATL , 20 15 13 12 byte

t1Y6Z+tuX>=)

Đã lưu 5 byte nhờ Emigna, 2 nhờ Giuseppe và một lời cảm ơn khác nhờ Luis Mendo.
Hãy thử trực tuyến!

Giải trình

t1Y6Z+tuX>=)
t                  Duplicate the (implicit) input.
 1Y6               Push the array [0 1 0; 1 0 1; 0 1 0].
    Z+             Convolve with the input.
       uX>         Get the maximum unique element...
      t   =        ... and compare elementwise.
           )       Index into the input.

6

APL (Dyalog Unicode) , 31 27 26 24 23 byte SBCS

-2 nhờ bò lang băm. -1 cảm ơn ngn.

Chức năng tiền tố ẩn danh. Lấy một ma trận làm đối số. Giả sử ⎕IO( I ndex O rigin) 0là mặc định trên nhiều hệ thống.

{⊃⍒,(+/--/)⊢∘,⌺3 3⊢⍵}⊃,

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

, ravel (làm phẳng) đầu vào

{... }⊃ chọn một phần tử từ đó theo kết quả của hàm sau:

⊢⍵ mang lại đối số (tách 3 3từ )

 ... ⌺3 3 áp dụng các chức năng sau đây để mỗi 3-by-3 khu phố:

  ⊢∘, bỏ qua các thông tin cạnh có lợi cho khu phố (bị san phẳng)

  (... ) áp dụng các chức năng ngầm sau những

   -/ tổng xen kẽ (giảm trừ liên kết phải)

   +/- trừ đi từ tổng (cái này cho tổng của mọi phần tử khác)

, ravel (flatten) mà (tổng số hàng xóm)

 tạo ra các chỉ số sẽ sắp xếp

 chọn đầu tiên (tức là chỉ số của tổng cao nhất)


Đó là nhanh chóng. Bạn đã chuẩn bị chưa? ;)
Ô

3
@Umhima Không, tôi chỉ sử dụng ngôn ngữ lập trình nhanh chóng để lập trình.
Adám

3
Cái này {⊃⍒,{+/1↓⍉4 2⍴⍵}⌺3 3⊢⍵}⊃,thế nào Chỉnh sửa: hoặc thậm chí{⊃⍒,{⊢/+⌿4 2⍴⍵}⌺3 3⊢⍵}⊃,
Kritixi Lithos

@Cowsquack Mình luôn quên mánh khóe đó.
Adám

2
-1 byte:{⊃⍒,(+/--/)⊢∘,⌺3 3⊢⍵}⊃,
ngn

5

Thạch , 22 byte

;€0ZṙØ+SṖ
,ZÇ€Z+$/ŒMœị

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

Không có tích hợp tích hợp như MATL và Dyalog Quên ngôn ngữ của bạn có tích hợp tích chập (cảm ơn bạn @dylnan), nhưng chúng ta có thể làm được mà không cần chúng, một phần nhờ ŒMœị. Đầu tiên, một hàm trợ giúp để tính toán các hàng xóm chỉ theo một hướng, tình cờ chuyển đổi đầu vào:

;€0Z         Append a zero to each row, then transpose.
    ṙØ+S     Rotate by +1 and −1 (Ø+ = [1,-1]) and sum these.
        Ṗ    Pop the last row.

Trực quan, tính toán là:

1 2 3   ;€0   1 2 3 0   Z   1 4 7   ṙØ+     2 5 8   0 0 0     S   2  5  8   Ṗ   2  5  8
4 5 6  ————→  4 5 6 0  ——→  2 5 8  ————→  [ 3 6 9 , 1 4 7 ]  ——→  4 10 16  ——→  4 10 16
7 8 9         7 8 9 0       3 6 9           0 0 0   2 5 8         2  5  8       2  5  8
                            0 0 0           1 4 7   3 6 9         4 10 16

Giải thích: ô (x, y) của kết quả này là tổng của hàng xóm nằm ngang của ô (y, x). (Ví dụ: ở đây chúng ta thấy rằng f (A) [2,3] = 16 = 7 + 9 = A [3,1] + A [3,3] .)

Sau đó, chức năng chính:

,ZÇ€            Pair the input with its transpose and apply helper to both.
    Z+$/        Fold by Z+, i.e., turn [X,Y] into transpose(X)+Y.
                Now we've summed the horizontal and vertical neighbors for each cell.
        ŒM      Find the 2D index of the maximal value.
          œị    2D-index (into the original input).

1
Thế còn æc?
dyl Nam

ồ, tôi không biết về nó :) Tôi quá bận để chơi gôn nhiều hơn nên cứ thoải mái viết câu trả lời bằng nó.
Lynn

5

Thạch , 18 byte

5BæcµḊṖ)
ZÇZ+ÇŒMœị

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

Hàm trợ giúp tìm hàng xóm của mỗi phần tử trong mỗi hàng. Hàm chính thực hiện điều này cho các hàng và các cột sau đó tìm phần tử có tổng vùng lân cận tối đa.

5BæcµḊṖ)
5B           bin(5): 1,0,1
  æc         Convolve with [[1,2,9],[other rows]] (for example): [[1,2,10,2,9],...]
    µ        New chain.
       )     Apply this to each element:
     Ḋ       Remove the first element.
      Ṗ      Remove the last element.
             Gives [[2,10,2],...]

ZÇZ+ÇŒMœị   
Z            Zip the matrix
 Ç           Apply helper function
  Z          Zip again. Yields the sum of the vertical neighbors of each element.
   +         Add:
    Ç        The sum of each element's horizontal neighbors.
     ŒM      Find the multidimensional index of the maximal element.
       œị    Index back into the original matrix.



2

Macintosh , 1 + 10 = 11 byte (không cạnh tranh)

Tùy chọn dòng lệnh:  1 tính toán 1 thế hệ

y⊃⍨⊃⍒,
+/N

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

y từ đầu vào ban đầu phẳng
⊃⍨  chọn
 đầu tiên
 theo thứ tự giảm dần
,  của dẹt

+/ tổng của
N  các khu phố von neumanN không có bản thân


Tất nhiên, có một ngôn ngữ với một ký tự được tích hợp cho hàng xóm.
Ô

1
Để công bằng, mục đích duy nhất của nó là để giải quyết các loại vấn đề .
Adám

Tại sao nó không cạnh tranh?
Kevin Cruijssen

1
@KevinCruijssen Tôi đã thêm vào y ngôn ngữ khi tôi thấy rằng nó cần truy cập dễ dàng hơn vào đầu vào ban đầu. Trước đó, bạn phải viết (,⍎'input')thay vì y.
Adám

1
@ Adám Ah ok, yeah, vậy thì nó thực sự không cạnh tranh. Không nhận thấy thách thức đã được đăng ngày hôm qua. Nếu đó là một thách thức cũ, không cạnh tranh vì ngôn ngữ (hoặc phiên bản ngôn ngữ) mới hơn sẽ không khiến nó không cạnh tranh được nữa trong meta hiện tại .
Kevin Cruijssen

2

JavaScript (ES6), 94 byte

a=>a.map(p=m=(r,y)=>p=r.map((v,x)=>(s=~r[x-1]+~p[x]+~(a[y+1]||0)[x]+~r[x+1])>m?v:(m=s,o=v)))|o

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

Làm sao?

Thay vì tìm kiếm tối đa tổng của 4 người hàng xóm, chúng tôi tìm kiếm tối thiểu m trong tổng số s của phần bổ sung của họ. Điều này cho phép chúng tôi xử lý các giá trị không xác định giống như số không, bởi vì:

~undefined === -1
~0 === -1

Bản đồ bên trong () được viết theo cách mà nó không làm thay đổi nội dung của hàng r . Do đó, chúng ta có thể lưu kết quả của nó trong p để kiểm tra các hàng xóm hàng đầu trong lần lặp tiếp theo.

Chúng tôi sử dụng:

  • ~r[x-1] cho ô bên trái
  • ~r[x+1] cho đúng ô
  • ~p[x] cho các tế bào hàng đầu
  • ~(a[y+1]||0)[x] cho ô dưới cùng


1

Java 8, 187 byte

m->{int r=0,l=m.length,i=l,L,j,S=0,s;for(;i-->0;)for(L=j=m[i].length;j-->0;)if((s=(i<1?0:m[i-1][j])+(i<l-1?m[i+1][j]:0)+(j<1?0:m[i][j-1])+(j<L-1?m[i][j+1]:0))>S){S=s;r=m[i][j];}return r;}

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

Giải trình:

m->{                           // Method with integer-matrix parameter and integer return
  int r=0,                     //  Result-integer, starting at 0
      l=m.length,              //  Amount of rows
      i=l,                     //  Rows index integer
      L,                       //  Amount of columns
      j,                       //  Column index integer
      S=0,                     //  Largest sum of four cells
      s;                       //  Current sum of four cells
  for(;i-->0;)                 //  Loop over the rows
    for(L=j=m[i].length;j-->0;)//   Inner loop over the columns
      if((s=                   //    Set the current sum to: the sum of:
           (i<1?0:m[i-1][j])   //     Value of the cell to the left, or 0 if out of bounds
          +(i<l-1?m[i+1][j]:0) //     Value of the cell to the right, or 0 if out of bounds
          +(j<1?0:m[i][j-1])   //     Value of the cell down, or 0 if out of bounds
          +(j<L-1?m[i][j+1]:0))//     Value of the cell up, or 0 if out of bounds
         >S){                  //    If this current sum is larger than the largest sum:
        S=s;                   //     Replace the largest sum with this current sum
        r=m[i][j];}            //     And set the result to the current cell
  return r;}                   //  Return the result

1

Javascript ES6, 170 byte

c=g=>{s=0;n=0;f=m=>m||[];for(i=0;i<g.length;i++)for(j=0;j<g[i].length;j++){s=~~f(g[i-1])[j]+~~f(g[i+1])[j]+~~f(g[i])[j-1]+~~f(g[i])[j+1];b=s>n?g[i][j]+!(n=s):b;}return b}

1
Chào mừng đến với PPCG! Mã của bạn dường như cho rằng đầu vào được lưu trữ trong một biến có tên g , không được phép . Bạn nên viết một chương trình đầy đủ đọc đầu vào hoặc hàm (thường là và theo cách ưa thích trong JS).
Arnauld

1
@Arnauld Cảm ơn bạn! Tôi đã sửa mã
Jean-Philippe Leclerc

Bạn có thể xem xét thêm liên kết TIO để dễ kiểm tra hơn. (Tôi đã xóa trường hợp thử nghiệm thứ 2 để có liên kết phù hợp trong một nhận xét.)
Arnauld
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.