Jetzt denken wir in n Dimensionen!


9

Die Frage: nWie viele verschiedene Punktepaare auf einem neindimensionalen n x n x n x n x n x n ... x nGitter, bei denen die Koordinaten von 0bis reichen n - 1, sind bei einer Zahl ≥ 2 mindestensn voneinander entfernt? Die Paare {(2,1,3,1), (3,2,1,3)}und {(3,2,1,3), (2,1,3,1)}werden nicht als voneinander verschieden betrachtet, da sie aus denselben zwei Punkten in umgekehrter Reihenfolge bestehen. Beachten Sie, dass die Gesamtzahl der Paare sehr schnell wächst. Die Anzahl der Gesamtpaar geht 6, 351, 32 640, 4 881 250, 1 088 367 840usw.

Testfälle:

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)

Ihr Code sollte zumindest theoretisch für n <= 5 funktionieren. Codieren Sie es nicht fest, das ist eine Standardlücke.



^ ein Programm, das n=15leicht Ergebnisse für leicht liefern kann
Leaky Nun

tinyurl.com/ya2kmb24 <- portiert nach C, das bis zu berechnen kann, n=20aber stark unter Überlauf leidet
Leaky Nun

Wie messen Sie die Entfernung? Euklidische Metrik? Oder verwenden Sie L_1, da es sich um ein Gitter handelt?
Peter Taylor

@PeterTaylor Aus den Testfällen geht hervor, dass wir den euklidischen Abstand verwenden, all pairs are at most a distance of sqrt(2) apartaber das sollte klarer angegeben werden.
Giuseppe

Antworten:


3

MATL , 12 Bytes

tt:Z^tZPR>~z

Probieren Sie es online aus!

Erläuterung

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

Gelee , 14 13 Bytes

1 Byte danke an Dennis.

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

Probieren Sie es online aus!

Schnelle maffs Version

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

Probieren Sie es online aus!


Welchen Interpreter verwenden Sie, um dies auszuführen? Ich möchte es versuchen, aber TIO ist zu langsam für n = 5 ( Zeitüberschreitung
manipuliert

@ bushdid911 Wenn Sie versuchen, das Limit zu brechen, wird das Limit gebrochen sein
Leaky Nun

Sie können ersetzen æ.`½mit ÆḊ€.
Dylnan

@ bushdid911 Es kann laufen n=5, nur nicht in einer Minute. (Es kann mehr als das Alter des Universums dauern, seien Sie vorsichtig.) Dies ist nicht der schnellste Code. Warum sollten Sie sich also die Mühe machen, Ihren Code schnell laufen zu lassen?
user202729

1
@ bushdid911 Ich habe eine schnelle (er) Version gemacht.
Undichte Nonne


2

J , 40 Bytes

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

Probieren Sie es online aus!

Wird bei TIO für 5 eine Zeitüberschreitung auftreten, wenn Sie eine erweiterte Genauigkeit verwenden ( 5xanstelle von 5). Ich werde mich nicht die Mühe machen, es mit 6 auf meinem Computer zu versuchen, da dies den Interpreter zweifellos zum Absturz bringen wird.

Auf der Suche nach Ratschlägen zum Golfen, insbesondere nach dem Teil nach der Generierung der Koordinaten. Ich denke, es sollte eine Möglichkeit geben, einige der Kappen zu entfernen.

]<:[:+/&.:*:"1kann äquivalent ersetzt werden durch *:<:[:+/"1[:*:.

Erläuterung

Diese Erklärung erfolgt auf der REPL (drei Leerzeichen geben einen Befehl an, keine Leerzeichen geben eine Ausgabe an). Ich werde auf die Antwort aufbauen.

Koordinaten generieren

#~ #: i.@^~ gibt alle Koordinaten an, die uns auf dem Gitter wichtig sind.

^~ist eine zu sich selbst erhobene Zahl und i.gibt den Bereich [0, n) an, wobei n seine Eingabe ist. @komponiert diese Funktionen.

   i.@^~ 2
0 1 2 3

#~ kopiert eine Nummer selbst, z

   #~ 3
3 3 3

#:konvertiert sein rechtes Argument in die Basis, die durch das als linkes Argument angegebene Array angegeben wird. Die Anzahl der Stellen im Array entspricht der Anzahl der Stellen in dieser Basisausgabe (und Sie können eine gemischte Basis haben).

   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

Alles in allem heißt das also, durch alle Wertebasis n (wobei n die Eingabe ist) bis n ^ n aufzählen und uns effektiv unsere Koordinaten geben.

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

Ermitteln der Abstände zwischen jedem Paar

Zuerst nehmen wir die Differenz jeder Koordinate mit allen anderen unter Verwendung der /Dyadentabelle und ~-reflexiv. Beachten Sie, dass dies nicht die Tatsache berücksichtigt, dass die Reihenfolge für die Paare keine Rolle spielt: Dies erzeugt doppelte Abstände.

  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

Dann verwenden wir dieses Verb +/&.:*:für jede Koordinate (bei "1, auch bekannt als Rang eins). Dieses Verb ist sum ( +/) under ( &.:) square ( *:). Unter wendet das rechte Verb (Quadrat) an, sammelt dann seine Ergebnisse und gibt es als Argument für das linke Verb (Summe) an. Es wird dann die Umkehrung des rechten Verbs (das wäre Quadratwurzel) angewendet.

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

Es überrascht nicht, dass viele Entfernungen gleich sind.

Zählen der Abstände, die größer oder gleich dem Eingang sind

Im letzten Teil wird geprüft, ob der Abstand größer oder gleich dem eingegebenen Wert ist ]<:. Dann werden alle Ergebnisse mit +/^:_(Summe bis Konvergenz) summiert , wobei die Anzahl der Wahrheitswerte gezählt wird. Dann wird dieser Wert durch 2 geteilt ( bedeutet 2%~hier ~, die Reihenfolge der Argumente zu vertauschen %). Der Grund, warum wir durch 2 teilen können, ist, dass es für jede wahrheitsgemäße Paarung eine andere für die gespiegelte Reihenfolge gibt, außer für Paarungen, die eine Koordinate mit sich selbst sind. Das ist jedoch in Ordnung, da dies zu einem Abstand von 0 führt.


1
35 Bytes mit+/@,@(-:@<:+/&.:*:@:-"1/~)#~#:i.@^~
Meilen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.