Hàng xóm của ai là thù địch?


10

Giới thiệu

Với mục đích của thử thách này, chúng tôi sẽ xác định các lân cận của một phần tử trong ma trận vuông (sao cho ) là tất cả các mục nhập của liền kề theo đường chéo, theo chiều ngang hoặc chiều dọc với (tức là họ "bao quanh" , không quấn quanh).A E = A i , j A E EEAE=Ai,jAE E

Đối với trẻ em, một định nghĩa chính thức về các lân cận của cho một matix là (0-indexed): trong đó n×nAi,jn×nN i ,AE i ,

Ni,j={Aa,b(a,b)Ei,j([0,n)Z)2}
ETôi,j= ={Tôi-1,Tôi,Tôi+1}×{j-1,j,j+1} \ {Tôi,j}

Giả sử phần tử tại chỉ mục tồn tại thù địch nếu nó tương ứng với tất cả các hàng xóm của nó (nghĩa là, ). Đáng buồn thay, mục nhập nghèo nàn này không thể mượn thậm chí một tách đường từ những cư dân thô lỗ gần đó ...Tôi,jgcd(MộtTôi,j,n)= =1nNTôi,j

Bài tập

Đủ các câu chuyện: Cho ma trận vuông M gồm các số nguyên dương, xuất ra một trong các cách sau:

  • Một danh sách phẳng các phần tử (được lặp lại hoặc không) cho biết tất cả các mục chiếm một số chỉ số trong sao cho các hàng xóm là thù địch.M N i ,Tôi,jMNTôi,j
  • Một ma trận boolean có s tại các vị trí mà hàng xóm là thù địch và khác (bạn có thể chọn bất kỳ giá trị nhất quán nào khác thay cho và ).0 0 11001
  • Danh sách các cặp chỉ số đại diện cho các vùng lân cận thù địch.Tôi,j

Tham chiếu thực hiện trong Physica - cũng hỗ trợ cú pháp Python cho I / O. Bạn có thể lấy đầu vào và cung cấp đầu ra thông qua bất kỳ phương thức tiêu chuẩn nào và ở bất kỳ định dạng hợp lý nào, trong khi lưu ý rằng các lỗ hổng này bị cấm theo mặc định. Đây là mã golf, vì vậy mã ngắn nhất tính bằng byte (bằng mọi ngôn ngữ) sẽ thắng!

Hơn nữa, bạn cũng có thể lấy kích thước ma trận làm đầu vào và ngoài ra có thể lấy ma trận làm danh sách phẳng vì nó sẽ luôn là hình vuông.

Thí dụ

Hãy xem xét ma trận sau:

(641014272232535836)

Hàng xóm tương ứng của mỗi yếu tố là:

i j – E  -> Neighbours                          | All coprime to E?
                                                |
0 0 – 64 -> {10; 27; 22}                        | False
0 1 – 10 -> {64; 14; 27; 22; 32}                | False
0 2 – 14 -> {10; 22; 32}                        | False
1 0 – 27 -> {64; 10; 22; 53; 58}                | True
1 1 – 22 -> {64; 10; 14; 27; 32; 53; 58; 36}    | False
1 2 – 32 -> {10; 14; 22; 58; 36}                | False
2 0 – 53 -> {27; 22; 58}                        | True
2 1 – 58 -> {27; 22; 32; 53; 36}                | False
2 2 – 36 -> {22; 32; 58}                        | False

Và do đó, đầu ra phải là một trong những điều sau đây:

  • {27; 53}
  • {{0; 0; 0}; {1; 0; 0}; {1; 0; 0}}
  • {(1; 0); (2; 0)}

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

Input –> Version 1 | Version 2 | Version 3

[[36, 94], [24, 69]] ->
    []
    [[0, 0], [0, 0]]
    []
[[38, 77, 11], [17, 51, 32], [66, 78, 19]] –>
    [38, 19]
    [[1, 0, 0], [0, 0, 0], [0, 0, 1]]
    [(0, 0), (2, 2)]
[[64, 10, 14], [27, 22, 32], [53, 58, 36]] ->
    [27, 53]
    [[0, 0, 0], [1, 0, 0], [1, 0, 0]]
    [(1, 0), (2, 0)]
