Một trận chiến mảng với sức mạnh bí mật kỳ lạ


11

Đây là một thách thức mảng hai chiều tương đối đơn giản.

Hãy tưởng tượng một chiến trường gồm 625 binh lính. Bạn chỉ huy những đội quân kỳ quặc , nhưng thật không may, sức mạnh của những đội quân chẵn áp đảo bạn. Rất may, binh lính của bạn có một sức mạnh bí mật: Nếu sức mạnh của mỗi đội quân lẻ và các đồng minh kỳ lạ xung quanh họ chia hết cho một số sức mạnh bí mật, họ sẽ giải phóng cuộc tấn công cuối cùng của họ và giành chiến thắng! Bạn phải tôn vinh mỗi người lính chiến thắng.

Quy tắc

Cho một mảng số nguyên 25 x 25 trong đó mỗi phần tử chứa tích của vị trí x và y của nó cộng với 1, trả về tọa độ của mọi phần tử lẻ "chiến thắng" đáp ứng các tiêu chí sau:

Tổng giá trị của phần tử và các phần tử lẻ liền kề của nó (lên, xuống, trái và phải) chia hết cho đầu vào (số công suất bí mật). Nó phải có các phần tử liền kề với nó ở cả bốn phía và không nằm trên một cạnh.

Đệ trình có thể là một chức năng hoặc chương trình đầy đủ yêu cầu một đầu vào duy nhất. Đầu ra có thể theo thứ tự bất kỳ.

Mảng 25 x 25 của chúng tôi, chiến trường, trông như thế này:

1, 1, 1, 1,...
1, 2, 3, 4,...
1, 3, 5, 7,...
1, 4, 7, 10,...
etc.

Thí dụ

Đây là một ví dụ 3 x 3:

43, 57, 71
46, 61, 76
49, 65, 81

Để xác định xem một phần tử (61, ở giữa) có thắng hay không, chúng tôi tổng hợp các giá trị của phần tử đó và các phần tử lẻ liền kề.

61 + 57 + 65 = 183

Nếu tổng số chia hết cho đầu vào, vị trí x và y của phần tử được in. Nếu đầu vào của chúng tôi là 3, vì 183 chia hết cho 3, "1, 1" được in.

Đầu ra

Nếu đầu vào (số sức mạnh bí mật) là 37, các yếu tố được trả về (những người lính chiến thắng sẽ được tuyên dương) phải là:

2, 18
3, 12
4, 9
5, 22
6, 6
8, 23
9, 4
10, 11
11, 10
12, 3
18, 2
22, 5
23, 8

Nếu đầu vào là 191, các phần tử được trả về phải là:

10, 19
19, 10

Đầu vào là 3:

1, 2
1, 4
1, 6
1, 8
1, 10
1, 12
1, 14
1, 16
1, 18
1, 20
1, 22
2, 1
2, 3
2, 4
2, 5
2, 7
2, 9
2, 10
2, 11
2, 13
2, 15
2, 16
2, 17
2, 19
2, 21
2, 22
2, 23
3, 2
3, 4
3, 6
3, 8
3, 10
3, 12
3, 14
3, 16
3, 18
3, 20
3, 22
4, 1
4, 2
4, 3
4, 5
4, 7
4, 8
4, 9
4, 11
4, 13
4, 14
4, 15
4, 17
4, 19
4, 20
4, 21
4, 23
5, 2
5, 4
5, 6
5, 8
5, 10
5, 12
5, 14
5, 16
5, 18
5, 20
5, 22
6, 1
6, 3
6, 5
6, 7
6, 9
6, 11
6, 13
6, 15
6, 17
6, 19
6, 21
6, 23
7, 2
7, 4
7, 6
7, 8
7, 10
7, 12
7, 14
7, 16
7, 18
7, 20
7, 22
8, 1
8, 3
8, 4
8, 5
8, 7
8, 9
8, 10
8, 11
8, 13
8, 15
8, 16
8, 17
8, 19
8, 21
8, 22
8, 23
9, 2
9, 4
9, 6
9, 8
9, 10
9, 12
9, 14
9, 16
9, 18
9, 20
9, 22
10, 1
10, 2
10, 3
10, 5
10, 7
10, 8
10, 9
10, 11
10, 13
10, 14
10, 15
10, 17
10, 19
10, 20
10, 21
10, 23
11, 2
11, 4
11, 6
11, 8
11, 10
11, 12
11, 14
11, 16
11, 18
11, 20
11, 22
12, 1
12, 3
12, 5
12, 7
12, 9
12, 11
12, 13
12, 15
12, 17
12, 19
12, 21
12, 23
13, 2
13, 4
13, 6
13, 8
13, 10
13, 12
13, 14
13, 16
13, 18
13, 20
13, 22
14, 1
14, 3
14, 4
14, 5
14, 7
14, 9
14, 10
14, 11
14, 13
14, 15
14, 16
14, 17
14, 19
14, 21
14, 22
14, 23
15, 2
15, 4
15, 6
15, 8
15, 10
15, 12
15, 14
15, 16
15, 18
15, 20
15, 22
16, 1
16, 2
16, 3
16, 5
16, 7
16, 8
16, 9
16, 11
16, 13
16, 14
16, 15
16, 17
16, 19
16, 20
16, 21
16, 23
17, 2
17, 4
17, 6
17, 8
17, 10
17, 12
17, 14
17, 16
17, 18
17, 20
17, 22
18, 1
18, 3
18, 5
18, 7
18, 9
18, 11
18, 13
18, 15
18, 17
18, 19
18, 21
18, 23
19, 2
19, 4
19, 6
19, 8
19, 10
19, 12
19, 14
19, 16
19, 18
19, 20
19, 22
20, 1
20, 3
20, 4
20, 5
20, 7
20, 9
20, 10
20, 11
20, 13
20, 15
20, 16
20, 17
20, 19
20, 21
20, 22
20, 23
21, 2
21, 4
21, 6
21, 8
21, 10
21, 12
21, 14
21, 16
21, 18
21, 20
21, 22
22, 1
22, 2
22, 3
22, 5
22, 7
22, 8
22, 9
22, 11
22, 13
22, 14
22, 15
22, 17
22, 19
22, 20
22, 21
22, 23
23, 2
23, 4
23, 6
23, 8
23, 10
23, 12
23, 14
23, 16
23, 18
23, 20
23, 22

