Hiệp sĩ trên Rim là Grim


48

Giới thiệu

Aron Nimzowitsch là một bậc thầy cờ vua hàng đầu và là một nhà văn cờ vua có ảnh hưởng.

Trong cuốn sách 'Hệ thống của tôi', chương đầu tiên đề cập đến tầm quan trọng của trung tâm và lý do tại sao bạn nên thống trị nó. Lý do đơn giản là các quân cờ của bạn có nhiều khả năng di chuyển tiếp theo trực tiếp hơn khi ở trung tâm, điều này một lần nữa mang lại cho người chơi nhiều sức mạnh hơn.

Điều này trở nên rất rõ ràng khi nhìn vào các vị trí khác nhau của một hiệp sĩ và các bước di chuyển tiếp theo tiềm năng của nó (hiển thị bằng màu hồng) trên một bảng trống:

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

Mục tiêu

Đánh giá số lần di chuyển tiếp theo tiềm năng của một hiệp sĩ trên một bảng trống dựa trên vị trí của nó.

Thông số kỹ thuật đầu vào

Vị trí của hiệp sĩ.

Đầu tiên là x (cột) và sau đó là y (hàng). 0 0là góc dưới bên trái.

Để đơn giản, tôi chỉ thay đổi nhãn của bàn cờ thành số. Đối với các ví dụ và trường hợp thử nghiệm của chúng tôi, chúng tôi sử dụng chỉ mục dựa trên 0, bạn có thể tự do sử dụng chỉ mục dựa trên 1.

Bạn có thể sử dụng bất kỳ loại định dạng đầu vào có thể, một mảng, đối số hàm, v.v.

Thông số đầu ra

Số lượng các bước di chuyển trực tiếp tiềm năng cho một hiệp sĩ trên một bảng trống.

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

3 4 => 8
4 6 => 6
7 7 => 2
1 0 => 3

Các trường hợp thử nghiệm đang sử dụng một chỉ số dựa trên 0. Toàn bộ giá trị là:

2 3 4 4 4 4 3 2
3 4 6 6 6 6 4 3
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
3 4 6 6 6 6 4 3
2 3 4 4 4 4 3 2

9
Thử thách đầu tiên tốt đẹp! :-)
Luis Mendo

14
"Hiệp sĩ trên vành là nghiệt ngã"

2
@stacey Nhận xét của bạn sẽ là một tiêu đề tuyệt vời cho câu đố này :)
quay phim

6
Bây giờ cho câu hỏi thực sự khó khăn: Các hiệp sĩ màu đỏ trong các hình ảnh trên có cùng màu không?
mbomb007

Câu trả lời:


25

Python 2 , 35 byte

lambda x,y:50/(8+x*x/7-x+y*y/7-y)-4

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


Python 2 , 39 byte

lambda x,y:50/(8-x*(7-x)/5-y*(7-y)/5)-4

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

Đưa đầu vào 0 chỉ mục.

Biểu thức x*(7-x)/5lấy các giá trị tọa độ 0..7để

[0, 1, 2, 2, 2, 2, 1, 0]

( min(x,7-x,2)thực hiện tương tự, nhưng dài hơn.) Tóm tắt điều này cho xyđưa ra mô hình đúng nhưng với các số sai

0 1 2 2 2 2 1 0
1 2 3 3 3 3 2 1
2 3 4 4 4 4 3 2
2 3 4 4 4 4 3 2
2 3 4 4 4 4 3 2
2 3 4 4 4 4 3 2
1 2 3 3 3 3 2 1
0 1 2 2 2 2 1 0

(Xem giải pháp của Neil để biết lý do tốt hơn về lý do tại sao điều này đưa ra về mẫu phù hợp.)

Cuối cùng, ánh xạ a -> 50/(8-a)-4với phân chia sàn cho các giá trị phù hợp

2 3 4 4 4 4 3 2
3 4 6 6 6 6 4 3
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
3 4 6 6 6 6 4 3
2 3 4 4 4 4 3 2

