Minimalna iloczyn skalarny
Inspiracją do rozwiązania tego problemu z golfem jest konkurs Google jam jam . Założeniem problemu jest, biorąc pod uwagę wejście dwóch wektorów o różnej długości, znalezienie minimalnego możliwego skalara. Skalar można znaleźć za pomocą następującej formuły:
x1 * y1 + x2 * y2 + ... + xn * yn
Problem polega jednak na tym, że można znaleźć wiele wartości skalara w zależności od kolejności cyfr w przypadku wprowadzania (patrz poniżej). Twoim celem jest ustalenie minimalnego możliwego skalarnego rozwiązania liczb całkowitych poprzez podłączenie liczb przypadków wejściowych do równania i ich rozwiązanie. Możesz użyć każdej liczby na wejściu tylko raz i musisz użyć wszystkich liczb.
Pozwólcie, że podam przykład z następującymi wektorami.
Wejście
3
1 3 -5
-2 4 1
Wynik
-25
Pierwsza liczba całkowita w linii reprezentuje liczbę liczb, n, w każdym wektorze. W tym przypadku mamy trzy liczby w każdym wektorze.
Liczba n może się różnić w każdym przypadku testowym, ale zawsze będą dwa wektory.
W przykładowym danych wejściowych minimalny iloczyn skalarny wynosiłby -25.
(-5 * 4) + (1 * 1) + (3 * -2) = 25
Zasady
- Możesz użyć tylko jednej liczby całkowitej w obu wektorach.
- Musisz użyć wszystkich liczb całkowitych w wektorach.
- Twój wynik musi zawierać tylko produkt końcowy
- Wybiorę rozwiązanie z najmniejszą ilością kodu, zgodną ze wszystkimi powyższymi specyfikacjami, w dowolnym języku!
Wskazówka: nie musisz brutalnie wymuszać tego problemu, chyba że spowoduje to skrócenie kodu. W znalezieniu minimalnego skalara obejmującego jest określona metoda :).
źródło
Odpowiedzi:
Galaretka, 6 bajtów
Wypróbuj online!
Używanie brutalnej siły jest równie krótkie:
Jak to działa
źródło
Poważnie , 6 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
APL, 15 bajtów
Jest to funkcja dynamiczna, która akceptuje tablice po lewej i prawej stronie i zwraca liczbę całkowitą. Wykorzystuje to samo podejście, co moja odpowiedź Julii : iloczyn iloczynu posortowanych tablic, jednego malejącego i jednego rosnącego.
Wypróbuj tutaj
źródło
MATL , 6 bajtów
Kod:
Moja pierwsza odpowiedź MATL :)
Wyjaśnienie:
Wypróbuj online!
źródło
Mathematica,
3017 bajtów-13 bajtów przez murphy
Funkcja, dane wejściowe to wektor1 (lista), wektor2 (lista) Kilka wersji:
źródło
Sort@#.Reverse@Sort@#2&
Sort@#.Sort[#2,#>#2&]&
Sort@#.-Sort@-#2&
Sort@#.SortBy[#2,-#&]
Pyth -
148 bajtówMyślę, że wymyśliłem sztuczkę.
Wypróbuj online tutaj .
źródło
Julia,
3225 bajtówJest to anonimowa funkcja, która akceptuje dwie tablice i zwraca liczbę całkowitą. Aby go wywołać, przypisz go do zmiennej i zrób
f(x)(y)
.Do wejścia x i y , po prostu obliczać iloczyn skalarny x sortowane w kolejności odwrotnej do z y sortowane. Otrzymujemy x w odwrotnej kolejności, negując wszystkie wartości, sortując, a następnie ponownie negując.
Zaoszczędzono 7 bajtów dzięki Dennisowi!
źródło
JavaScript ES6, 69 bajtów
Wow, to za długo.
źródło
|i
zamiast&&i
Perl 6,
3330 bajtówźródło
{sum @^a.sort Z*[R,] @^b.sort}((1,3,-5),(-2,4,1)).say
CJam, 11 bajtów
Wypróbuj online!
źródło
Python, 139 bajtów
źródło
b = sorted(b)
zamienia sięb=sorted(b)
(2 bajty zapisane). Możesz dodatkowo umieścić wiele instrukcji w tym samym wierszu, oddzielając je średnikiem, na przykłada=list(reversed(sorted(a)));b=sorted(b);res=0
lambda a,b,s=sorted:sum(x*y for x,y in zip(s(a)[::-1],s(b)))
. Nie wymagamy nazywania funkcji przed nazwami (więc poprawna jest nienazwana lambda), an
parametr jest niepotrzebny (wiele innych funkcji całkowicie go pomija).C ++, 124 bajty
bez golfa:
Na początku używałem
std::greater<int>()
sortowania,b
ale po prostu odwrócenie kolejności w podsumowaniu jest łatwiejsze.źródło
Haskell, 59 bajtów
źródło
ZWROT , 29 bajtów
Try it here.
Wymień dowolny
␆␃␄␇
ich niedrukowalne odpowiedniki.Anonimowa lambda, która pozostawia wynik na stosie2. Stosowanie:
Wyjaśnienie
źródło
J, 14 bajtów
Stosuje tę samą zasadę, co pozostałe.
Wyjaśnienie
źródło