Biorąc pod uwagę dwa wielomiany f,g
o dowolnym stopniu względem liczb całkowitych, twój program / funkcja powinna ocenić pierwszy wielomian w drugim wielomianu. f(g(x))
(aka skład (fog)(x)
dwóch wielomianów)
Detale
Wbudowane są dozwolone. Możesz założyć dowolne rozsądne formatowanie jako wejście / wyjście, ale format wejścia i wyjścia powinien być zgodny. Np. Formatowanie jako ciąg
x^2+3x+5
lub jako lista współczynników:
[1,3,5] or alternatively [5,3,1]
Ponadto można założyć, że wielomiany wejściowe są w pełni rozwinięte, a oczekuje się, że wyjściowe zostaną w pełni rozwinięte.
Przykłady
A(x) = x^2 + 3x + 5, B(y) = y+1
A(B(y)) = (y+1)^2 + 3(y+1) + 5 = y^2 + 5y + 9
A(x) = x^6 + x^2 + 1, B(y) = y^2 - y
A(B(y))= y^12 - 6y^11 + 15y^10 - 20y^9 + 15y^8 - 6y^7 + y^6 + y^4 - 2 y^3 + y^2 + 1
A(x) = 24x^3 - 144x^2 + 288x - 192, B(y) = y + 2
A(B(y)) = 24y^3
A(x) = 3x^4 - 36x^3 + 138x^2 - 180x + 27, B(y) = 2y + 3
A(B(y)) = 48y^4 - 96y^2
(.)
jest odpowiedzią w języku Haskell. Prawdopodobnie masz na myśli pewną reprezentację listy współczynników.Odpowiedzi:
Haskell,
8672 bajtówDefiniuje funkcję
o
, którao g f
oblicza kompozycję f ∘ g. Wielomiany są reprezentowane przez niepustą listę współczynników rozpoczynającą się od stałego terminu.Próbny
Jak to działa
Brak wbudowanych bibliotek lub bibliotek związanych z wielomianem. Obserwuj podobne nawroty
f (x) = a + f₁ (x) x ⇒ f (x) g (x) = ag (x) + f₁ (x) g (x) x,
f (x) = a + f₁ (x) x ⇒ f (g (x)) = a + f₁ (g (x)) g (x),
odpowiednio do mnożenia i składu wielomianu. Oboje przyjmują formę
f (x) = a + f₁ (x) x ⇒ W (f) (x) = C (a) (x) + U (W (f₁)) (x).
Operator
!
rozwiązuje powtarzalność tego formularza dla W przy U i C, używajączipWith(+).(++[0,0..])
do dodawania wielomianowego (zakładając, że drugi argument jest dłuższy - dla naszych celów zawsze będzie). Następnie,(0:)
mnoży argument wielomianowy przez x (przez przygotowanie współczynnika zerowego);(<$>g).(*)
mnoży argument skalarny przez wielomiang
;(0:)!((<$>g).(*))
mnoży argument wielomianu przez wielomiang
;pure
podnosi argument skalarny do stałego wielomianu (lista singletonów);(0:)!((<$>g).(*))!pure
tworzy argument wielomianowy z wielomianemg
.źródło
Mathematica, 17 bajtów
Przykładowe użycie:
źródło
TI-Basic 68k, 12 bajtów
Użycie jest proste, np. W pierwszym przykładzie:
Który zwraca
źródło
→
jest bycie 1 bajtem w TI-BASIC?Python 2, 138
156 162bajtówDane wejściowe powinny być najpierw listami liczb całkowitych o najmniejszych mocach.
Nie golfowany:
W tym obliczeniu współczynniki wielomianowe są postrzegane jako cyfry (które mogą być ujemne) liczby w bardzo dużej bazie. Po wielomianach w tym formacie mnożenie lub dodawanie jest operacją na liczbach całkowitych. Tak długo, jak podstawa jest wystarczająco duża, nie będzie żadnych elementów przenoszących się na sąsiednie cyfry.
-18 od ulepszenia związanego
B
zgodnie z sugestią @xnor.źródło
B
, to10**len(`a+b`)
wystarczy?Python + SymPy,
5935 bajtówDzięki @asmeurer za grę w golfa przy 24 bajtach!
Testowe uruchomienie
źródło
compose()
funkcję.from module import*;function
był ważnym wnioskiem. Niezależnie od tego jest to nowsza polityka, która umożliwia importowanie i funkcje pomocnicze z nienazwanymi lambdas.Szałwia, 24 bajty
Począwszy od Sage 6.9 (wersja działająca na http://sagecell.sagemath.org ), wywołania funkcji bez wyraźnego przypisania argumentów (
f(2) rather than f(x=2)
) powodują, że denerwujący i nieprzydatny komunikat jest drukowany na STDERR. Ponieważ STDERR może być domyślnie ignorowany w kodzie golfa, jest to nadal ważne.Jest to bardzo podobne do odpowiedzi Dennisa na SymPy, ponieważ Sage jest a) zbudowany na Pythonie, i b) używa Maximy , systemu algebry komputerowej bardzo podobnej do SymPy na wiele sposobów. Jednak Sage jest znacznie potężniejszy niż Python z SymPy, a zatem jest wystarczająco innym językiem, że zasługuje na swoją własną odpowiedź.
Sprawdź wszystkie przypadki testowe online
źródło
PARI / GP , 19 bajtów
co pozwala ci to zrobić
dostać
źródło
MATLAB z Symbolicznym zestawem narzędzi, 28 bajtów
To anonimowa funkcja. Aby go wywołać, przypisz go do zmiennej lub użyj
ans
. Dane wejściowe są łańcuchami o formacie (spacje są opcjonalne)Przykładowy przebieg:
źródło
Python 2,
239232223 bajty„Właściwa” implementacja, która nie nadużywa baz. Najpierw najmniej znaczący współczynnik.
a
jest dodatkiem wielomianowym,m
jest mnożeniem wielomianowym io
jest kompozycją.źródło
m([c],e(m,[[1]]+[g]*k))
nie to samo coe(m,[[c]]+[g]*k)
?a=lambda*l:map(lambda x,y:(x or 0)+(y or 0),*l)
( or 0)
w tej wersji.JavaScript (ES6),
150103 bajtówAkceptuje i zwraca wielomiany jako tablicę a = [a 0 , a 1 , a 2 , ...], która reprezentuje 0 + a 1 * x + a 2 * x 2 ...
Edycja: Zaoszczędziłem 47 bajtów, zmieniając wielomian rekurencyjny na iteracyjny, co pozwoliło mi na scalenie dwóch
map
wywołań.Objaśnienie: r jest wynikiem, który zaczyna się od zera, reprezentowanym przez pustą tablicę, a p oznacza g h , która zaczyna się od jednego. p mnoży się kolejno przez każdą f h , a wynik kumuluje się w r . p jest także mnożone przez g jednocześnie.
źródło
Pyth,
5134 bajtówZestaw testowy .
źródło
Rubinowy 2.4 + wielomian , 41 + 12 = 53 bajty
Używa flagi
-rpolynomial
. Dane wejściowe to dwaPolynomial
obiekty.Jeśli ktoś obezwładni mnie w waniliowym Ruby (bez wielomianowej biblioteki zewnętrznej), będę pod wielkim wrażeniem.
źródło