现在我们正在考虑n维!


9

的问题:给定一个数n≥2,多少不同成对的点上的nn x n x n x n x n x n ... x n点阵,其中坐标范围从0n - 1,是一个距离至少 n分开?成对的{(2,1,3,1), (3,2,1,3)}{(3,2,1,3), (2,1,3,1)}不会被视为彼此不同,因为它们由相同的两个相反点组成。请注意,对的总数增长非常迅速。总对数去635132 6404 881 2501 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轻松产生结果的程序
Leaky Nun

tinyurl.com/ya2kmb24 <-移植到C上,它最多可以计算出n=20但会严重遭受溢出
Leaky Nun

您如何测量距离?欧式指标?还是考虑到这是一个格子,您正在使用L_1吗?
彼得·泰勒

从测试用例中获取@PeterTaylor,很明显,我们使用的是欧几里德距离,all pairs are at most a distance of sqrt(2) apart但是应该更清楚地指定。
朱塞佩

Answers:


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

您可以替换æ.`½ÆḊ€
dylnan '17

@ bushdid911它可以运行n=5,仅需不到一分钟。(请注意,它可能需要花费比宇宙时代更长的时间)这不是最快的代码,那么为什么还要麻烦地让您的代码快速运行?
user202729

1
@ bushdid911我制作了一个更快的版本。
Leaky Nun


2

J,40个字节

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

在线尝试!

如果您使用扩展精度(5x而不是5),则会在TIO上超时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

然后,我们+/&.:*:在每个坐标上使用该动词(在"1,又名第一)。这个动词是+/&.:)方(*:)下的sum ()。Under应用右动词(正方形),然后收集其结果并将其作为左动词(和)的自变量。然后,它应用右动词的逆词(将是平方根)。

   +/&.:*: 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.@^~
英里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.