J , 40 байт
2%~[:+/^:_]<:[:+/&.:*:"1[:-"1/~#~#:i.@^~
Попробуйте онлайн!
Тайм-аут на TIO на 5, если вы используете расширенную точность ( 5x
вместо 5
). Я не собираюсь пытаться использовать 6 на моем компьютере, так как это, несомненно, приведет к сбою переводчика.
Нужны советы по игре в гольф, в частности, часть прошлого поколения координат. Я чувствую, что должен быть способ снять некоторые крышки.
]<:[:+/&.:*:"1
может быть эквивалентно заменен на *:<:[:+/"1[:*:
.
объяснение
Это объяснение сделано в REPL (три пробела указывают на команду, пробелы не указывают на вывод). Я буду готовиться к ответу.
Генерация координат
#~ #: i.@^~
дает все координаты, которые нам нужны на решетке.
^~
является числом, возведенным в себя, и i.
дает диапазон [0, n), где n - его ввод. @
сочиняет эти функции.
i.@^~ 2
0 1 2 3
#~
копирует номер самостоятельно, например
#~ 3
3 3 3
#:
преобразует свой правый аргумент в базу, указанную в массиве, указанном в качестве его левого аргумента. Количество цифр в массиве соответствует количеству цифр в этом базовом выводе (и вы можете иметь смешанную базу). Например,
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
Таким образом, все вместе, это говорит, перечислите через все значения базы n (где n - вход) до n ^ n, эффективно давая нам наши координаты.
(#~ #: i.@^~) 2
0 0
0 1
1 0
1 1
Получение расстояния между каждой парой
Сначала мы берем разницу каждой координаты со всеми остальными, используя /
dyad -table и ~
-reflexive. Обратите внимание, что это не учитывает тот факт, что порядок не имеет значения для пар: это создает повторяющиеся расстояния.
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
Затем мы используем этот глагол +/&.:*:
в каждой координате (at "1
, aka rank one). Этот глагол есть sum ( +/
) под ( &.:
) square ( *:
). Under применяет правый глагол (квадрат), затем собирает его результаты и передает его в качестве аргумента левому глаголу (sum). Затем он применяет инверсию правого глагола (который будет квадратный корень).
+/&.:*: 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
Неудивительно, что многие расстояния одинаковы.
Подсчет расстояний больше или равно входу
Последняя часть проверяет, больше или равно ли расстояние входному значению ]<:
. Затем все результаты суммируются с помощью +/^:_
(сумма до сходятся), считая количество истинных значений. Затем это значение делится на 2 ( 2%~
здесь это ~
означает, что нужно поменять местами порядок аргументов %
). Причина, по которой мы можем разделить на 2, заключается в том, что для каждого истинного спаривания будет другой для перевернутого порядка, кроме пар, которые являются координатой с самим собой. Это нормально, так как это приведет к расстоянию 0.