J , 40 bajtów
2%~[:+/^:_]<:[:+/&.:*:"1[:-"1/~#~#:i.@^~
Wypróbuj online!
Przekroczy limit czasu dla TIO na 5, jeśli użyjesz rozszerzonej precyzji ( 5x
zamiast 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.
]<:[:+/&.:*:"1
moż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.