¡Ahora estamos pensando en n dimensiones!

9

La pregunta: dado un número n≥ 2, ¿cuántos pares distintos de puntos en una red ntridimensional n x n x n x n x n x n ... x n, donde las coordenadas van de 0a n - 1, están a una distancia al menos n separada? Los pares {(2,1,3,1), (3,2,1,3)}y {(3,2,1,3), (2,1,3,1)}no se consideran distintos entre sí, ya que consisten en los mismos dos puntos en orden inverso. Tenga en cuenta que el número total de pares crece muy rápidamente. El número de pares en total va 6, 351, 32 640, 4 881 250, 1 088 367 840, etc.

Casos de prueba:

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)

Su código debería funcionar para n <= 5, al menos en teoría. No lo codifique, es una laguna estándar.

equipado
fuente
^ un programa que puede producir resultados n=15fácilmente
Leaky Nun
tinyurl.com/ya2kmb24 <- portado a C que puede calcular hasta n=20pero sufre mucho de desbordamiento
Leaky Nun
¿Cómo estás midiendo la distancia? Métrica euclidiana? O dado que es una red, ¿estás usando L_1?
Peter Taylor
@PeterTaylor de los casos de prueba, está claro que estamos usando la distancia euclidiana, all pairs are at most a distance of sqrt(2) apartpero eso debería especificarse más claramente.
Giuseppe

Respuestas:

3

MATL , 12 bytes

tt:Z^tZPR>~z

Pruébalo en línea!

Explicación

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
fuente
2

Jalea , 14 13 bytes

1 byte gracias a Dennis.

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

Pruébalo en línea!

Versión maffs rápida

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

Pruébalo en línea!

Monja permeable
fuente
¿Qué intérprete usas para ejecutar esto? Quiero probarlo, pero TIO es demasiado lento para n = 5 (agotado el tiempo de espera después de 1 minuto) prntscr.com/hqbcph
aparejado el
@ bushdid911 si intentas romper el límite, se romperá el límite será
Leaky Nun
Se puede reemplazar æ.`½con ÆḊ€.
dylnan
@ bushdid911 Puede ejecutarse n=5, solo que no en un minuto. (puede tomar más de la edad del universo, tenga cuidado) Este no es el código más rápido, entonces, ¿por qué molestarse en hacer que su código se ejecute rápido?
user202729
1
@ bushdid911 Hice una versión rápida (er).
Leaky Nun
2

Python 2 , 137133 bytes

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

Sr. Xcoder y ovs: -4 bytes. Pruébalo en línea!

dylnan
fuente
135 bytes . (No es necesario incluir f=)
Sr. Xcoder
133 bytes
ovs
2

J , 40 bytes

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

Pruébalo en línea!

Se agota el tiempo de espera en TIO por 5 si usa precisión extendida (en 5xlugar de 5). No me voy a molestar en probar con 6 en mi computadora, ya que eso sin duda bloqueará al intérprete.

Buscando consejos sobre golf, específicamente la parte pasada la generación de las coordenadas. Siento que debería haber una manera de eliminar algunas de las tapas.

]<:[:+/&.:*:"1puede ser reemplazado de manera equivalente por *:<:[:+/"1[:*:.

Explicación

Esta explicación se realiza en REPL (tres espacios indican un comando, ningún espacio indica una salida). Estaré preparando la respuesta.

Generando las coordenadas

#~ #: i.@^~ da todas las coordenadas que nos interesan en la red.

^~es un número elevado a sí mismo y i.da el rango [0, n) donde n es su entrada. @compone esas funciones.

   i.@^~ 2
0 1 2 3

#~ copia un número por sí mismo, p. ej.

   #~ 3
3 3 3

#:convierte su argumento derecho en la base especificada por la matriz dada como argumento izquierdo. El número de dígitos en la matriz corresponde al número de dígitos en esa salida base (y puede tener una base mixta) Por ejemplo,

   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

Entonces, en conjunto, esto dice enumerar a través de todos los valores base n (donde n es la entrada) hasta n ^ n, dándonos efectivamente nuestras coordenadas.

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

Obtener las distancias entre cada par

Primero tomamos la diferencia de cada coordenada con todas las demás usando la tabla de díadas /y el ~reflejo. Tenga en cuenta que esto no explica el hecho de que el orden no importa para los pares: esto genera distancias duplicadas.

  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

Luego usamos este verbo +/&.:*:en cada coordenada (en "1, también conocido como rango uno). Este verbo es sum ( +/) bajo ( &.:) cuadrado ( *:). Under aplica el verbo derecho (cuadrado), luego recoge sus resultados y lo da como argumento del verbo izquierdo (suma). Luego aplica el inverso del verbo derecho (que sería la raíz cuadrada).

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

Como era de esperar, muchas distancias son iguales.

Contando las distancias mayores o iguales a la entrada

La última parte es ver si la distancia es mayor o igual que la entrada usando ]<:. Luego, todos los resultados se suman usando +/^:_(suma hasta converger), contando el número de valores verdaderos. Luego, este valor se divide por 2 ( 2%~aquí ~significa intercambiar el orden de los argumentos suministrados %). La razón por la que podemos dividir entre 2 es porque para cada emparejamiento verdadero, habrá otro para el orden invertido, excepto para los emparejamientos que son una coordenada consigo mismo. Sin embargo, está bien, ya que darán como resultado una distancia de 0.

col
fuente
1
35 bytes con+/@,@(-:@<:+/&.:*:@:-"1/~)#~#:i.@^~
millas