Toán học, 111 105 104 byte
r=Floor[(1+Sqrt[(4#-1)/3])/2]&;t=Limit[Pi(#/(3x)+1-x),x->r@#]&;p=r@#*Exp[I*t@#]&;Round@Abs[p@#-p@#2]==1&
Giải trình:
r=Floor[(1+Sqrt[(4#-1)/3])/2]&
định nghĩa một hàm r
lấy đầu vào #
và tính khoảng cách (tính theo số ô) đến ô 0. Nó thực hiện điều này bằng cách khai thác mẫu trong các ô cuối cùng của mỗi khoảng cách / vòng: 0 = 3 (0 ^ 2 + 0), 6 = 3 (1 ^ 2 + 1), 18 = 3 (2 ^ 2 + 2), 36 = 3 (3 ^ 2 + 3), ... và đảo ngược công thức cho mẫu đó. Lưu ý rằng đối với ô 0, nó thực sự lấy sàn của (1/2) + i * (sqrt (3) / 6), nó tính toán thành phần khôn ngoan để nhận 0 + 0 * i = 0.
Với r
định nghĩa, r@#
là vòng cho ô #
(bên trong định nghĩa của hàm khác). #+3r@#-3(r@#)^2&
không xuất hiện chính xác trong mã, nhưng nó lấy số ô và trừ đi số ô cao nhất trong vòng bên trong tiếp theo, để nó đưa ra câu trả lời cho câu hỏi "ô nào của vòng hiện tại là đây?" Ví dụ, ô 9 là ô thứ 3 của vòng 2, do đó r[9]
sẽ xuất ra 2 và #+3r@#-3(r@#)^2&[9]
sẽ xuất 3.
Những gì chúng ta có thể làm với chức năng trên là sử dụng nó để tìm góc cực , góc ngược chiều kim đồng hồ từ tia "ô 0, ô 17, ô 58" đến ô đang xét. Ô cuối cùng của mỗi vòng luôn nằm ở góc Pi / 6 và chúng ta đi xung quanh một vòng theo số gia của Pi / (3 * ring_number). Vì vậy, về mặt lý thuyết, chúng ta cần tính toán một cái gì đó như Pi / 6 + (which_cell_of_the_civerse_ring) * Pi / (3 * ring_number). Tuy nhiên, xoay của hình ảnh không ảnh hưởng đến bất cứ điều gì, vì vậy chúng tôi có thể loại bỏ phần Pi / 6 (để lưu 6 byte). Kết hợp điều này với công thức trước và đơn giản hóa, chúng ta có đượcPi(#/(3r@#)+1-r@#)&
Thật không may, điều này không được xác định cho ô 0 vì số vòng của nó là 0, vì vậy chúng ta cần phải khắc phục điều này. Một giải pháp tự nhiên sẽ là một cái gì đó như t=If[#==0,0,Pi(#/(3r@#)+1-r@#)]&
. Nhưng vì chúng ta không quan tâm đến góc của ô 0 và vì r@#
được lặp lại, nên chúng ta thực sự có thể lưu một byte ở đây vớit=Limit[Pi(#/(3x)+1-x),x->r@#]&
Bây giờ chúng ta có số vòng và góc, chúng ta có thể tìm vị trí của một ô (ở giữa) để chúng ta có thể kiểm tra độ kề. Việc tìm vị trí thực tế rất khó chịu vì các vòng tròn là hình lục giác, nhưng chúng ta chỉ có thể giả vờ các vòng là các vòng tròn hoàn hảo để chúng ta coi số vòng là khoảng cách đến trung tâm của ô 0. Đây không phải là vấn đề vì phép tính gần đúng là khá gần. Sử dụng dạng cực của một số phức , chúng ta có thể biểu diễn vị trí gần đúng này trong mặt phẳng phức với một hàm đơn giản:p = r@#*Exp[I*t@#] &;
Khoảng cách giữa hai số phức trên mặt phẳng phức được tính bằng giá trị tuyệt đối của chênh lệch của chúng, và sau đó chúng ta có thể làm tròn kết quả để xử lý bất kỳ lỗi nào từ phép tính gần đúng và kiểm tra xem nó có bằng 1. Hàm cuối cùng không công việc này không có tên, nhưng là Round@Abs[p@#-p@#2]==1&
.
Bạn có thể dùng thử trực tuyến trong hộp cát Wolfram Cloud bằng cách dán mã như sau và nhấp vào Gear -> "Đánh giá ô" hoặc nhấn Shift + Enter hoặc numpad Enter:
r=Floor[(1+Sqrt[(4#-1)/3])/2]&;t=Limit[Pi(#/(3x)+1-x),x->r@#]&;p=r@#*Exp[I*t@#]&;Round@Abs[p@#-p@#2]==1&[24,45]
Hoặc cho tất cả các trường hợp thử nghiệm:
r=Floor[(1+Sqrt[(4#-1)/3])/2]&;t=Limit[Pi(#/(3x)+1-x),x->r@#]&;p=r@#*Exp[I*t@#]&;Round@Abs[p@#-p@#2]==1&//MapThread[#,Transpose[{{0,1},{7,18},{8,22},{24,45},{40,64},{64,65},{6,57},{29,90},{21,38},{38,60},{40,63},{41,39},{40,40}}]]&