[[9, 9, 9], [9, 3, 9], [9, 9, 9]] ->
    []
    [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
    []
[[1, 1, 1], [1, 1, 1], [1, 1, 1]] ->
    [1, 1, 1, 1, 1, 1, 1, 1, 1] or [1]
    [[1, 1, 1], [1, 1, 1], [1, 1, 1]]
    [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
[[35, 85, 30, 71], [10, 54, 55, 73], [80, 78, 47, 2], [33, 68, 62, 29]] ->
    [71, 73, 47, 29]
    [[0, 0, 0, 1], [0, 0, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]]
    [(0, 3), (1, 3), (2, 2), (3, 3)]

Mượn thứ từ hàng xóm thù địch? Vì một số lý do, điều này làm tôi nhớ đến trò chơi Hover Bovver của Jeff Minter ...
Arnauld

Chúng ta có thể lấy kích thước ma trận làm đầu vào không?
Delfad0r

@ Delfad0r Tôi luôn quên đề cập đến điều đó. Có, bạn có thể lấy kích thước ma trận làm đầu vào.
Ông Xcoder

Câu trả lời:


3

APL (Dyalog) , 17 byte

1=⊢∨(×/∘,↓)⌺3 3÷⊢

Hãy thử trực tuyến! (tín dụng cho ngn để dịch các trường hợp thử nghiệm sang APL)

Giải thích ngắn gọn

(×/∘,↓)⌺3 3 có được sản phẩm của từng yếu tố với hàng xóm của nó.

Sau đó, tôi chia theo đối số ÷⊢, sao cho mỗi mục trong ma trận đã được ánh xạ tới sản phẩm của các hàng xóm.

Cuối cùng, tôi lấy gcd của đối số với ma trận này ⊢∨và kiểm tra sự bằng nhau với 1,1=

Lưu ý, như với câu trả lời của ngn , điều này không thành công đối với một số đầu vào do lỗi trong trình thông dịch.


2

JavaScript (ES6), 121 byte

Trả về một ma trận các giá trị Boolean, trong đó false có nghĩa là thù địch.

m=>m.map((r,y)=>r.map((v,x)=>[...'12221000'].some((k,j,a)=>(g=(a,b)=>b?g(b,a%b):a>1)(v,(m[y+~-k]||0)[x+~-a[j+2&7]]||1))))

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

Làm sao?

Phương pháp được sử dụng để phân lập 8 lân cận của mỗi ô tương tự như phương pháp tôi mô tả ở đây .

Đã bình luận

m =>                            // m[] = input matrix
  m.map((r, y) =>               // for each row r[] at position y in m[]:
    r.map((v, x) =>             //   for each value v at position x in r[]:
      [...'12221000']           //     we consider all 8 neighbors
      .some((k, j, a) =>        //     for each k at position j in this array a[]:
        ( g = (a, b) =>         //       g is a function which takes 2 integers a and b
            b ?                 //       and recursively determines whether they are
              g(b, a % b)       //       coprime to each other
            :                   //       (returns false if they are, true if they're not)
              a > 1             //
        )(                      //       initial call to g() with:
          v,                    //         the value of the current cell
          (m[y + ~-k] || 0)     //         and the value of the current neighbor
          [x + ~-a[j + 2 & 7]]  //
          || 1                  //         or 1 if this neighbor is undefined
  ))))                          //         (to make sure it's coprime with v)

2

MATL , 22 byte

tTT1&Ya3thYC5&Y)Zd1=A)

Đầu vào là một ma trận. Đầu ra là tất cả các số với hàng xóm thù đị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 .

Giải thích với ví dụ làm việc

Hãy xem xét đầu vào [38, 77, 11; 17, 51, 32; 66, 78, 19]là một ví dụ. Nội dung ngăn xếp được hiển thị từ dưới lên trên.

t         % Implicit input. Duplicate
          % STACK: [38, 77, 11;
                    17, 51, 32;
                    66, 78, 19]
                   [38, 77, 11;
                    17, 51, 32;
                    66, 78, 19]
TT1&Ya    % Pad in the two dimensions with value 1 and width 1
          % STACK: [38, 77, 11;
                    17, 51, 32;
                    66, 78, 19]
                   [1,  1,  1,  1,  1;
                    1,  38, 77, 11, 1;
                    1,  17, 51, 32, 1;
                    1,  66, 78, 19, 1
                    1,  1,  1,  1,  1]
3thYC     % Convert each sliding 3×3 block into a column (in column-major order)
          % STACK: [38, 77, 11;
                    17, 51, 32;
                    66, 78, 19]
                   [ 1,  1,  1,  1, 38, 17,  1, 77, 51;
                     1,  1,  1, 38, 17, 66, 77, 51, 78;
                     1,  1,  1, 17, 66,  1, 51, 78,  1;
                     1, 38, 17,  1, 77, 51,  1, 11, 32;
                    38, 17, 66, 77, 51, 78, 11, 32, 19;
                    17, 66,  1, 51, 78,  1, 32, 19,  1;
                     1, 77, 51,  1, 11, 32,  1,  1,  1;
                    77, 51, 78, 11, 32, 19,  1,  1,  1;
                    51, 78,  1, 32, 19,  1,  1,  1,  1]
5&Y)      % Push 5th row (centers of the 3×3 blocks) and then the rest of the matrix
          % STACK: [38, 77, 11;
                    17, 51, 32;
                    66, 78, 19]
                   [38, 17, 66, 77, 51, 78, 11, 32, 19]
                   [ 1,  1,  1,  1, 38, 17,  1, 77, 51;
                     1,  1,  1, 38, 17, 66, 77, 51, 78;
                     1,  1,  1, 17, 66,  1, 51, 78,  1;
                     1, 38, 17,  1, 77, 51,  1, 11, 32;
                    17, 66,  1, 51, 78,  1, 32, 19,  1;
                     1, 77, 51,  1, 11, 32,  1,  1,  1;
                    77, 51, 78, 11, 32, 19,  1,  1,  1;
                    51, 78,  1, 32, 19,  1,  1,  1,  1]
