Wyzwanie
W tym zadaniu obliczyłeś, w jaki sposób możemy rozdzielić kule A do komórek B, przy czym każda komórka ma co najmniej jedną piłkę.
Wejścia A i B podane są w jednym wierszu oddzielonym spacją, wejścia są zakończone przez EOF.
Może chcesz sprawdzić swoje rozwiązania tutaj .
Wejście
0 0
1 0
12 4
6 3
18 17
20 19
15 13
18 9
20 20
17 14
9 2
14 13
18 11
Wynik
1
0
14676024
540
54420176498688000
23112569077678080000
28332944640000
38528927611574400
2432902008176640000
21785854970880000
510
566658892800
334942064711654400
Ograniczenia
- Każde A i B można rozróżnić.
- 0 <= A, B <= 20
- Możesz użyć dowolnego wybranego języka
- Najkrótsze rozwiązanie wygrywa!
code-golf
math
combinatorics
Donkiszotowski
źródło
źródło
S(n,0)
to1
, czyn=0
i0
inaczej). Jeśli chcesz, mogę znaleźć odniesienie do silniejszego stwierdzenia, że Stirling2 należy do asocjacyjnej podgrupy wykładniczej grupy Riordan.Odpowiedzi:
JavaScript (90
93)http://jsfiddle.net/RDGUn/2/
Oczywiście, każdy język oparty na matematyce, taki jak APL, pokona mnie z powodu gadatliwości składni i braku wbudowanych konstrukcji matematycznych :)
Edytuj Poza tym nie mam żadnych funkcji związanych z wprowadzaniem danych, z wyjątkiem parametrów przekazanych do funkcji, nie jestem pewien, jak korzystać ze standardowych danych wejściowych w JavaScript ...
Edycja: przejście
i--
dom=m*
wyrażenia; wprowadzićn*=-1
sięfor
; zacznijr=1
łączyć zadania i usuwać te obce po powrocie. (zapisz 3 znaki)źródło
readline
iprint
. Nie wiem, czego używają inni tutaj.prompt
ialert
są „standardowymi” kodami JavaScript, ponieważ są to typowe wywołania blokujące io, mimo że zwykle nie używasz blokowania io w JavaScript.Golfscript -
56 50 49 48 41 40 3837 znakówUwaga: obsługuje wiele linii danych wejściowych, jest szybki (1/8 sek., Aby wykonać przypadki testowe) i nie psuje się w przypadku legalnych danych wejściowych.
(Pierwsza wersja była również moim pierwszym programem do gry w golfa; dzięki eBiznesowi za wskazanie kilku sztuczek, które przegapiłem).
Aby uczynić go również użytecznym postem edukacyjnym, oto wyjaśnienie, jak to działa. Zaczynamy od nawrotu
f(n, k) = k * (f(n-1, k) + f(n-1, k-1))
. Można to zrozumieć kombinatorycznie, mówiąc, że aby umieścićn
wyróżniające się kule wk
wyróżniających się wiadrach, tak aby każde wiadro zawierało co najmniej jedną piłkę, wybierasz jedno zk
wiader dla pierwszej piłki (k *
), a następnie albo będzie ona zawierać co najmniej jeszcze jedną piłkę (f(n-1, k)
) albo nie będzie (f(n-1, k-1)
).Wynikające z tego wartości tworzą siatkę; przyjmując
n
jako indeks wiersza ik
jako indeks kolumny i indeksując oba od 0, zaczyna sięWracając do programu,
dzieli dane wejściowe na linie, a następnie dla każdej linii ocenia je, umieszczając
n
ik
na stosie, a następnie wywołuje<<STUFF>>
, co jest następujące:Oblicza to pierwsze
k+1
wpisy wn+1
th rzędzie tej siatki. Początkowo stos jestn k
.),
daje stosn [0 1 2 ... k]
{!}%
daje stosn [1 0 0 ... 0]
gdzie sąk
0.\{ <<MORE STUFF>> }*
przynosin
do góry i sprawia, że wiele razy wykonujemy<<MORE STUFF>>
.Nasz stos jest obecnie rzędem tabeli:
[f(i,0) f(i,1) ... f(i,k)]
0.@
stawia kilka zer przed tą tablicą. Pierwszy będzie,j
a drugi będzief(i,j-1)
.{ <<FINAL LOOP>> }/
zapętla się przez elementy tablicy; dla każdego z nich kładzie go na stosie, a następnie wykonuje ciało pętli..@+2$*@)@
to nudna manipulacja stosami, aby zabrać... j f(i,j-1) f(i,j)
i... j*(f(i,j-1)+f(i,j)) j+1 f(i,j)
;;]
wyskoczyć z resztekk+1 f(i,k)
i zbiera wszystko do tablicy, gotowe do następnego okrążenia.Wreszcie, gdy wygenerowaliśmy
n
th rząd tabeli,)p;
bierze ostatni element, drukuje go i odrzuca resztę wiersza.Dla potomnych trzy rozwiązania 38 znaków na tej zasadzie:
n%{~),{!}%\{0.@{.@+@.@*\)@}/;;]}*)p;}/
n%{~),{!}%\{0:x\{x\:x+1$*\)}/;]}*)p;}/
n%{~),{!}%\{0.@{@1$+2$*\@)}/;;]}*)p;}/
źródło
[0]
->1,
, przestrzeń po zipie można po prostu usunąć, a drugą przestrzeń można usunąć, jeśli po prostu przechowujesz w operatorze zamiast k. Nie przejrzałem jeszcze twojego kodu, ale podejrzewam, że możesz uciec po prostu używając wartości bez umieszczania jej w tablicy w niektórych miejscach.J, 40
Na przykład
<1sek dla wszystkich przypadków testowych.
Edycje
-/
zamiast na przemian(1 _1)*
(pomysł JB)1x+
źródło
1x+
to, ale to tylko odkupuje 1 postać, a ty wziąłeś 5!Common Lisp (83)
Wydaje się, że powinien istnieć krótszy sposób na przetestowanie bazowych przypadków, ale nic nie przychodzi mi do głowy od razu.
źródło
J, 38–42
W zależności od preferencji dotyczących interaktywnych języków i prezentacji wyników, wybierz spośród spektrum rozwiązań J:
4 :'|-/(!&y*^&x)i.1x+y'/&".;._2(1!:1)3
Uruchom jconsole, wprowadź go, a następnie wklej dane wejściowe (zakończ Cd). Zauważysz, że dane wyjściowe są rozdzielone spacjami (J jest językiem wektorowym, wykonuje obliczenia dla całego wejścia jako całości i zwraca je jako wektor 1D, którego domyślna prezentacja znajduje się w jednym wierszu). Uważam, że ok, duchem tego problemu jest obliczenie, a nie prezentacja. Ale jeśli nalegasz, aby zamiast tego mieć nowe linie:
4 :'|-/(!&y*^&x)i.1x+y'/&.".;._2(1!:1)3
Zastąpienie Compose (
&
) wartością Under (&.
) zwraca wektor ciągów znaków, których prezentacja kończy się na osobnych wierszach.4 :'echo|-/(!&y*^&x)i.1x+y'/&".;._2(1!:1)3
Uruchom z wiersza polecenia jako
$ jconsole balls.ijs < balls.in
Jeśli zagłosowałeś za tym, być może zechcesz również dać uznanie rozwiązaniu Eelvex .
źródło
&.
, aby działał poprawnie w trybie interaktywnym.4 :'|-/(!&y*^&x)i.1x+y'/&.".;._2(1!:1)3
. 39 znaków.GolfScript -
453836 znakówRelacja powtarzalności brudnej implementacji o średniej sile (
3836 znaków):Relacja powtarzalności, którą ukradłem z rozwiązania Petera Taylorsa, wygląda następująco:
f(x, y) = y * ( f(x-1, y) + f(x-1, y-1) )
W szczególnych przypadkach, jeśli jedna ze zmiennych ma wartość 0.
Moja implementacja nie wykorzystuje ponownie poprzednich wyników, więc każde wywołanie funkcji rozgałęzia się do dwóch nowych wywołań, chyba że jeden z zerowych przypadków został osiągnięty. Daje to najgorszy przypadek wywołania funkcji 2 ^ 21-1, co zajmuje 30 sekund na moim komputerze.
Rozwiązanie serii Light-force (45 znaków):
źródło
J, 55 znaków
wd
). Wejście na stdin, wyjście na stdout.Skrypt testowy Bash:
źródło
wd
?echo
, który jest zdefiniowany jako0 0&$@(1!:2&2)
. Nie jestem pewien, co to znaczy, ale robi to coś w stylu ładnego wydruku pozycji rangi 1 z podziałem linii. (Właśnie teraz zauważam, że używa 2 zamiast 4 ... Myślę, że nadal przechodzi to na standardowe wyjście przynajmniej w trybie konsoli.)<< was unexpected at this time.
że jestem nowy w J, zawsze używałem go w trybie konsoli.Golfscript - 26 znaków
Ostrzeżenie: obudowa 12 4 wymaga dużo pamięci (choć nie tyle, co odpowiedź poniżej) i jej uruchomienie zajmuje sporo czasu
Oczywiście ta odpowiedź ma pewne problemy, ale zostawię ją tutaj, ponieważ odnoszą się do niej komentarze, a odpowiedź mellamokb jest oparta na niej.
Golfscript - 24 znaki
Ostrzeżenie: obudowa 12 4 wymaga dużo pamięci i jej uruchomienie zajmuje sporo czasu
źródło
0 0
powinien produkować1
;0 k
bo każdy innyk
powinien produkować0
;n 1
dlan > 0
powinien produkować1
.Python 140 znaków
źródło
dc, 100 znaków
Niestety, dc nie wydaje się być obsługiwany przez ideone. Może być jeszcze jedna lub dwie postaci do wyciśnięcia, ale przed snem.
Uwaga: obsługuje wiele wierszy danych wejściowych, ma wystarczającą precyzję, aby dać poprawne wyjście nawet dla
20 19
(przekląć cię, Perlu, za czas, który zmarnowałem na debugowanie mojego rozwiązania!), I daje prawidłowe wyjście0 0
.Sugestie Nabb pozwalają na skrócenie przynajmniej o tyle
kosztem pozostawienia śmieci w stosach rejestru (a zatem zabraknie pamięci, jeśli obliczymy miliardy odpowiedzi).
źródło
l11
jest parsowany jakol1 1
(możesz użyćK
jako pojedynczy znak tokena,0
jeśli i tak nie zamierzasz zmieniać precyzji). Możesz zmienić pętlę wejściową na?[...?z1=4]
. Możesz wstawić makro w rejestrze1
. I prawdopodobnie możesz zaoszczędzić mnóstwo postaci w ogóle, ale poczekam, aż będzie krótszy, aby to zrozumieć.Golfscript (28
3137)~):$\.($\?:@;?,{@+}%{$base$,\-[0]=},,
Modyfikacja
gnibbler
rozwiązania GolfScript. Myślę, że jest to działające rozwiązanie - przetestowane z [3,2], [4,2], [6,3] i [9,2] z poprawnymi odpowiedziami. (Użyłem$
i@
dla zmiennych, aby zmniejszyć przestrzeń wokółbase
słowa kluczowego).Istnieją dwa problemy z
gnibbler
obecnym rozwiązaniem.Edytować
~:@\?:$,{$+}%{@base(;@,\-,0=},,
Jeszcze lepsze rozwiązanie! Nie trzeba zwiększać, po prostu dodaj do wszystkich liczb, aby zaczynały się od [1], a po dekonowaniu tej pierwszej cyfry nie zabraknie żadnych cyfr (w tym lewe dopełnianie zer). To rozwiązanie powinno działać i zostało przetestowane z tymi samymi wpisami powyżej. Jest także o wiele szybszy, ponieważ nie zwiększamy wartości przed wzięciem wykładnika do wygenerowania tablicy (ale nadal cierpi z powodu tego samego problemu z wydajnością / pamięcią dla większych danych wejściowych).
Edycja : Użyj
gnibbler
pomysłu przeniesienia dodatku$
wewnątrz filtra zamiast dodatkowego kroku. (zapisz 3 znaki).źródło
0 0
.n 1
włącza się dla dowolnego n, powoduje zawieszenie się. hmm ..05AB1E , 19 bajtów
UWAGA: Jest bardzo wolny i już upłynął limit czasu
12 4
. Działa jednak zgodnie z przeznaczeniem.Zobaczę, czy mogę wymyślić alternatywną metodę, która działa we wszystkich przypadkach testowych w rozsądnym czasie.Poniżej znajduje się znacznie szybsza wersja, która uruchamia wszystkie przypadki testowe w mniej niż sekundę.Wypróbuj online lub sprawdź kilka (mniejszych) przypadków testowych .
Wyjaśnienie:
05AB1E , 29 bajtów
Oto znacznie szybsza wersja, która działa na wszystkich testach w około 0,5 sekundy na TIO:
Port odpowiedzi JavaScript @mellamokb , więc upewnij się, aby go upvote!
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
UWAGA:
0 0
W tym przypadku działa na wielkość liter (w przeciwieństwie do odpowiedzi JavaScript, z której przeniosłem tę metodę), ponieważL
wbudowana funkcja utworzy listę[0,1]
.źródło