Một giải pháp thay thế dài bằng nhau với đầu vào 1 chỉ mục:

lambda x,y:(x*(9-x)/6+y*(9-y)/6)**2/6+2

(7-a)*a/5ngắn hơn 3 byte min(a,7-a,2).
Neil

1
*lthực sự chi phí cho bạn một byte tổng thể, lambda a,b:"23468"[(7-a)*a/5+(7-b)*b/5]chỉ có 41 byte.
Neil

@Neil Tôi vừa tìm thấy điều tương tự với x*(9-x)/6, một chỉ mục.
xnor

1
Tại sao bạn không sử dụng <strike>như những người khác để hiển thị tiến trình chơi gôn?
Mất trí

4
@Insane Tôi nghĩ rằng nó trông xấu và không thực sự giúp đỡ. Mã là điều quan trọng, và bất cứ ai muốn xem sự tiến hóa của nó vẫn cần xem trong lịch sử chỉnh sửa. Khi mã cũ của tôi đủ khác để có giá trị hiển thị, tôi hiển thị các phiên bản như ở đây . Nhưng về câu hỏi này, đó là tất cả những cải tiến nhỏ cho cùng một chiến lược, vì vậy tôi thấy nó sạch hơn chỉ để đề cập đến các khả năng khác nhau.
xnor

17

MATL , 17 14 13 12 byte

Cảm ơn @Neil đã tắt 1 byte!

8:HZ^ZP5X^=s

Đầu vào là 1 dựa trên.

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

Giải trình

Điều này sẽ tính khoảng cách Euclide từ đầu vào đến từng vị trí trong 64 vị trí trong bàn cờ và tìm thấy có bao nhiêu giá trị trong số đó bằng căn bậc hai của 5.

Vì tọa độ là các giá trị nguyên, nên chúng ta có thể chắc chắn rằng hai giá trị dấu phẩy động đại diện cho căn bậc hai của 5 (được tính từ tọa độ và được tính trực tiếp) thực sự giống nhau.

8:      % Push array [1 2 ... 8]
H       % Push 2
Z^      % Cartesian power. Gives 2D array [1 1; 1 2; ... 1 8; 2 1; ... 8 8]     
ZP      % Implicit input. Compute Euclidean distances, considering each row as a point
5X^     % Square root of 5
=s      % Compute how many squared distances equal sqrt(5). Implicit display

1
Ấn tượng và cảm ơn vì lời giải thích
quay phim

1
Nếu so sánh bình phương của căn bậc hai từ 5 đến 5 không thành công do lỗi làm tròn, thì ít nhất bạn có thể so sánh căn bậc hai của 5 với căn bậc hai của 5 không?
Neil

@Neil Cảm ơn ý kiến! Có, vì các tính toán với số nguyên, tôi có thể chắc chắn rằng hai "gốc của 5" là cùng một doublesố. Ant nó tiết kiệm một byte
Luis Mendo

15

Toán học 63 43 byte

Với 20 byte được lưu nhờ các đề xuất của Martin Ender!

