Czas na kolejne łatwe wyzwanie, w którym wszyscy mogą wziąć udział!
Twierdzenie o wielomianach stwierdza:
Wyrażenie w nawiasach to współczynnik wielomianowy, zdefiniowany jako:
Dopuszczenie, aby terminy k i obejmowały wszystkie partycje całkowite n, daje n -ty poziom m -simplex Pascala. Twoim zadaniem jest obliczenie tego współczynnika.
Zadanie
Napisz program lub funkcję, która pobierze m liczb, n , k 1 , k 2 , ..., k m-1 , i wyświetli lub zwróci odpowiedni współczynnik wielomianowy. Twój program może opcjonalnie wziąć m jako dodatkowy argument, jeśli zajdzie taka potrzeba. Zauważ, że k m nie znajduje się na wejściu.
Liczby te mogą być wprowadzane w dowolnym formacie, który nam się podoba, na przykład pogrupowane w listy lub zakodowane jako jednoargumentowe lub cokolwiek innego, o ile kod oblicza rzeczywiste obliczenie współczynnika wielomianowego, a nie proces kodowania.
Format wyjściowy jest podobnie elastyczny.
Cały kod powinien działać w ciągu mniej niż jednej minuty n i m do 1000.
Nie przejmuj się przepełnieniem liczb całkowitych.
Wbudowane funkcje obliczania współczynnika wielomianowego są niedozwolone.
Obowiązują standardowe luki.
Punktacja
To jest kod golfowy: wygrywa najkrótsze rozwiązanie w bajtach.
Przypadki testowe
Input: 3, [2, 0]
Output: 3
Input: 3, [1, 1]
Output: 6
Input: 11, [1, 4, 4]
Output: 34650
Input: 4, [1,2]
Output: 12
Input: 15, [5,4,3,2]
Output: 37837800
Input: 95, [65,4,4]
Output: 1934550571913396675776550070308250
Input: 32, [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
Output: 4015057936610313875842560000000
Input: 15, [3,3,3,3]
Output: 168168000
Input: 1000, [10,10,10,10,10,10,10,10,10,10,100,100,100,100,100,100,100,100]
Output: 1892260836114766064839886173072628322819837473493540916521650371620708316292211493005889278395285403318471457333959691477413845818795311980925098433545057962732816261282589926581281484274178579110373517415585990780259179555579119249444675675971136703240347768185200859583936041679096016595989605569764359198616300820217344233610087468418992008471158382363562679752612394898708988062100932765563185864346460326847538659268068471585720069159997090290904151003744735224635733011050421493330583941651019570222984959183118891461330718594645532241449810403071583062752945668937388999711726969103987467123014208575736645381474142475995771446030088717454857668814925642941036383273459178373839445456712918381796599882439216894107889251444932486362309407245949950539480089149687317762667940531452670088934094510294534762190299611806466111882595667632800995865129329156425174586491525505695534290243513946995156554997365435062121633281021210807821617604582625046557789259061566742237246102255343862644466345335421894369143319723958653232683916869615649006682399919540931573841920000000000000
Input: 33, [17]
Output: 1166803110
Input: 55, [28]
Output: 3824345300380220
źródło
1934550571913396675776550070308250
możemy wydać dane wyjściowe1.9345505719133966e+33
?[1000 {999 ones}]
, ponieważ wykładnik wykracza daleko poza to, co mogą reprezentować pływaki 64-bitowe. (Prawdopodobnie 128-bitowe zmiennoprzecinkowe wystarczą, ale zakładam, że chcesz użyć rodzimego typu kodu JavaScript?)Odpowiedzi:
Galaretka ,
76 bajtówSpójrz, nie ma Unicode! Ten program przyjmuje pojedynczą listę jako dane wejściowe, gdzie n ma swój pierwszy indeks.
Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe jednocześnie .
Jak to działa
źródło
CJam, 11 bajtów
Wprowadź jako pojedynczą listę z
n
pierwszym:To obsługuje dane wejściowe do 1000
n
im
prawie natychmiast.Sprawdź to tutaj.
Wyjaśnienie
źródło
MATL , 21
15bajtówPostawmy funkcję log-gamma do dobrego wykorzystania. Pozwala to uniknąć wewnętrznego przepełnienia poprzez pracę z logarytmami silni, a nie z samymi silnikami.
Działa to w bieżącej wersji (9.2.2) języka / kompilatora, która jest wcześniejsza niż to wyzwanie.
Wejściami są: najpierw liczba, a następnie wektor numeryczny. Wynik jest wytwarzany jako a
double
, co ogranicza maksymalną moc wyjściową do około2^52
.Przykład
Wyjaśnienie
źródło
PowerShell,
9174 bajtówZabiegać! Moja setna odpowiedź na PPCG!
Uff Na pewno nie wygrasz najkrótszego kodu. Wykorzystuje kilka schludnych sztuczek z zasięgami. I jest to prawdopodobnie kompletny bełkot dla każdego, kto nie zna PowerShell.
Wyjaśnienie
Najpierw bierzemy dane wejściowe
param($n,$k)
i oczekujemy,$k
że będziemy tablicą, np.\compute-the-multinomial-coefficient.ps1 11 @(1,4,4)
.Zaczniemy od licznika (wszystko po lewej stronie
/
). Jest to po prostu zakres od1..$n
tego, który został-join
edytowany razem,*
a następnie oceniany za pomocąiex
do obliczenia silni (tj1*2*3*...*$n
.).Następnie, pętla nad
$k|%{...}
i każda iteracja odejmujemy aktualną wartość$_
z$n
(które już nie obchodzi o) formułowanie$k_m
później. Dodatkowo generujemy zakres1..$k_i
każdej iteracji, który zostaje w potoku. Te obiekty potoku zostają połączone w tablicę z drugim wyrażeniem - zakresem1..$n
(który jest$k_m
w tym momencie). Wszystko to jest ostatecznie-join
edytowane razem*
i oceniane za pomocąiex
, podobnie jak licznik (działa tox! * y! = 1*2*3*...*x * 1*2*3*...*y
, ponieważ nie dbamy o indywidualne zamawianie).Wreszcie,
/
zdarza się, licznik jest dzielony przez mianownik i dane wyjściowe.Obsługuje dane wyjściowe poprawnie dla większych liczb, ponieważ nie przesyłamy jawnie żadnych zmiennych jako poszczególnych typów danych, więc PowerShell po cichu przerzuci w razie potrzeby różne typy danych w locie. W przypadku większych liczb dane wyjściowe za pomocą notacji naukowej mają najlepiej zachować znaczące liczby w miarę ponownego przesyłania typów danych. Na przykład
.\compute-the-multinomial-coefficient.ps1 55 @(28)
wyświetli3.82434530038022E+15
. Zakładam, że jest to OK, biorąc pod uwagę, że „Format wyjściowy jest podobnie elastyczny” jest określony w komentarzach i komentarzach kwintopii „Jeśli końcowy wynik może mieścić się w natywnie obsługiwanych typach liczb całkowitych, wynik musi być dokładny. Jeśli nie, nie ma ograniczeń co do wyniku. ”Alternatywnie
W zależności od decyzji o formatowaniu danych wyjściowych następujące po 92 bajtach
Który jest taki sam jak powyżej, po prostu używa jawnego formatowania wyjściowego za pomocą,
.ToString('G17')
aby osiągnąć pożądaną liczbę cyfr. Do55 @(28)
tego wyjdzie3824345300380220.5
Edycja1 - Zapisano 17 bajtów, pozbywając się
$d
i obliczając bezpośrednio, a pozbywając się obliczeń$k_m
, ciągnąc je podczas pętli$k
Edytuj2 - Dodano alternatywną wersję z jawnym formatowaniem
źródło
APL (Dyalog Extended) , 9 bajtów
Wypróbuj online!
Wykorzystując pomysł z mojej odpowiedzi APL na inne wyzwanie, które dotyczy wielomianów .
Milcząca funkcja, której lewy argument jest listą k, a prawy argument to n. Przypadki testowe sprawdzają, czy zgadzają się z rozwiązaniem Adama, z odrzuconymi lewymi i prawymi argumentami.
Jak to działa
źródło
Mathematica, 26 bajtów
Przykład:
źródło
Python 3,
9391Dzięki Dennis i FryAmTheEggman .
n
jako liczba całkowita,k
jak iterowalna.Nie golfowany:
źródło
95, [65, 4, 4]
. Zauważ, że dane wejściowe nie zawierają k_m . 2. Wydaje się, że wcale nie używaszfrom functools import*
.reduce
. 2.import math;f=math.factorial
zapisuje bajt. 3. Python 2 pozwoli Ci pozbyć się sekundę/
w//
.f
na własną rękę oszczędza kilka bajtów :f=lambda x:0**x or x*f(x-1)
.APL (Dyalog Unicode) , 16 bajtów SBCS
Całkowicie oparty na matematycznych umiejętnościach mojego kolegi Marshalla .
Anonimowa funkcja poprawki. Przyjmuje k jako prawy argument, a n jako lewy argument.
Wypróbuj online!
{
…}
Anonimowa lambda;⍺
jest lewym argumentem ( n ) i⍵
jest prawym argumentem ( k )0,⍵
dodaj zero do k¯1↓
upuść z tego ostatni element+\
łączna suma tego⍺-
odejmij to od n⍵!
( k ) to×/
produkt tegoźródło
PARI / GP, 43 bajty
Całkiem proste; oprócz formatowania wersja bez golfa może być identyczna.
źródło
Matlab 48 bajtów
Trzeba ustawić
format
, abylong
z wyprzedzeniem, aby uzyskać większą precyzję. Zatem jest to całkiem proste:źródło
Pyth, 10 bajtów
Wypróbuj online: demonstracja
Wyjaśnienie:
źródło
J, 16 bajtów
Stosowanie
W przypadku większych wartości sufiks
x
jest używany do oznaczania liczb całkowitych o rozszerzonej precyzji.Wyjaśnienie
źródło
05AB1E , 8 bajtów
Wypróbuj online! Wyjaśnienie:
Nie mogę znaleźć lepszych sposobów wykonania kroku 2 lub 4.
źródło
APL (Dyalog Unicode) , 17 bajtów
Wypróbuj online!
Infix milcząca funkcja (dzięki @ Adám za 2 bajty, które zapisuje.)
APL (Dyalog Unicode) , 19 bajtów
Wypróbuj online!
Infix Dfn.
Obie powyższe funkcje obliczają podaną formułę.
źródło
Haskell ,
5958 bajtówWypróbuj online!
Dzięki BMO za uratowanie 1 bajtu!
źródło
Clojure, 70 bajtów
Tworzy anonimową funkcję, biorąc wszystkie argumenty jako jedną listę, z
n
pierwszym.30 znaków jest „zmarnowanych”, co definiuje cholerną funkcję silni. No cóż.
źródło
Perl 6 ,
5250 bajtówSprawdź to
Przetestuj (wynik jest wymierny o mianowniku 1)
Rozszerzony:
źródło