J , 40 byte
2%~[:+/^:_]<:[:+/&.:*:"1[:-"1/~#~#:i.@^~
Hãy thử trực tuyến!
Sẽ hết thời gian trên TIO cho 5 nếu bạn sử dụng độ chính xác mở rộng ( 5x
thay vì 5
). Tôi sẽ không bận tâm đến việc thử với 6 trên máy tính của mình vì điều đó chắc chắn sẽ làm hỏng trình thông dịch.
Tìm kiếm lời khuyên về việc chơi golf, đặc biệt là phần qua thế hệ tọa độ. Tôi cảm thấy như phải có một cách để loại bỏ một số mũ.
]<:[:+/&.:*:"1
có thể được thay thế tương đương bởi *:<:[:+/"1[:*:
.
Giải trình
Giải thích này được thực hiện trên REPL (ba khoảng trắng chỉ ra một lệnh, không có khoảng trắng nào chỉ ra một đầu ra). Tôi sẽ được xây dựng để trả lời.
Tạo tọa độ
#~ #: i.@^~
đưa ra tất cả các tọa độ mà chúng ta quan tâm trên mạng.
^~
là một số được nâng lên chính nó và i.
đưa ra phạm vi [0, n) trong đó n là đầu vào của nó. @
tổng hợp các chức năng đó.
i.@^~ 2
0 1 2 3
#~
sao chép một số của chính nó, ví dụ
#~ 3
3 3 3
#:
chuyển đổi đối số bên phải của nó thành cơ sở được chỉ định bởi mảng được cung cấp làm đối số bên trái của nó. Số chữ số trong mảng tương ứng với số chữ số trong đầu ra cơ sở đó (và bạn có thể có một cơ sở hỗn hợp) Ví dụ:
3 3 3 #: 0
0 0 0
5 5 #: 120
4 0
NB. If you want 120 base 5 use #.inv
#.inv 120
4 4 0
Vì vậy, tất cả cùng nhau, điều này nói liệt kê thông qua tất cả các giá trị cơ sở n (trong đó n là đầu vào) cho đến n ^ n, mang lại hiệu quả cho chúng ta tọa độ của chúng ta.
(#~ #: i.@^~) 2
0 0
0 1
1 0
1 1
Lấy khoảng cách giữa mỗi cặp
Đầu tiên, chúng tôi lấy sự khác biệt của từng tọa độ với tất cả các tọa độ khác bằng cách sử dụng dyad /
-table và ~
-reflexive. Lưu ý rằng điều này không giải thích cho thực tế là thứ tự không quan trọng đối với các cặp: điều này tạo ra khoảng cách trùng lặp.
NB. 2 {. takes the first two elements (I'm omitting the rest).
2 {. -"1/~ (#~ #: i.@^~) 2
0 0
0 _1
_1 0
_1 _1
0 1
0 0
_1 1
_1 0
Sau đó, chúng tôi sử dụng động từ này +/&.:*:
trên mỗi tọa độ (at "1
, aka xếp hạng một). Động từ này là sum ( +/
) dưới ( &.:
) vuông ( *:
). Theo áp dụng động từ bên phải (hình vuông) sau đó thu thập kết quả của nó và đưa nó làm đối số cho động từ bên trái (tổng hợp). Sau đó, nó áp dụng nghịch đảo của động từ bên phải (sẽ là căn bậc hai).
+/&.:*: 3 4
5
+/&.:*:"1 ([: -"1/~ #~ #: i.@^~) 2
0 1 1 1.41421
1 0 1.41421 1
1 1.41421 0 1
1.41421 1 1 0
Không có gì đáng ngạc nhiên, nhiều khoảng cách là như nhau.
Đếm khoảng cách lớn hơn hoặc bằng đầu vào
Phần cuối cùng là xem khoảng cách lớn hơn hoặc bằng đầu vào sử dụng ]<:
. Sau đó, tất cả các kết quả được tính tổng bằng cách sử dụng +/^:_
(tổng cho đến khi hội tụ), đếm số lượng giá trị trung thực. Sau đó, giá trị này được chia cho 2 ( 2%~
, ở đây ~
có nghĩa là hoán đổi thứ tự của các đối số được cung cấp cho %
). Lý do tại sao chúng ta có thể chia cho 2 là vì với mỗi cặp ghép trung thực, sẽ có một số khác cho thứ tự lật ngoại trừ các cặp được phối hợp với chính nó. Tuy nhiên, điều đó cũng ổn, vì những thứ đó sẽ dẫn đến khoảng cách bằng 0.