EdgeCount[8~KnightTourGraph~8,#+1+8#2/<->_]&

Ở trên tìm thấy số lượng hình vuông cách 1 ô so với ô đã cho trên biểu đồ tham quan hiệp sĩ hoàn chỉnh.


g=KnightTourGraph[8,8,VertexLabels->"Name",Axes->True]

hiển thị biểu đồ tham quan của hiệp sĩ hoàn chỉnh, với tên và tọa độ đỉnh. Lưu ý rằng Mathicala mặc định là lập chỉ mục một cho các tọa độ.

đồ thị


#+1+8#2&[r,f]chuyển đổi trả về đỉnh tương ứng với bình phương ở thứ hạng (hàng) rvà tệp (cột) f, sử dụng các giá trị dựa trên 0 làm đầu vào.

Ví dụ #+1+8#2&[2,1]trả về 11.


EdgeCount đưa ra số cạnh trong biểu đồ lân cận.


Các cạnh cho xếp hạng 2, tệp 1 (hình vuông 11):

IncidenceList[8~KnightTourGraph~8, 8 #2 + # + 1] &[2, 1]

(*{1 <-> 11, 5 <-> 11, 11 <-> 17, 11 <-> 21, 11 <-> 26, 11 <-> 28}*)

Các cạnh được tô sáng:

HighlightGraph[g, {1, 5, 11, 17, 21, 26, 28, Style[1 <-> 11, Thick, Blue], Style[5 <-> 11, Thick, Blue], Style[11 <-> 17, Thick, Blue], Style[11 <-> 21, Thick, Blue], Style[11 <-> 26, Thick, Blue], Style[11 <-> 28, Thick, Blue]},GraphHighlightStyle -> "DehighlightFade", PlotRangePadding -> .5]

Điểm nổi bật


Cách 2: Khoảng cách Euclide

70 byte

Phương pháp này dài hơn, nhưng có thể được quan tâm. Cách tiếp cận là kiểm tra khoảng cách Euclide giữa trung tâm bàn cờ và ô quan tâm.

Which[(x=Sqrt@Tr[({3.5, 3.5}-#)^2])<2.2,8,x<3,6,x<4,4,x<4.6,3,x>4.6,2]&

Mẫu mực

Which[(x=Sqrt@Tr[({3.5, 3.5}-#)^2])<2.2,8,x<3,6,x<4,4,x<4.6,3,x>4.6,2]&@{0, 0}
Which[(x=Sqrt@Tr[({3.5, 3.5}-#)^2])<2.2,8,x<3,6,x<4,4,x<4.6,3,x>4.6,2]&@{3, 3}

2

số 8


Để giúp hình dung làm thế nào khoảng cách từ trung tâm của bàn cờ là đủ để gán một giá trị.

values={{2,3,4,4,4,4,3,2},{3,4,6,6,6,6,4,3},{4,6,8,8,8,8,6,4},{4,6,8,8,8,8,6,4},{4,6,8,8,8,8,6,4},{4,6,8,8,8,8,6,4},{3,4,6,6,6,6,4,3},{2,3,4,4,4,4,3,2}};
f[x_]:=Text[x,#]&/@Position[values,x]r_~w~p_:=RegionMember[{3.5`,3.5`}~Disk~r,p]
h@y_:=Which[2.2~w~y,8,3~w~y,6,4~w~y,4,4.6~w~y,3,2<3,2]

Graphics[{Circle[{4.5, 4.5}, 2.3], Circle[{4.5, 4.5}, 3], 

Vòng tròn [{4.5, 4.5}, 4],

Vòng tròn [{4.5, 4.5}, 4.6], Làm phẳng [f / @ {2, 3, 4, 6, 8}, 1]}, Trục -> Đúng, AxesOrigin -> {-1, -1}]


Các số 2.2, 3, 4 và 4.6 là bán kính của các vòng tròn.

Hình ảnh, tưởng tượng


1
Đồ thị du lịch tuyệt vời
quay phim

20
KnightTourGraphMathicala và các nội dung của nó ... :-)
Luis Mendo

Tôi nghĩ rằng có một sự đi lạc #ở cuối mã nguồn của bạn (ngay trước khi ]). Bạn sẽ có thể sử dụng IncidenceListthay vì EdgeList@NeighborhoodGraphmặc dù. (Ngoài ra, cũng có EdgeCount, nhưng tôi nghĩ rằng kết thúc dài hơn.)
Martin Ender

1
Đợi đã, nó thực sự ngắn hơn:EdgeCount[8~KnightTourGraph~8,#+1+8#2<->_]&
Martin Ender

EdgeCountngầu đấy!
DavidC

12

JavaScript (ES6), 38 byte

(x,y)=>+"23468"[((7-x)*x+(7-y)*y)/5|0]

Có đầu vào 0 chỉ mục. Giải thích: Nhìn vào các ô vuông của khoảng cách đến trung tâm:

24.5 18.5 14.5 12.5 12.5 14.5 18.5 24.5
18.5 12.5  8.5  6.5  6.5  8.5 12.5 18.5
14.5  8.5  4.5  2.5  2.5  4.5  8.5 14.5
12.5  6.5  2.5  0.5  0.5  2.5  6.5 12.5
12.5  6.5  2.5  0.5  0.5  2.5  6.5 12.5
14.5  8.5  4.5  2.5  2.5  4.5  8.5 14.5
18.5 12.5  8.5  6.5  6.5  8.5 12.5 18.5
24.5 18.5 14.5 12.5 12.5 14.5 18.5 24.5

Số lượng hình vuông có thể tiếp cận rơi vào năm dải:

8    0-5
6    5-10
4   10-15
3   15-20
2   20-25

Tôi thực sự tính 24,5 - (3,5 - x) ** 2 - (3,5 - y) ** 2 = (7 - x) * x + (7 - y) * y vì đó là phép tính ngắn hơn, nhưng tất cả đều ngược lại thứ tự của các ban nhạc.


Cách tiếp cận siêu súc tích và rất hay, vì vậy tôi không phải bắt đầu giải pháp JS của riêng mình nữa :)
quay phim

Điểm hay về công thức tương đương về bán kính bình phương. Tôi đã nghĩ về việc x*(7-x)chỉ là một hoạt động trông giống như một vòng cung đi xuống 0..7và xảy ra phù hợp với đường cong, nhưng điều này giải thích tại sao nó tạo ra một mô hình đẹp như vậy khi được tóm tắt xy.
xnor

11

Thạch, 10 byte

8ṗ2_³²S€ċ5

1 chỉ mục. Có một đối số duy nhất của hình thức [x,y]. Hãy thử nó ở đây.

8ṗ2          Cartesian square [[1,1],[1,2]…[8,8]]
   _³        Subtract the input
     ²S€     Compute the norm of each vector
        ċ5   Count fives

Dennis đã lưu một byte!


Chỉ cần mười một byte, wow!
quay phim

Tôi đã thấy câu hỏi này vào buổi sáng và đây là thuật toán chính xác mà tôi nghĩ tôi sẽ thực hiện trong Jelly khi có thời gian. : P
PurkkaKoodari

8

Toán học, 44 40 byte

Hiện tại tôi đã có ba giải pháp với cùng số byte:

2[3,4,6,8][[Tr@⌊3.2-.8Abs[#-4.5]⌋]]&
Tr@⌈.85(4-Abs[#-4.5])⌉/.{5->6,6->8}&
⌊Tr@⌈.85(4-Abs[#-4.5])⌉^1.1608⌋&

Tất cả đều là các hàm không tên có cặp tọa độ như thế {3, 4}, dựa trên 1.

Tôi đã cố gắng đưa ra một công thức hơi rõ ràng. Mẫu chung trên toàn bộ bảng trông như thế này:

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

Giá trị thực của những màu đó (từ sáng nhất đến tối nhất) là 2, 3, 4, 6, 8. Đó là:

2 3 4 4 4 4 3 2
3 4 6 6 6 6 4 3
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
3 4 6 6 6 6 4 3
2 3 4 4 4 4 3 2

Trước tiên, chúng tôi khai thác tính đối xứng bằng cách dịch chuyển gốc đến trung tâm, lấy giá trị tuyệt đối và trừ kết quả từ đó 4. Điều này cho chúng ta tọa độ 0.5để 3.5tăng từ mỗi góc. Để thực hiện các tọa độ trung tâm cần chúng ta cùng để lập bản đồ 0.51.5các giá trị và khác nhau 2.53.5để cùng giá trị. Điều này được thực hiện dễ dàng bằng cách nhân với 0.8(cho {0.4, 1.2, 2., 2.8}) và kết quả sàn. Vì vậy, bây giờ chúng tôi đã có {0, 1, 2, 2}khoảng cách từ trung tâm. Nếu chúng ta cộng các tọa độ trong mỗi ô, chúng ta sẽ nhận được bảng này:

0 1 2 2 2 2 1 0
1 2 3 3 3 3 2 1
2 3 4 4 4 4 3 2
2 3 4 4 4 4 3 2
2 3 4 4 4 4 3 2
2 3 4 4 4 4 3 2
1 2 3 3 3 3 2 1
0 1 2 2 2 2 1 0

Điều này có các giá trị duy nhất cho tất cả các kết quả khác nhau có thể, vì vậy chúng tôi chỉ cần sử dụng nó làm chỉ mục vào 2[3,4,6,8].

Trong phiên bản thứ hai, chúng tôi sử dụng trần thay vì sàn. Bằng cách này 2, 34đã đúng, nhưng chúng tôi nhận được 56thay vì 68, vì vậy chúng tôi sửa chúng theo cách thủ công với quy tắc thay thế.

Cuối cùng, trong phiên bản thứ ba, chúng tôi mở rộng 56hướng lên 68bằng phương pháp lũy thừa, tiếp theo là một hoạt động sàn khác.


Tôi rất thích cách tiếp cận sử dụng mô hình chung của hội đồng quản trị, thật tuyệt!
quay phim

6

APL, 21 ký tự

{+/,5=+/¨×⍨(⍳8 8)-⊂⍵}

Bằng tiếng Anh:

  • (⍳8 8): Mảng thứ hạng 8x8 chứa tọa độ của tất cả các ô;
  • +/¨×⍨(⍳8 8)-⊂⍵: bình phương khoảng cách euclide của ô đã cho đối với mọi ô trên bảng;
  • 5=: ma trận 0/1, trong đó các số 1 xuất hiện ở khoảng cách bình phương bằng 5;
  • +/,: tổng hợp ma trận dẹt

Kiểm tra (trong nguồn gốc 1):

    f←{+/,5=+/¨×⍨(⍳8 8)-⊂⍵}
    f¨1+(3 4)(4 6)(7 7)(1 0)
8 6 2 3

Trong hình thức này:

f←{+/,5=+/¨×⍨(⍳⍺)-⊂⍵}

đối số bên trái có thể chỉ định kích thước của bảng. Do đó 8 8 fsẽ làm việc cho bàn cờ vuông tiêu chuẩn. Nhưng trên một bảng lớn hơn và hình chữ nhật, các trường hợp thử nghiệm sẽ cho kết quả khác nhau. Chẳng hạn, trên bảng 12x10:

    g←(10 12)∘f
    g¨1+(3 4)(4 6)(7 7)(1 0)
8 8 8 3

Trong thuật ngữ APL, một ma trận là một mảng hạng 2, không có gì nói về nội dung của các ô. Nhiều năm (ab) sử dụng các thuật ngữ khiến tôi không nhạy cảm với nó. Tôi sẽ cập nhật mô tả cho độc giả nghiêng theo truyền thống hơn. Cảm ơn bạn.
lstefano

@Istefano Việc sử dụng "thứ hạng" là "số lượng kích thước" dường như bị ảnh hưởng tương tự :-P
Luis Mendo

Tôi sẽ ... Bạn nói đúng! Bạn có thể thấy rằng đã được một thời gian kể từ khi tôi học Đại số tuyến tính. Tôi bỏ cuộc :-)
lstefano

1
Chương trình đầy đủ, 27: ≢⍸5=+/¨×⍨-∘⎕¨⍳8 8 Dùng thử trực tuyến!
Adám

@ Adám bạn có nghĩa là 17
ngn

6

Java - 160 150 byte

int m(int r,int c){int m=0,i,j;for(i=0;i<3;i+=2)for(j=0;j<3;j+=2){m+=r+i>0&r+i<9&c+2*j>1&c+2*j<11?1:0;m+=r+2*i>1&r+2*i<11&c+j>0&c+j<9?1:0;}return m;}

Ung dung:

public static int m(int r, int c) {
    int m=0;
    for(int i=-1;i<2;i+=2)
        for(int j=-1;j<2;j+=2){
            m += r+i>-1 && r+i<8 && c+2*j>0 && c+2*j<8 ? 1:0;
            m += r+2*i>0 && r+2*i<8 && c+j>1 && c+j<8 ? 1:0;
        }
    return m;
}

Mã không được mã hóa giống hệt nhau ngoại trừ thay đổi giới hạn của vòng lặp for để lưu 4 byte. Hoạt động bằng cách lặp qua từng lần di chuyển có thể và thực hiện kiểm tra giới hạn (> 0 và <8). Sử dụng thực tế là các độ lệch là (1, 2), (2, 1), (-1, 2), (-2, 1), v.v. và có thể kiểm tra 2 di chuyển cho mỗi giá trị của i và j.

Chỉnh sửa: 10 byte được lưu nhờ các đề xuất của Leaky Nun và u902383.


Điều này cũng nhanh, tốt đẹp!
quay phim

Có một lỗi trong đó, nó đã được sửa chữa.
ejaszewski

1
int m=0,i=-1,j;để tiết kiệm một số byte
Leaky Nun

1
thay đổi logic VÀ thành bitwise AND và điều đó sẽ cho phép bạn xóa thêm 6 ký tự
user902383

6

C, 44 byte

f(x,y){return "23468"[((7-x)*x+(7-y)*y)/5];}

Nhưng điều này tốt hơn:

f(x,y){return "2344443234666643468888644688886446888864468888643466664323444432"[x*8+y];}

1
Mất tích ;. Sẽ không biên dịch.
ugoren


1
Nó không phải là một đoạn trích, nó là một chức năng và nó không bị cấm chức năng bài. Xin lỗi vì dấu chấm phẩy bị thiếu. Đã sửa.
Giacomo Garabello

5

Haskell, 49 48 byte

w=[0..7]
x%y=sum[1|a<-w,b<-w,(a-x)^2+(b-y)^2==5]

1
Bạn có thể lưu [0..7]vào một biến trong 1 byte.
xnor

5

Java, 81 ký tự (113 byte)

int r(int a,int b){return "⍄䐲㑦晃䚈衤䚈衤䚈衤䚈衤㑦晃⍄䐲".codePointAt(a*2+b/4)>>(3-b%4)*4&15;}

Mã hóa toàn bộ bảng kết quả dưới dạng bảng unicode và sau đó nhận các byte thích hợp thực hiện các thao tác bitwise.

Bạn có thể thấy nó trực tuyến tại đây: https://ideone.com/K9BojC


3

Python, 94 byte

lambda x,y,a=[2,1,-1,-2,-2,-1,1,2]:list((9>x+a[i]>0)&(9>y+a[5-i]>0)for i in range(8)).count(1)

Sử dụng 1 chỉ mục dựa trên.

Bản demo tại https://repl.it/C6gV .





1

Trên thực tế, 18 byte

`;7-2km`MΣ8-:50\¬¬

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

Điều này thực hiện cùng một công thức mà nhiều câu trả lời khác đã và đang sử dụng : 50/(8-x*(7-x)//5+y*(7-y))//5)-4. Đầu vào được lấy dưới dạng danh sách: [x,y](hoặc bất kỳ chữ lặp nào trong Python, như (x,y)hoặc x,y).

Giải trình:

`;7-2km`MΣ8-:50\¬¬
`;7-2km`M           for each value in input:
 ;7-                  make a copy, subtract from 7
    2                 push 2
     km               minimum of the three values (x, 7-x, 2)
         Σ          sum
          8-        subtract from 8
            :50\    integer divide 50 by the value
                ¬¬  subtract 2 twice

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.