今、私たちはn次元で考えています!


9

質問:数値nが2以上の場合、座標がからまでの範囲の、2 n次元n x n x n x n x n x n ... x n格子上の点の異なるペアの数は、少なくとも距離がどれだけ離れているか?ペアとは、同じ2つのポイントが逆の順序で構成されているため、互いに区別されているとは見なされません。ペアの総数は非常に急速に増加することに注意してください。総対の数は行く、、、、、など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 '21

tinyurl.com/ya2kmb24 < -まで計算することができるCに移植n=20が、オーバーフローから重度罹患
漏洩ヌンを

どのように距離を測定していますか?ユークリッド計量?または、それが格子であるとすると、L_1を使用していますか?
Peter Taylor

テストケースの@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

あなたは置き換えることができæ.`½ÆḊ€
dylnan 2017

@ bushdid911 n=51分ではなく、実行できます。(宇宙の時代よりも時間がかかるかもしれません、注意してください)これは最速のコードではないので、なぜわざわざコードを高速に実行するのですか?
user202729 2017

1
@ bushdid911高速バージョンを作成しました。
Leaky Nun 2017


2

J、40バイト

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

オンラインでお試しください!

拡張精度(の5x代わりに5)を使用すると、TIO 5でタイムアウトになります。間違いなくインタープリターがクラッシュするので、自分のコンピューターで6を試してみる必要はありません。

ゴルフに関するアドバイス、特に座標の生成を過ぎた部分を探しています。いくつかのキャップを外す方法があるべきだと思います。

]<:[:+/&.:*:"1と同等に置き換えることができます*:<:[:+/"1[:*:

説明

この説明はREPLで行われます(3つのスペースはコマンドを示し、スペースは出力を示しません)。答えまで積み上げていきます。

座標を生成する

#~ #: 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ランク1)で使用します。この動詞は+/、(&.:)四角(*:)の下の和()です。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.@^~
マイル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.