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
Отримання відстаней між кожною парою
Спочатку ми беремо різницю кожної координати з усіма іншими, використовуючи діад- /
та ~
-рефлексивний. Зауважте, що це не враховує той факт, що порядок не має значення для пар: це генерує повторювані відстані.
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). Це дієслово підсумовує ( +/
) під ( &.:
) квадрат ( *:
). Під застосованим правим дієсловом (квадратом) потім збирається його результат і подається як аргумент лівому дієслову (сума). Потім він застосовує зворотний бік правого дієслова (яке було б квадратним коренем).
+/&.:*: 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.