Ora stiamo pensando in n dimensioni!


9

La domanda: dato un numero n≥ 2, quante coppie distinte di punti su un reticolo ntridimensionale n x n x n x n x n x n ... x n, in cui le coordinate vanno da 0a n - 1, sono almeno n distanti? Le coppie {(2,1,3,1), (3,2,1,3)}e {(3,2,1,3), (2,1,3,1)}non sono considerate distinte l'una dall'altra, poiché sono costituite dagli stessi due punti in ordine inverso. Si noti che il numero totale di coppie cresce molto rapidamente. Il numero di coppie totale va 6, 351, 32 640, 4 881 250, 1 088 367 840, etc.

Casi test:

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)

Il tuo codice dovrebbe funzionare per n <= 5, almeno in teoria. Non codificarlo, è una scappatoia standard.



^ un programma che può produrre n=15facilmente risultati
Leaky Nun,

tinyurl.com/ya2kmb24 <- portato su C che può calcolare fino a, n=20ma soffre pesantemente di trabocco
Leaky Nun,

Come stai misurando la distanza? Metrica euclidea? O dato che è un reticolo stai usando L_1?
Peter Taylor,

@PeterTaylor dai casi di test, è chiaro che stiamo usando la distanza euclidea all pairs are at most a distance of sqrt(2) apartma questo dovrebbe essere specificato più chiaramente.
Giuseppe,

Risposte:


3

MATL , 12 byte

tt:Z^tZPR>~z

Provalo online!

Spiegazione

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

Gelatina , 14 13 byte

1 byte grazie a Dennis.

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

Provalo online!

Versione Quick Maffs

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

Provalo online!


Quale interprete usi per eseguire questo? Voglio provarlo ma TIO è troppo lento per n = 5 (scaduto dopo 1 minuto) prntscr.com/hqbcph
truccato il

@ bushdid911 se provi a infrangere il limite, il limite sarà rotto
Leaky Nun

È possibile sostituire æ.`½con ÆḊ€.
dylnan,

@ bushdid911 Può funzionare n=5, ma non in un minuto. (potrebbe richiedere più dell'età dell'universo, fai attenzione) Questo non è il codice più veloce, quindi perché preoccuparsi di far funzionare il tuo codice velocemente?
user202729

1
@ bushdid911 Ho realizzato una versione veloce (er).
Leaky Nun,


2

J , 40 byte

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

Provalo online!

Timeout su TIO per 5 se si utilizza la precisione estesa ( 5xanziché 5). Non mi preoccuperò di provare con 6 sul mio computer poiché questo senza dubbio farà bloccare l'interprete.

Alla ricerca di consigli sul golf, in particolare la parte passata alla generazione delle coordinate. Sento che dovrebbe esserci un modo per rimuovere alcuni tappi.

]<:[:+/&.:*:"1può essere equivalentemente sostituito da *:<:[:+/"1[:*:.

Spiegazione

Questa spiegazione è fatta sul REPL (tre spazi indicano un comando, nessuno spazio indica un output). Costruirò fino alla risposta.

Generare le coordinate

#~ #: i.@^~ fornisce tutte le coordinate a cui teniamo sul reticolo.

^~è un numero elevato a se stesso e i.fornisce l'intervallo [0, n) dove n è il suo input. @compone quelle funzioni.

   i.@^~ 2
0 1 2 3

#~ copia un numero da solo, ad es

   #~ 3
3 3 3

#:converte l'argomento destro nella base specificata dall'array fornito come argomento sinistro. Il numero di cifre nell'array corrisponde al numero di cifre nell'output di base (e puoi avere una base mista) Ad esempio,

   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

Quindi, tutti insieme, questo dice enumerare attraverso tutti i valori base n (dove n è l'input) fino a n ^ n, dandoci effettivamente le nostre coordinate.

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

Ottenere le distanze tra ogni coppia

Per prima cosa prendiamo la differenza di ciascuna coordinata con tutte le altre usando la diade -table /e ~-reflexive. Nota che questo non tiene conto del fatto che l'ordine non ha importanza per le coppie: questo genera distanze duplicate.

  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

Quindi usiamo questo verbo +/&.:*:su ciascuna coordinata (al "1livello 1). Questo verbo è sum ( +/) under ( &.:) square ( *:). Sotto applica il verbo destro (quadrato) quindi raccoglie i suoi risultati e lo fornisce come argomento al verbo sinistro (somma). Quindi applica l'inverso del verbo destro (che sarebbe radice quadrata).

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

Non sorprende che molte distanze siano uguali.

Contando le distanze maggiori o uguali all'ingresso

L'ultima parte sta vedendo se la distanza è maggiore o uguale all'input usando ]<:. Quindi tutti i risultati vengono sommati usando +/^:_(somma fino a convergere), contando il numero di valori di verità. Quindi questo valore viene diviso per 2 ( 2%~qui ~significa scambiare l'ordine degli argomenti forniti a %). Il motivo per cui possiamo dividere per 2 è perché per ogni accoppiamento vero, ce ne sarà un altro per l'ordine invertito, tranne per gli accoppiamenti che sono coordinate con se stesso. Va bene, però, dal momento che quelli porteranno a una distanza di 0.


1
35 byte con+/@,@(-:@<:+/&.:*:@:-"1/~)#~#:i.@^~
miglia il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.