Đầu vào 5:

1, 4
1, 14
2, 2
2, 4
2, 6
2, 7
2, 8
2, 10
2, 12
2, 14
2, 16
2, 17
2, 18
2, 20
2, 22
3, 8
3, 18
4, 1
4, 2
4, 4
4, 6
4, 8
4, 10
4, 11
4, 12
4, 14
4, 16
4, 18
4, 20
4, 21
4, 22
6, 2
6, 4
6, 6
6, 8
6, 9
6, 10
6, 12
6, 14
6, 16
6, 18
6, 19
6, 20
6, 22
7, 2
7, 12
7, 22
8, 2
8, 3
8, 4
8, 6
8, 8
8, 10
8, 12
8, 13
8, 14
8, 16
8, 18
8, 20
8, 22
8, 23
9, 6
9, 16
10, 2
10, 4
10, 6
10, 8
10, 10
10, 12
10, 14
10, 16
10, 18
10, 20
10, 22
11, 4
11, 14
12, 2
12, 4
12, 6
12, 7
12, 8
12, 10
12, 12
12, 14
12, 16
12, 17
12, 18
12, 20
12, 22
13, 8
13, 18
14, 1
14, 2
14, 4
14, 6
14, 8
14, 10
14, 11
14, 12
14, 14
14, 16
14, 18
14, 20
14, 21
14, 22
16, 2
16, 4
16, 6
16, 8
16, 9
16, 10
16, 12
16, 14
16, 16
16, 18
16, 19
16, 20
16, 22
17, 2
17, 12
17, 22
18, 2
18, 3
18, 4
18, 6
18, 8
18, 10
18, 12
18, 13
18, 14
18, 16
18, 18
18, 20
18, 22
18, 23
19, 6
19, 16
20, 2
20, 4
20, 6
20, 8
20, 10
20, 12
20, 14
20, 16
20, 18
20, 20
20, 22
21, 4
21, 14
22, 2
22, 4
22, 6
22, 7
22, 8
22, 10
22, 12
22, 14
22, 16
22, 17
22, 18
22, 20
22, 22
23, 8
23, 18

Đây là , mã đếm byte thấp nhất mà không sử dụng sơ hở tiêu chuẩn là người chiến thắng.

Vì đây là lần gửi đầu tiên của tôi, bất kỳ lời khuyên nào cũng được đánh giá cao. Cảm ơn!


Tôi hơi bối rối về việc đưa ra một mảng số nguyên 25 x 25 . Các bài nộp của chúng tôi có nên tạo danh sách này hay nó thực sự được đưa vào đầu vào?
Ông Xcoder

Chỉ có vấn đề đầu ra. Tạo mảng thực tế là tùy chọn.
Pandazoic

"Hãy tưởng tượng một chiến trường gồm 625 binh lính" Phải. Đó là cao. O_o
Chronocidal

Câu trả lời:


3

JavaScript (ES6),  83 81 80  76 byte