Zd        % Greatest common divisor, element-wise with broadcast
          % STACK: [38, 77, 11;
                    17, 51, 32;
                    66, 78, 19]
                   [1,  1,  1,  1,  1,  1,  1,  1,  1;
                    1,  1,  1,  1, 17,  6, 11,  1,  1;
                    1,  1,  1,  1,  3,  1,  1,  2,  1;
                    1,  1,  1,  1,  1,  3,  1,  1,  1;
                    1,  1,  1,  1,  3,  1,  1,  1,  1;
                    1,  1,  3,  1,  1,  2,  1,  1,  1;
                    1, 17,  6, 11,  1,  1,  1,  1,  1;
                    1,  1,  1,  1,  1,  1,  1,  1,  1]
1=        % Compare with 1, element-wise. Gives true (1) or false (0)
          % STACK: [38, 77, 11;
                    17, 51, 32;
                    66, 78, 19]
                   [1, 1, 1, 1, 1, 1, 1, 1, 1;
                    1, 1, 1, 1, 0, 0, 0, 1, 1;
                    1, 1, 1, 1, 0, 1, 1, 0, 1;
                    1, 1, 1, 1, 1, 0, 1, 1, 1;
                    1, 1, 1, 1, 0, 1, 1, 1, 1;
                    1, 1, 0, 1, 1, 0, 1, 1, 1;
                    1, 0, 0, 0, 1, 1, 1, 1, 1;
                    1, 1, 1, 1, 1, 1, 1, 1, 1]
A         % All: true (1) for columns that do not contain 0
          % STACK: [38, 77, 11;
                    17, 51, 32;
                    66, 78, 19]
                   [1, 0, 0, 0, 0, 0, 0, 0, 1]
)         % Index (the matrix is read in column-major order). Implicit display
          % [38, 19]

Điều này sẽ hoạt động nếu ma trận lớn hơn 3x3?
Robert Fraser

@RobertFraser Có, quy trình không phụ thuộc vào kích thước ma trận. Xem trường hợp thử nghiệm cuối cùng chẳng hạn
Luis Mendo

1

APL (Dyalog Classic) , 23 22 byte

-1 byte nhờ @ H.PWiz

{∧/1=1↓∨∘⊃⍨14⌽,⍵}⌺3 3

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

không hỗ trợ ma trận nhỏ hơn 3x3 do lỗi trong trình thông dịch


@ H.PWiz thật thông minh, bạn có muốn đăng nó làm của riêng mình không?
ngn

Chắc chắn, bạn cũng có thể sử dụng (⊃∨⊢)-> ∨∘⊂⍨tôi nghĩ
H.PWiz

1

Thạch , 24 byte

Hmm, có vẻ dài.

ỊẠ€T
ŒJ_€`Ç€ḟ"J$ịFg"FÇịF

Liên kết đơn âm chấp nhận danh sách danh sách các số nguyên dương trả về danh sách từng giá trị trong các vùng lân cận thù địch (phiên bản 1 không có sự trùng lặp).

Hãy thử trực tuyến! Hoặc xem một bộ thử nghiệm .

Làm sao?

ỊẠ€T - Link 1: indices of items which only contain "insignificant" values: list of lists
Ị    - insignificant (vectorises) -- 1 if (-1<=value<=1) else 0 
  €  - for €ach:
 Ạ   -   all?
   T - truthy indices

ŒJ_€`Ç€ḟ"J$ịFg"FÇịF - Main Link: list of lists of positive integers, M
ŒJ                  - multi-dimensional indices
    `               - use as right argument as well as left...
   €                -   for €ach:
  _                 -     subtract (vectorises)
      €             - for €ach:
     Ç              -   call last Link (1) as a monad
          $         - last two links as a monad:
         J          -   range of length -> [1,2,3,...,n(elements)]
        "           -   zip with:
       ḟ            -     filter discard (remove the index of the item itself)
            F       - flatten M
           ị        - index into (vectorises) -- getting a list of lists of neighbours
               F    - flatten M
              "     - zip with:
             g      -   greatest common divisor
                Ç   - call last Link (1) as a monad
                  F - flatten M
                 ị  - index into

1

Python 2 , 182 177 166 byte

lambda a:[[all(gcd(t,a[i+v][j+h])<2for h in[-1,0,1]for v in[-1,0,1]if(h|v)*(i+v>-1<j+h<len(a)>i+v))for j,t in E(s)]for i,s in E(a)]
from fractions import*
E=enumerate

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

Xuất ra một danh sách các danh sách với các mục Đúng / Sai.


1

Haskell , 95 byte

m?n|l<-[0..n-1]=[a|i<-l,j<-l,a<-[m!!i!!j],2>sum[1|u<-l,v<-l,(i-u)^2+(j-v)^2<4,gcd(m!!u!!v)a>1]]

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

Hàm ?lấy ma trận mlàm danh sách các danh sách và kích thước ma trận n; nó trả về danh sách các mục trong sự thù địch .

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.