Die Frage: n
Wie viele verschiedene Punktepaare auf einem n
eindimensionalen n x n x n x n x n x n ... x n
Gitter, bei denen die Koordinaten von 0
bis 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 840
usw.
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.
code-golf
combinatorics
manipulierten
quelle
quelle
n=15
leicht Ergebnisse für leicht liefern kannn=20
aber stark unter Überlauf leidetall pairs are at most a distance of sqrt(2) apart
aber das sollte klarer angegeben werden.Antworten:
MATL , 12 Bytes
Probieren Sie es online aus!
Erläuterung
quelle
Gelee ,
1413 Bytes1 Byte danke an Dennis.
Probieren Sie es online aus!
Schnelle maffs Version
Probieren Sie es online aus!
quelle
æ.`½
mitÆḊ€
.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?Python 2 ,
137133 BytesMr Xcoder & ovs: -4 Bytes. Probieren Sie es online aus!
quelle
f=
J , 40 Bytes
Probieren Sie es online aus!
Wird bei TIO für 5 eine Zeitüberschreitung auftreten, wenn Sie eine erweiterte Genauigkeit verwenden (
5x
anstelle von5
). 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.
]<:[:+/&.:*:"1
kann ä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 undi.
gibt den Bereich [0, n) an, wobei n seine Eingabe ist.@
komponiert diese Funktionen.#~
kopiert eine Nummer selbst, z#:
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).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.
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.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.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 ( bedeutet2%~
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.quelle
+/@,@(-:@<:+/&.:*:@:-"1/~)#~#:i.@^~