Sekarang kita berpikir dalam dimensi n!

9

Pertanyaannya: Diberi angka n≥ 2, berapa banyak pasangan titik yang berbeda pada kisi n-dimensi n x n x n x n x n x n ... x n, di mana koordinat berkisar dari 0hingga n - 1, adakah jarak setidaknya n terpisah? Pasangan {(2,1,3,1), (3,2,1,3)}dan {(3,2,1,3), (2,1,3,1)}tidak dianggap berbeda satu sama lain, karena mereka terdiri dari dua titik yang sama dalam urutan terbalik. Perhatikan bahwa jumlah pasangan tumbuh sangat cepat. Jumlah total pasangan pergi 6, 351, 32 640, 4 881 250, 1 088 367 840, dll

Kasus uji:

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)

Kode Anda harus bekerja untuk n <= 5, setidaknya dalam teori. Jangan hardcode itu, itu celah standar.

dicurangi
sumber
^ sebuah program yang dapat memberikan hasil n=15dengan mudah
Leaky Nun
tinyurl.com/ya2kmb24 <- porting ke C yang dapat menghitung hingga n=20tetapi sangat menderita dari luapan
Leaky Nun
Bagaimana Anda mengukur jarak? Metrik Euclidean? Atau karena itu adalah kisi, apakah Anda menggunakan L_1?
Peter Taylor
@PeterTaylor dari kasus uji, jelas bahwa kami menggunakan jarak Euclidean all pairs are at most a distance of sqrt(2) aparttapi itu harus ditentukan lebih jelas.
Giuseppe

Jawaban:

3

MATL , 12 byte

tt:Z^tZPR>~z

Cobalah online!

Penjelasan

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
Luis Mendo
sumber
2

Jelly , 14 13 byte

Terima kasih 1 byte untuk Dennis.

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

Cobalah online!

Versi maffs cepat

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

Cobalah online!

Biarawati Bocor
sumber
Juru bahasa apa yang Anda gunakan untuk menjalankan ini? Saya ingin mencobanya tetapi TIO terlalu lambat untuk n = 5 (kehabisan waktu setelah 1 menit) prntscr.com/hqbcph
dicurangi
@ bushdid911 jika Anda mencoba untuk menembus batas, batasnya akan rusak
Leaky Nun
Anda bisa menggantinya æ.`½dengan ÆḊ€.
dylnan
@ bushdid911 Itu bisa berjalan n=5, tidak hanya dalam satu menit. (mungkin butuh waktu lebih dari usia alam semesta, berhati-hatilah) Ini bukan kode tercepat, jadi mengapa repot-repot membuat kode Anda berjalan cepat?
user202729
1
@ bushdid911 Saya membuat versi cepat (er).
Leaky Nun
2

Python 2 , 137 133 byte

lambda n:sum(n*n<=sum((o[i]-p[i])**2for i in range(n))for o,p in q(q(range(n),repeat=n),repeat=2))/2
from itertools import*
q=product

Mr Xcoder & ovs: -4 byte. Cobalah online!

dylnan
sumber
135 byte . (Tidak perlu menyertakan f=)
Tn. Xcoder
133 byte
ovs
2

J , 40 byte

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

Cobalah online!

Akan kehabisan waktu pada TIO selama 5 jika Anda menggunakan presisi yang diperluas ( 5xbukan 5). Saya tidak akan repot mencoba dengan 6 di komputer saya karena itu tidak diragukan lagi akan menabrak penerjemah.

Mencari nasihat tentang bermain golf, khususnya bagian yang melewati generasi koordinat. Saya merasa harus ada cara untuk menghilangkan beberapa tutupnya.

]<:[:+/&.:*:"1dapat diganti secara setara dengan *:<:[:+/"1[:*:.

Penjelasan

Penjelasan ini dilakukan pada REPL (tiga spasi menunjukkan perintah, tidak ada spasi menunjukkan output). Saya akan membangun untuk jawabannya.

Menghasilkan koordinat

#~ #: i.@^~ memberikan semua koordinat yang kita pedulikan pada kisi.

^~adalah angka yang dinaikkan ke dirinya sendiri, dan i.memberikan kisaran [0, n) di mana n adalah inputnya. @menyusun fungsi-fungsi tersebut.

   i.@^~ 2
0 1 2 3

#~ menyalin nomor dengan sendirinya, mis

   #~ 3
3 3 3

#:mengonversi argumen kanannya ke basis yang ditentukan oleh larik yang diberikan sebagai argumen kirinya. Jumlah digit dalam array sesuai dengan jumlah digit pada output basis tersebut (dan Anda dapat memiliki basis campuran) Sebagai contoh,

   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

Jadi, secara keseluruhan, ini mengatakan menghitung melalui semua basis nilai n (di mana n adalah input) hingga n ^ n, secara efektif memberi kita koordinat kita.

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

Dapatkan jarak antara masing-masing pasangan

Pertama-tama kita mengambil perbedaan dari masing-masing koordinat dengan yang lainnya menggunakan dyad -table /dan ~-reflexive. Perhatikan bahwa ini tidak memperhitungkan fakta bahwa pesanan tidak masalah untuk pasangan: ini menghasilkan jarak duplikat.

  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

Kemudian kita menggunakan kata kerja ini +/&.:*:pada setiap koordinat (at "1, alias peringkat satu). Kata kerja ini adalah jumlah ( +/) di bawah ( &.:) kuadrat ( *:). Di bawah menerapkan kata kerja kanan (persegi) kemudian mengumpulkan hasilnya dan memberikannya sebagai argumen ke kata kerja kiri (jumlah). Ini kemudian menerapkan kebalikan dari kata kerja kanan (yang akan menjadi akar kuadrat).

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

Tidak mengherankan, banyak jarak yang sama.

Menghitung jarak yang lebih besar dari atau sama dengan input

Bagian terakhir adalah melihat apakah jarak lebih besar dari atau sama dengan input yang digunakan ]<:. Kemudian semua hasil dijumlahkan menggunakan +/^:_(jumlah sampai konvergen), menghitung jumlah nilai-nilai kebenaran. Kemudian nilai ini dibagi 2 ( 2%~, di sini ~berarti menukar urutan argumen yang diberikan ke %). Alasan mengapa kita dapat membagi dengan 2 adalah karena untuk setiap pasangan yang benar, akan ada satu lagi untuk urutan terbalik kecuali untuk pasangan yang berkoordinasi dengan dirinya sendiri. Tapi tidak apa-apa, karena itu akan menghasilkan jarak 0.

cole
sumber
1
35 byte dengan+/@,@(-:@<:+/&.:*:@:-"1/~)#~#:i.@^~
miles