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 0
hingga 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.
code-golf
combinatorics
dicurangi
sumber
sumber
n=15
dengan mudahn=20
tetapi sangat menderita dari luapanall pairs are at most a distance of sqrt(2) apart
tapi itu harus ditentukan lebih jelas.Jawaban:
MATL , 12 byte
Cobalah online!
Penjelasan
sumber
Jelly ,
1413 byteTerima kasih 1 byte untuk Dennis.
Cobalah online!
Versi maffs cepat
Cobalah online!
sumber
æ.`½
denganÆḊ€
.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?Python 2 ,
137133 byteMr Xcoder & ovs: -4 byte. Cobalah online!
sumber
f=
)J , 40 byte
Cobalah online!
Akan kehabisan waktu pada TIO selama 5 jika Anda menggunakan presisi yang diperluas (
5x
bukan5
). 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.
]<:[:+/&.:*:"1
dapat 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, dani.
memberikan kisaran [0, n) di mana n adalah inputnya.@
menyusun fungsi-fungsi tersebut.#~
menyalin nomor dengan sendirinya, mis#:
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,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.
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.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).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.sumber
+/@,@(-:@<:+/&.:*:@:-"1/~)#~#:i.@^~