Тепер ми думаємо в n вимірах!


9

Питання: З огляду на число n≥ 2, скільки різних пар точок на nn - вимірному n x n x n x n x n x n ... x nрешітці, де координати в діапазоні від 0до n - 1, яку щонайменше n , на частини? Пари {(2,1,3,1), (3,2,1,3)}і {(3,2,1,3), (2,1,3,1)}не вважаються відмінними одна від одної, оскільки складаються з тих самих двох точок у зворотному порядку. Зауважимо, що загальна кількість пар зростає дуже швидко. Загальна кількість пар йде 6, 351, 32 640, 4 881 250, 1 088 367 840і т.д.

Тестові приклади:

2 -> 0 (all pairs are at most a distance of sqrt(2) < 2 apart)
3 -> 28 (They must either be (2,2,1) or a permutation apart, or (2,2,2) apart. Each corner
has three non-corner (2,2,1) points corresponding to it. And each corner is associated 
with a corner pair that is a (2,2,2). Thus. 3.5 * 8 = 28.
4 -> 4,888
5 -> 1,501,948
6 -> 486,039,360 (I would like someone to verify this if possible)

Ваш код повинен працювати при n <= 5, принаймні теоретично. Не твердий код, це стандартна лазівка.



^ Програма , яка може виробляти результати n=15легко
Дірявий Nun

tinyurl.com/ya2kmb24 <- перенесено на C, яке може обчислити до, n=20але сильно страждає від переповнення
Leaky Nun

Як ви вимірюєте відстань? Евклідова метрика? Або враховуючи, що ви використовуєте решітку L_1?
Пітер Тейлор

@PeterTaylor з тестових випадків зрозуміло, що ми використовуємо евклідову відстань, all pairs are at most a distance of sqrt(2) apartале це слід уточнити більш чітко.
Джузеппе

Відповіді:


3

MATL , 12 байт

tt:Z^tZPR>~z

Спробуйте в Інтернеті!

Пояснення

tt   % Implicit input n. Duplicate twice
     % STACK: n, n, n
:    % Range [1 2 ... n]
     % STACK: n, n, [1 2 ... n]
Z^   % Cartesian power. Gives an n^n × n matrix C where each row is a Cartesian tuple
     % STACK: n, C
t    % Duplicate
     % STACK: n, C, C
ZP   % Euclidean distance. Gives an n^n × n^n matrix D of pairwise distances
     % STACK: n, D
R    % Upper triangular part: sets elements below the main diagonal to 0. Call that U
     % STACK: n, U
>~   % Less than or equal? Element-wise. Gives a true-false matrix B
     % STACK: n, B
z    % Number of nonzeros. Implicitly display
     % STACK: number of entries in B that equal true

2

Желе , 14 13 байт

1 байт завдяки Деннісу.

ṗ⁸Œc_/€ÆḊ€<ċ0

Спробуйте в Інтернеті!

Версія швидкої мафії

ŒgL€!P:@L!$×P
²S<
ḶœċçÐḟ²ð>0S’2*×⁸ạ⁹$Ѥð€S

Спробуйте в Інтернеті!


Який інтерпретатор ви використовуєте для цього? Я хочу спробувати це, але TIO занадто повільний для n = 5 (вичерпано через 1 хвилину) prntscr.com/hqbcph
сфальсифікований

@ bushdid911, якщо ви спробуєте пробити межу, порушена межа буде
Leaky Nun

Ви можете замінити æ.`½на ÆḊ€.
ділнан

@ bushdid911 Він може працювати n=5, але не за одну хвилину. (це може зайняти більше віку Всесвіту, будьте обережні) Це не найшвидший код, то чому б не турбуватися змусити ваш код швидко працювати?
користувач202729

1
@ bushdid911 Я зробив швидку (ер) версію.
Leaky Nun


2

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.


1
35 байт з+/@,@(-:@<:+/&.:*:@:-"1/~)#~#:i.@^~
миль
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.