J , 40 byte
2%~[:+/^:_]<:[:+/&.:*:"1[:-"1/~#~#:i.@^~
Cobalah online!
Akan kehabisan waktu pada TIO selama 5 jika Anda menggunakan presisi yang diperluas ( 5x
bukan 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.
]<:[:+/&.:*:"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, 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.