Teraz myślimy w n wymiarach!

9

Pytanie: Biorąc pod uwagę liczbę n≥ 2, ile par punktów na odrębne nwymiarowej n x n x n x n x n x n ... x nsiatki, gdzie współrzędne wynosić od 0celu n - 1, są w odległości co najmniej n od siebie? Pary {(2,1,3,1), (3,2,1,3)}i {(3,2,1,3), (2,1,3,1)}nie są uważane za odrębne od siebie, ponieważ składają się z tych samych dwóch punktów w odwrotnej kolejności. Zauważ, że całkowita liczba par rośnie bardzo szybko. Liczba wszystkich parach idzie 6, 351, 32 640, 4 881 250, 1 088 367 840, itd.

Przypadki testowe:

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)

Twój kod powinien działać dla n <= 5, przynajmniej w teorii. Nie koduj na stałe, to standardowa luka.

takielunek
źródło
tio.run
Leaky Nun
^ Program, który można wytwarzać wyników dla n=15łatwo
nieszczelnego Nun
tinyurl.com/ya2kmb24 <- przeniesiony do C, który może obliczyć do, n=20ale bardzo cierpi z powodu przepełnienia
Leaky Nun
Jak mierzysz odległość? Metryka euklidesowa? Czy biorąc pod uwagę, że jest to sieć, używasz L_1?
Peter Taylor
@PeterTaylor z przypadków testowych, jasne jest, że używamy odległości euklidesowej, all pairs are at most a distance of sqrt(2) apartale należy to sprecyzować.
Giuseppe,

Odpowiedzi:

3

MATL , 12 bajtów

tt:Z^tZPR>~z

Wypróbuj online!

Wyjaśnienie

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
Luis Mendo
źródło
2

Galaretka , 14 13 bajtów

1 bajt dzięki Dennisowi.

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

Wypróbuj online!

Szybka wersja maffs

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

Wypróbuj online!

Leaky Nun
źródło
Jakiego tłumacza używasz do uruchomienia tego? Chcę tego spróbować, ale TIO jest zbyt wolne dla n = 5 ( upłynął limit
sfałszowany
@ bushdid911, jeśli spróbujesz przekroczyć limit, złamany limit będzie
Leaky Nun
Można wymienić æ.`½z ÆḊ€.
dylnan
@ bushdid911 Może działać n=5, tylko nie za minutę. (może to zająć więcej niż wiek wszechświata, bądź ostrożny) To nie jest najszybszy kod, więc po co zawracać sobie głowę szybkim działaniem kodu?
user202729,
1
@ bushdid911 Zrobiłem szybką (er) wersję.
Leaky Nun
2

Python 2 , 137 133 bajtów

lambda n:sum(n*n<=sum((o[i]-p[i])**2for i in range(n))for o,p in q(q(range(n),repeat=n),repeat=2))/2
from itertools import*
q=product

Mr Xcoder i ovs: -4 bajty. Wypróbuj online!

dylnan
źródło
135 bajtów . (Nie trzeba dołączać f=)
Pan Xcoder,
133 bajty
ovs
2

J , 40 bajtów

2%~[:+/^:_]<:[:+/&.:*:"1[:-"1/~#~#:i.@^~

Wypróbuj online!

Przekroczy limit czasu dla TIO na 5, jeśli użyjesz rozszerzonej precyzji ( 5xzamiast 5). Nie zamierzam zawracać sobie głowy próbowaniem z 6 na moim komputerze, ponieważ to z pewnością spowoduje awarię interpretera.

Poszukuję porady na temat gry w golfa, w szczególności tej po wygenerowaniu współrzędnych. Czuję, że powinien istnieć sposób na usunięcie niektórych nakrętek.

]<:[:+/&.:*:"1może być równoważnie zastąpiony przez *:<:[:+/"1[:*:.

Wyjaśnienie

Wyjaśnienie to zostało wykonane na REPL (trzy spacje oznaczają polecenie, brak spacji oznacza wynik). Będę budować do odpowiedzi.

Generowanie współrzędnych

#~ #: i.@^~ podaje wszystkie współrzędne, na których nam zależy, na siatce.

^~jest liczbą podniesioną do siebie i i.daje zakres [0, n), gdzie n jest jego wejściem. @komponuje te funkcje.

   i.@^~ 2
0 1 2 3

#~ samodzielnie kopiuje liczbę, np

   #~ 3
3 3 3

#:konwertuje swój prawy argument na bazę określoną przez tablicę podaną jako lewy argument. Liczba cyfr w tablicy odpowiada liczbie cyfr w tej wyjściowej podstawie (i możesz mieć mieszaną bazę) Na przykład:

   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

Podsumowując, mówi się o wyliczeniu przez wszystkie wartości od podstawy n (gdzie n jest wejściem) do n ^ n, skutecznie podając nasze współrzędne.

   (#~ #: i.@^~) 2
0 0
0 1
1 0
1 1

Uzyskiwanie odległości między każdą parą

Najpierw bierzemy różnicę każdej współrzędnej ze wszystkimi pozostałymi za pomocą tabeli /- ~diada i -refleksji. Zauważ, że nie bierze to pod uwagę faktu, że kolejność nie ma znaczenia dla par: generuje to podwójne odległości.

  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

Następnie używamy tego czasownika +/&.:*:na każdej współrzędnej (at "1, aka ranga 1). Ten czasownik to sum ( +/) under ( &.:) square ( *:). Pod stosuje się prawy czasownik (kwadrat), a następnie zbiera jego wyniki i podaje go jako argument dla lewego czasownika (suma). Następnie stosuje odwrotność prawego czasownika (który byłby pierwiastkiem kwadratowym).

   +/&.:*: 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

Nic dziwnego, że wiele odległości jest takich samych.

Liczenie odległości większych lub równych wejściowi

Ostatnią częścią jest sprawdzenie, czy odległość jest większa lub równa wartości wejściowej przy użyciu ]<:. Następnie wszystkie wyniki są sumowane za pomocą +/^:_(sumuj aż do zbieżności), licząc liczbę prawdziwych wartości. Następnie wartość ta jest dzielona przez 2 ( 2%~tutaj ~oznacza zamianę kolejności dostarczonych argumentów %). Powodem, dla którego możemy podzielić przez 2, jest to, że dla każdej zgodnej z prawdą parowania będzie kolejna dla odwróconej kolejności, z wyjątkiem par, które są ze sobą współrzędnymi. W porządku, ponieważ spowoduje to powstanie odległości 0.

kapusta
źródło
1
35 bajtów z+/@,@(-:@<:+/&.:*:@:-"1/~)#~#:i.@^~
mil