J , 40 bajtów
2%~[:+/^:_]<:[:+/&.:*:"1[:-"1/~#~#:i.@^~
Wypróbuj online!
Przekroczy limit czasu dla TIO na 5, jeśli użyjesz rozszerzonej precyzji ( 5xzamiast 5). Nie zamierzam zawracać sobie głowy próbowaniem z 6 na moim komputerze, ponieważ to z pewnością spowoduje awarię interpretera.
Poszukuję porady na temat gry w golfa, w szczególności tej po wygenerowaniu współrzędnych. Czuję, że powinien istnieć sposób na usunięcie niektórych nakrętek.
]<:[:+/&.:*:"1może być równoważnie zastąpiony przez *:<:[:+/"1[:*:.
Wyjaśnienie
Wyjaśnienie to zostało wykonane na REPL (trzy spacje oznaczają polecenie, brak spacji oznacza wynik). Będę budować do odpowiedzi.
Generowanie współrzędnych
#~ #: i.@^~ podaje wszystkie współrzędne, na których nam zależy, na siatce.
^~jest liczbą podniesioną do siebie i i.daje zakres [0, n), gdzie n jest jego wejściem. @komponuje te funkcje.
i.@^~ 2
0 1 2 3
#~ samodzielnie kopiuje liczbę, np
#~ 3
3 3 3
#:konwertuje swój prawy argument na bazę określoną przez tablicę podaną jako lewy argument. Liczba cyfr w tablicy odpowiada liczbie cyfr w tej wyjściowej podstawie (i możesz mieć mieszaną bazę) Na przykład:
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
Podsumowując, mówi się o wyliczeniu przez wszystkie wartości od podstawy n (gdzie n jest wejściem) do n ^ n, skutecznie podając nasze współrzędne.
(#~ #: i.@^~) 2
0 0
0 1
1 0
1 1
Uzyskiwanie odległości między każdą parą
Najpierw bierzemy różnicę każdej współrzędnej ze wszystkimi pozostałymi za pomocą tabeli /- ~diada i -refleksji. Zauważ, że nie bierze to pod uwagę faktu, że kolejność nie ma znaczenia dla par: generuje to podwójne odległości.
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
Następnie używamy tego czasownika +/&.:*:na każdej współrzędnej (at "1, aka ranga 1). Ten czasownik to sum ( +/) under ( &.:) square ( *:). Pod stosuje się prawy czasownik (kwadrat), a następnie zbiera jego wyniki i podaje go jako argument dla lewego czasownika (suma). Następnie stosuje odwrotność prawego czasownika (który byłby pierwiastkiem kwadratowym).
+/&.:*: 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
Nic dziwnego, że wiele odległości jest takich samych.
Liczenie odległości większych lub równych wejściowi
Ostatnią częścią jest sprawdzenie, czy odległość jest większa lub równa wartości wejściowej przy użyciu ]<:. Następnie wszystkie wyniki są sumowane za pomocą +/^:_(sumuj aż do zbieżności), licząc liczbę prawdziwych wartości. Następnie wartość ta jest dzielona przez 2 ( 2%~tutaj ~oznacza zamianę kolejności dostarczonych argumentów %). Powodem, dla którego możemy podzielić przez 2, jest to, że dla każdej zgodnej z prawdą parowania będzie kolejna dla odwróconej kolejności, z wyjątkiem par, które są ze sobą współrzędnymi. W porządku, ponieważ spowoduje to powstanie odległości 0.