Oto szybkie wyzwanie w poniedziałek rano ...
Napisz funkcję lub program w najmniejszej liczbie bajtów, która:
- Pobiera na wejściu listę
[x,y]
współrzędnych - Pobiera na wejściu listę
[x,y]
odpowiednich mas współrzędnych - Wysyła obliczony środek masy w postaci
[xBar,yBar]
.
Uwaga:
- Dane wejściowe można przyjmować w dowolnej formie, o ile używana jest tablica.
Środek masy można obliczyć według następującego wzoru:
W prostym angielskim...
- Aby znaleźć
xBar
, pomnóż każdą masę przez odpowiednią współrzędną x, zsumuj wynikową listę i podziel ją przez sumę wszystkich mas. - Aby znaleźć
yBar
, pomnóż każdą masę przez odpowiednią współrzędną y, zsumuj wynikową listę i podziel ją przez sumę wszystkich mas.
Przykład z Trivial Python 2.7:
def center(coord, mass):
sumMass = float(reduce(lambda a, b: a+b, mass))
momentX = reduce(lambda m, x: m+x, (a*b for a, b in zip(mass, zip(*coord)[0])))
momentY = reduce(lambda m, y: m+y, (a*b for a, b in zip(mass, zip(*coord)[1])))
xBar = momentX / sumMass
yBar = momentY / sumMass
return [xBar, yBar]
Przypadki testowe:
> center([[0, 2], [3, 4], [0, 1], [1, 1]], [2, 6, 2, 10])
[1.4, 2.0]
> center([[3, 1], [0, 0], [1, 4]], [2, 4, 1])
[1.0, 0.8571428571428571]
To jest golf golfowy, więc wygrywa najmniej bajtów!
code-golf
arithmetic
array-manipulation
Mr Public
źródło
źródło
[x,y,m],[x,y,m]...
:?[(x1,y1,m1), (x2,y2,m2)]
np. Listą krotek? Czy nie ma znaczenia, czy argumentami są krotki, listy czy tablice? Co z trzema listami / tablicami?Odpowiedzi:
MATL ,
65 bajtówFormat wejściowy to wektor wiersza z masami, a następnie macierz dwukolumnowa ze współrzędnymi (w których spacje lub przecinki są opcjonalne).
Pierwszy przykład:
Drugi przykład:
Wypróbuj online!
Wyjaśnienie
Niech
m
oznaczymy wektor mas (pierwsze wejście) ic
macierz współrzędnych (drugie wejście).źródło
y
jest bardzo przydatne !! +1Mathematica, 10 bajtów
Przykład:
źródło
Dot
. Ale zrobię to po zobaczeniu twojego użycia powyżej!Mathcad, 19 „bajtów”
Ponieważ Mathcad używa 2D „tablicy” i operatorów specjalnych (np. Operatora sumowania, operatora całkującego) i zapisuje w formacie XML, rzeczywisty arkusz roboczy może zawierać kilkaset (lub więcej) znaków. Na potrzeby Code Golf podjąłem „liczbę bajtów” Mathcada, która jest liczbą znaków lub operatorów, które użytkownik musi wprowadzić, aby utworzyć arkusz.
Pierwsza (programowa) wersja wyzwania zajmuje 19 „bajtów” przy użyciu tej definicji, a wersja funkcji zajmuje 41 „bajtów”.
źródło
MATLAB / Octave,
1816 bajtówDzięki zlewce użytkownika i Donowi Musli za usunięcie 2 bajtów!
Biorąc pod uwagę, że współrzędne są w
N x 2
macierzy,x
gdzie pierwsza kolumna jest współrzędną X, a druga kolumna jest współrzędną Y, a masy są w1 x N
macierzyy
(lub wektorze wiersza):Wyjaśnienie tego kodu jest dość proste. Jest to anonimowa funkcja, która przyjmuje dwa wejścia
x
iy
. Wykonujemy ważone sumowanie (wyrażenie licznika każdej współrzędnej) w algebrze liniowej przy użyciu mnożenia macierzy-wektora. Biorąc wektory
mas i mnożąc go przez macierz współrzędnychx
przez mnożenie macierzy-wektora, obliczymy indywidualnie ważoną sumę obu współrzędnych, a następnie dzielimy każdą z tych współrzędnych przez sumę mas, w ten sposób znajdując pożądany środek masa zwrócona jako wektor 1 x 2 wierszy odpowiednio dla każdej współrzędnej.Przykład działa
Wypróbuj online!
https://ideone.com/BzbQ3e
źródło
;
, a także'
odpowiednio wybierając format wejściowy (x
jako wektor wiersza)Galaretka, 6 bajtów
lub
Wprowadzanie odbywa się za pomocą dwóch argumentów wiersza polecenia, najpierw masy, a druga koordynuje.
Wypróbuj online!
Wyjaśnienie
lub
źródło
Julia,
2517 bajtówPominięto oczywiste podejście: / Call like
f([3 1;0 0;1 4], [2 4 1])
.źródło
CJam, 14 bajtów
Bezimienna funkcja z oczekuje listy par współrzędnych i listy mas na stosie (w tej kolejności) i pozostawia środek masy na swoim miejscu.
Sprawdź to tutaj.
Wyjaśnienie
źródło
Perl 6,
363330 bajtówźródło
Poważnie, 16 bajtów
Pobiera dane wejściowe jako
[x-coords]\n[y-coords]\n[masses]
, a dane wyjściowe jakoxbar\nybar
Wypróbuj online!
Wyjaśnienie:
źródło
Haskell,
5550 bajtówDefiniuje to funkcję binarną
f
, używaną w następujący sposób:Zobacz, jak przejdzie oba przypadki testowe.
Wyjaśnienie
Haskell nie nadaje się do przetwarzania list wielowymiarowych, więc przeskakuję tutaj przez kilka obręczy. Pierwszy wiersz określa krótki alias, do
zipWith
którego potrzebujemy dwa razy. Zasadniczof
jest to funkcja, która pobiera listę waga
i tworzyf a
, funkcja, która przyjmuje listę pozycji i tworzy środek masy.f a
to kompozycja trzech funkcji:źródło
JavaScript (ES6), 60 bajtów
Akceptuje tablicę „x, y, masa” „trzykrotnie” i zwraca „krotkę”.
źródło
[x,y,m]
konieczne? iirc, nie są wymagane, jeśli do funkcji strzałki jest tylko jeden argument wejściowy.R,
3225 bajtówedytuj -7 bajtów przełączając na algebrę macierzy (dzięki @ Sp3000 odpowiedź Julii)
przekazać tablicę (macierz z 2 kolumnami, x, y) jako współrzędne i wektor
m
wag, zwraca tablicę z wymaganymi współrzędnymiźródło
PHP, 142 bajty
Widok rozstrzelony Wymagane dane wejściowe PowrótArray: [ xbar, ybar ]
Ta
p()
funkcja jest mapą podstawową, pomnożącą każdą[m]
wartość z odpowiednią[x]
lub[y]
wartością.c()
Funkcja przyjmuje wArray[Array]
, prezentujearray_sum
iarray_map
funkcje przestrzeni, a następnie obliczaΣmx/Σm
iΣmy/Σm
.Zobaczysz, że może być możliwe przekształcenie samego obliczenia w funkcję przestrzeni.
źródło
Mathcad, 8 „bajtów”
Nie wiem, o czym nie myślałem w mojej poprzedniej odpowiedzi. Oto krótszy sposób właściwego wykorzystania mnożenia macierzy. Zmienna p zawiera dane - jeśli ustawienie zmiennej liczy się do sumy, to dodaj kolejne 2 „bajty” (tworzenie tabeli wprowadzania = 1 bajt, nazwa zmiennej = 1 bajt).
źródło
Python 3, 63 bajty
Operacje wektorowe na listach są długie: /
Jest to anonimowa funkcja lambda - nadaj jej nazwę i wywołaj jak
f([[0,2],[3,4],[0,1],[1,1]],[2,6,2,10])
.źródło
Python 3,
959088 bajtówRozwiązanie
Wyniki
dzięki @Zgarb oszczędza 2 bajty
Rekurencyjne rozwiązanie dla zabawy (95 bajtów)
Wyniki
źródło
*([c]+[m])
można go skrócić*[c,m]
.Aksjomat, 158 bajtów
zagrać w golfa
wyniki
źródło
k, 13 bajtów
Wypróbuj online!
źródło