Đầu ra là một chuỗi phân cách không gian có tọa độ .x,y

f=(n,x=y=23,k=5,v=x*y)=>y?(v&1|~v*k%n?[]:[x,y]+' ')+f(n,--x||23|!y--,k^6):[]

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

Làm sao?

Đặt là giá trị của ô nằm tại .cx,y=xy+1(x,y)

Vì các ô trên cạnh không được tính, chúng tôi giả sử và .0<x<240<y<24

cx,y là số lẻ nếu hoặc chẵn (hoặc cả hai).xy

Nếu là số lẻ thì và là số lẻ. Nhưng trong trường hợp đó, phải là số chẵn và và . Tổng của tế bào và hàng xóm xung quanh của nó là:xcx1,ycx+1,yycx,y1cx,y+1

sx,y=cx,y+cx1,y+cx+1,y=3cx,y

Tương tự, nếu là số lẻ:y

sx,y=cx,y+cx,y1+cx,y+1=3cx,y

Nếu cả và đều chẵn, tất cả các lân cận xung quanh đều lẻ:xy

sx,y=cx,y+cx1,y+cx+1,y+cx,y1+cx,y+1=5cx,y

Hệ số nhân này ( hoặc ) được đặt tên trong mã JS.35k

Đã bình luận

f = (                // f is a recursive function taking:
  n,                 //   n      = input
  x = y = 23,        //   (x, y) = current coordinates, starting at (23, 23)
  k = 5,             //   k      = multiplier (3 or 5)
  v = x * y          //   v      = x * y (value of the current cell - 1)
) =>                 //
  y ?                // if y is greater than 0:
    ( v & 1 |        //   if v is odd (meaning that v + 1 is not)
      ~v * k % n ?   //   or n is not a divisor of -(v + 1) * k:
        []           //     append nothing
      :              //   else:
        [x, y] + ' ' //     append the coordinates followed by a space
    ) +              //
    f(               //   append the result of a recursive call:
      n,             //     pass n unchanged
      --x ||         //     decrement x; if the result is 0:
        23 | !y--,   //       pass 23 instead and decrement y
      k ^ 6          //     update k (5 -> 3 -> 5 -> ...)
    )                //   end of recursive call
  :                  // else:
    []               //   stop recursion

Cảm ơn lời giải thích sâu sắc. Khéo léo sử dụng XOR bitwise để lật giữa các số nhân.
Pandazoic

3

C # (Trình biên dịch tương tác Visual C #) , 97 93 91 90 byte

x=>{for(int i=0,d=0,j;++i<24;d=5)for(j=0;++j<24;d^=6)if(i*j%2+(i*j+1)*d%x<1)Print((i,j));}

Đã lưu 6 byte nhờ @Kevin Cruijssen!

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


int i=0; ... int j=0;có thể int i=0,j; ... j=0;<1&có thể +cho -4 byte.
Kevin Cruijssen

@KevinCruijssen Đối với các khai báo int, ban đầu tôi đã có nó theo cách đó cho đến khi tôi thay đổi chức năng của mình sang một phương thức khác, sau đó hoàn nguyên nó. Các +một là đẹp tuy nhiên, nhờ
Embodiment of Dốt nát

-2 khác bằng cách thay thế ((i+j)%2>0?3:5)bằng(5-(i+j)%2*2)
Kevin Cruijssen

2

Stax , 25 byte

âÖÅ{┼îÄï$εS╢,σδXú(Γ°#↑√nG

Chạy và gỡ lỗi nó

Đây chủ yếu chỉ là lực lượng vũ phu, với một quan sát thông minh bên lề. Tất cả các đội quân lẻ có 2 hoặc 4 hàng xóm lẻ. Và tổng số tiền của những cộng với hàn ban đầu là một trong hai 3phoặc 5pnơi plà sức mạnh của người lính. Hệ số (3 hoặc 5) có thể được xác định theo gcd(2, x, y) * 2 + 1)vị trí xytọa độ của người lính.


2

Python 2 , 83 byte

lambda n:[(x,y)for x in R for y in R if~(x*y)*[5,3][x+y&1]%n<1>x*y%2]
R=range(1,24)

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

Cảm ơn Arnauld vì đã lưu một byte.


À, về cơ bản là cùng một chương trình với câu trả lời js đã chuẩn bị của tôi ...
tsh


1

Thạch , 22 byte

23×þ`‘µḤḤÐeÐe+×Ḃ³ḍaƊŒṪ

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

Một chương trình đầy đủ có một đối số duy nhất, số sức mạnh bí mật và ngầm in một danh sách các [x, y]cặp. Sử dụng các quan sát khác đã thực hiện về bội số của 3 và 5.


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.