J , 40 bayt
2%~[:+/^:_]<:[:+/&.:*:"1[:-"1/~#~#:i.@^~
Çevrimiçi deneyin!
Genişletilmiş hassasiyet kullanırsanız ( 5x
yerine 5
) TIO'da 5 kez zaman aşımına uğrar . Şüphesiz tercümanı çökerteceği için bilgisayarımda 6 ile uğraşmayacağım.
Golf, özellikle koordinatların üretilmesi geçmiş kısmı için tavsiye arıyorum. Bazı kapakları çıkarmanın bir yolu olmalı gibi hissediyorum.
]<:[:+/&.:*:"1
yerine eşdeğer olabilir *:<:[:+/"1[:*:
.
açıklama
Bu açıklama REPL'de yapılır (üç boşluk bir komutu, hiçbir boşluk bir çıktıyı göstermez). Cevabı ben oluşturacağım.
Koordinatları oluşturma
#~ #: i.@^~
örgü üzerinde önem verdiğimiz tüm koordinatları verir.
^~
" i.
Kendine yükseltilmiş bir sayıdır" ve n'nin girdisi olduğu [0, n) aralığını verir. @
bu fonksiyonları oluşturur.
i.@^~ 2
0 1 2 3
#~
bir sayıyı tek başına kopyalar, ör.
#~ 3
3 3 3
#:
sağ argümanını sol argüman olarak verilen dizi tarafından belirtilen tabana dönüştürür . Dizideki basamak sayısı, bu temel çıktıdaki basamak sayısına karşılık gelir (ve karışık bir tabana sahip olabilirsiniz) Örneğin,
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
Yani, hep birlikte, bu, n koordinatlarımızı etkili bir şekilde veren n tabanına (n'nin girdi olduğu) n ^ n değerine kadar tüm değerleri numaralandırdığını söylüyor.
(#~ #: i.@^~) 2
0 0
0 1
1 0
1 1
Her bir çift arasındaki mesafelerin elde edilmesi
İlk olarak, her koordinatın farkını diğer -dyad -table /
ve ~
-reflexive kullanarak alırız. Bunun, siparişin çiftler için önemli olmadığı gerçeğini hesaba katmadığını unutmayın: bu yinelenen mesafeler oluşturur.
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
Sonra bu fiili +/&.:*:
her koordinatta kullanıyoruz (at "1
, aka rank one). Bu fiil +/
( &.:
) square ( *:
) altında sum ( ) şeklindedir . Altında sağ fiil (kare) uygulandıktan sonra sonuçları toplanır ve sol fiile (toplam) argüman olarak verilir. Daha sonra (fiil kökü olacak) sağ fiilin tersini uygular.
+/&.:*: 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
Şaşırtıcı olmayan bir şekilde, birçok mesafe aynı.
Girişe eşit veya daha büyük mesafeleri sayma
Son bölüm, mesafenin kullanılan girişe eşit veya daha büyük olup olmadığını görmektir ]<:
. Daha sonra tüm sonuçlar +/^:_
(yakınsamaya kadar toplam) kullanılarak toplanır ve doğruluk değerleri sayılır. Daha sonra bu değer 2'ye bölünür ( 2%~
burada ~
verilen bağımsız değişkenlerin sırasını değiştirir %
). 2'ye bölebilmemizin nedeni, her bir doğru eşleştirme için, kendisiyle bir koordinat olan eşleşmeler hariç , ters çevrilmiş düzen için başka bir tane olacaktır . Yine de, sorun değil, çünkü bunlar 0 mesafeyle sonuçlanacak.