Kontynuacja tego wyzwania
Biorąc pod uwagę zestaw mieszanych kości, generuj rozkład częstotliwości rzucania nimi wszystkimi i sumowania liczb rzucanych na każdej kości.
Rozważmy na przykład 1d12 + 1d8
(rzucenie 1 matrycą 12-stronną i 1 matrycą 8-stronną). Maksymalne i minimalne rolki są 20
i 2
, odpowiednio, który jest podobny do walcowania 2d10
(2 10 kostkami). Jednak 1d12 + 1d8
powoduje bardziej płaski rozkład niż 2d10
: [1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 7, 6, 5, 4, 3, 2, 1]
versus [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
.
Zasady
- Częstotliwości muszą być wymienione w kolejności rosnącej od sumy, której częstotliwość odpowiada.
- Oznaczanie częstotliwości odpowiednimi sumami jest dozwolone, ale nie wymagane (ponieważ sumy można wywnioskować z wymaganej kolejności).
- Nie musisz obsługiwać danych wejściowych, w których dane wyjściowe przekraczają reprezentatywny zakres liczb całkowitych dla Twojego języka.
- Zera wiodące lub końcowe są niedozwolone. Na wyjściu powinny pojawić się tylko dodatnie częstotliwości.
- Możesz wziąć dane wejściowe w dowolnym rozsądnym formacie (lista kości (
[6, 8, 8]
), lista par kości ([[1, 6], [2, 8]]
) itp.). - Częstotliwości muszą zostać znormalizowane, aby GCD częstotliwości wynosił 1 (np.
[1, 2, 3, 2, 1]
Zamiast[2, 4, 6, 4, 2]
). - Wszystkie kości będą miały co najmniej jedną twarz (więc
d1
jest to minimum). - To jest golf golfowy , więc wygrywa najkrótszy kod (w bajtach). Standardowe luki są zabronione, jak zwykle.
Przypadki testowe
Te przypadki testowe są podane jako input: output
, gdzie dane wejściowe są podane jako lista par [a, b]
reprezentujących a
b
kostki jednostronne (tak [3, 8]
odnosi się 3d8
i [[1, 12], [1, 8]]
odnosi się do 1d12 + 1d8
).
[[2, 10]]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
[[1, 1], [1, 9]]: [1, 1, 1, 1, 1, 1, 1, 1, 1]
[[1, 12], [1, 8]]: [1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 7, 6, 5, 4, 3, 2, 1]
[[2, 4], [3, 6]]: [1, 5, 15, 35, 68, 116, 177, 245, 311, 363, 392, 392, 363, 311, 245, 177, 116, 68, 35, 15, 5, 1]
[[1, 3], [2, 13]]: [1, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 37, 36, 33, 30, 27, 24, 21, 18, 15, 12, 9, 6, 3, 1]
[[1, 4], [2, 8], [2, 20]]: [1, 5, 15, 35, 69, 121, 195, 295, 423, 579, 761, 965, 1187, 1423, 1669, 1921, 2176, 2432, 2688, 2944, 3198, 3446, 3682, 3898, 4086, 4238, 4346, 4402, 4402, 4346, 4238, 4086, 3898, 3682, 3446, 3198, 2944, 2688, 2432, 2176, 1921, 1669, 1423, 1187, 965, 761, 579, 423, 295, 195, 121, 69, 35, 15, 5, 1]
[[1, 10], [1, 12], [1, 20], [1, 50]]: [1, 4, 10, 20, 35, 56, 84, 120, 165, 220, 285, 360, 444, 536, 635, 740, 850, 964, 1081, 1200, 1319, 1436, 1550, 1660, 1765, 1864, 1956, 2040, 2115, 2180, 2235, 2280, 2316, 2344, 2365, 2380, 2390, 2396, 2399, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2399, 2396, 2390, 2380, 2365, 2344, 2316, 2280, 2235, 2180, 2115, 2040, 1956, 1864, 1765, 1660, 1550, 1436, 1319, 1200, 1081, 964, 850, 740, 635, 536, 444, 360, 285, 220, 165, 120, 84, 56, 35, 20, 10, 4, 1]
Odpowiedzi:
Galaretka ,
147 bajtów-3 bajty dzięki Panu Xcoderowi (użycie domyślnego zakresu, aby uniknąć wiodącego
R
; zastąpienie zmniejszonego przez diadetyczny produkt kartezjański i spłaszczeniep/F€
, z wbudowanym w tym celu produktem kartezjańskimŒp
).Monadyczny link pobierający listę kości do gry i zwracający znormalizowany rozkład rosnących sum.
Wypróbuj online!
W jaki sposób?
Przechodzi przez listę „rozmiarów” kości (domyślnie) umieszcza je na swojej liście twarzy, następnie pobiera iloczyn kartezjański tych list (wszystkie możliwe rzuty zestawu kości), następnie podsumowuje te rzuty, uzyskuje grupy równych indeksy (według wartości rosnącej) i przyjmuje długość każdej grupy.
Uwaga: istnieje tylko jeden sposób, aby rzucić minimum (rzucając jeden na każdą kostkę) i nie liczymy żadnych rzutów, więc nie ma potrzeby wykonywania normalizacji GCD.
źródło
÷g/$
(choć nie zawsze jest tylko jeden sposób na uzyskanie wartości minimalnej lub maksymalnej?)ŒpS€µLƙ
MATL , 8 bajtów
Dane wejściowe to tablica (ewentualnie powtarzanych) rozmiarów matryc.
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
źródło
Łuska , 7 bajtów
Dane wejściowe to lista kości. Wypróbuj online!
Wyjaśnienie
źródło
Haskell , 54 bajty
Wypróbuj online!
Haskell , 63 bajty
Wypróbuj online!
Haskell , 68 bajtów
Wypróbuj online!
źródło
Oktawa ,
88 69 5856 bajtówJak wspomniano w odpowiedzi Haskella, wykorzystuje to fakt, że rozkład np. Kostek 3-stronnych i 5-stronnych jest dyskretnym splotem dwóch wektorów
[1,1,1]
i[1,1,1,1,1]
. Dzięki @LuisMendo za -11 bajtów za sprytne granie w golfa!Wypróbuj online!
To przesłanie wykorzystuje podejście rekurencyjne. Ale jeśli użyjesz pętli, będzie ona nieco dłuższa:
źródło
Haskell ,
80 7864 bajtówTo rozwiązanie okazało się prawie takie samo jak rozwiązanie @ Sherlock9 w poprzednim wyzwaniu, z być może bardziej naturalnym podejściem. @xnor ma jeszcze krótsze rozwiązanie Haskell !
Wyjaśnienie:
Wypróbuj online!
Poprzednie rozwiązanie:
Wykorzystuje to funkcję dyskretnego splotu @AndersKaseorg . Obserwacja tutaj jest taka, że rozkład np. Kostek 3-stronnych i 5-stronnych jest dyskretnym splotem dwóch wektorów
[1,1,1]
i[1,1,1,1,1]
.Wypróbuj online!
źródło
Wolfram Language (Mathematica) , 26 bajtów
Wypróbuj online!
Modyfikacja mojej odpowiedzi na poprzednie wyzwanie . To po prostu generuje wszystkie możliwe wyniki, sumuje je i ocenia wyniki.
Dla zabawy możemy to napisać jako
Tally@*Total@*Thread@*Tuples@*Range
, ale to dłużej.Wolfram Language (Mathematica) , 41 bajtów
Wypróbuj online!
Jest to podejście oparte na splotach (tutaj bierzemy splot poprzez iloczyn funkcji generujących -
1+x+x^2+...+x^(N-1)
jest to funkcja generująca dla zwijania dN - a następnie przyjmujemy listę współczynników). Uwzględniam to, ponieważ pierwsze rozwiązanie nie jest praktyczne w przypadku dużych nakładów.źródło
Mathematica, 44 bajty
Wysyła częstotliwości oznaczone odpowiednimi sumami
Wypróbuj online!
-5 bajtów od Martina Endera
dziękuję Miszy Ławrow za poinformowanie mnie, że „oznaczone” jest ważne
źródło
Pyth , 12 bajtów
Wypróbuj tutaj!
W jaki sposób?
źródło
Galaretka , 14 bajtów
Wypróbuj online!
Dane wejściowe to lista wartości matryc. Mógłbym zagrać w golfa, wykradając się
ĠL€
z drugiej odpowiedzi Jelly, ale potem mogłem też zagrać w golfa w pierwszej połowie i skończyć z tym samym, więc zostawię to tak, jak jestźródło
Python 2 ,
120119 bajtówWypróbuj online!
Dziękujemy za Mego / Jonathon Allan za 1 bajt.
źródło
05AB1E , 11 bajtów
Wypróbuj online!
Jak to działa
Zaoszczędzono 1 bajt dzięki Emignie !
źródło
O
zamiast€˜
R , 51 bajtów
Wypróbuj online!
Pobiera listę kości i zwraca nazwany wektor częstotliwości; nazwy (wartości sum kości) są drukowane powyżej częstotliwości.
R , 59 bajtów
Wypróbuj online!
Reduce
Podejście zamiast iteracyjny jeden powyżej.R , 62 bajty
Wypróbuj online!
Podejście splotowe. Daje kilka ostrzeżeń, że używa tylko pierwszego elementu
D
wyrażenia,1:D
ale nie wpływa na wynik. Gdybyśmy nie musieli wziąć całejRe
części rozwiązania, byłoby to 58 bajtów.źródło
APL (Dyalog Classic) ,
1210 bajtów-2 dzięki @ Adám
Wypróbuj online!
wejście
⎕
to lista N kości⍳⍵
to N-wymiarowa tablica zagnieżdżonych wektorów - wszystkie możliwe rzuty+/↑,
spłaszcza tablice i sumuje rzuty⊢∘≢⌸
liczy, ile z każdej unikalnej sumy, wymienionych w kolejności pierwszego pojawienia się, co na szczęście pokrywa się z ich rosnącą kolejnościąźródło
⊢∘≢⌸+/↑,⍳⎕
Rubinowy , 72 bajty
Wypróbuj online!
Pobiera na wejściu listę kości. Bez wątpienia można go zagrać w golfa, ale nie jest tak źle.
źródło
Pari / GP , 37 bajtów
Wypróbuj online!
źródło
Czysty ,
15414213610710085 + 13 = 98 bajtówDane wejściowe to lista kości.
Odpowiedź ma postać lambda.
+13 bajtów, z
import StdEnv
których importuje moduł potrzebny do tego, aby działał.Wypróbuj online!
źródło
JavaScript (ES6), 83 bajty
Pobiera dane wejściowe każdej kości jako osobny parametr.
źródło
JavaScript (ES6),
7674 bajtówPobiera dane wejściowe jako listę kości.
Przypadki testowe
Przetwarzanie dwóch ostatnich przypadków testowych wymagałoby włączenia TCO lub zwiększenia domyślnego limitu wielkości stosu silnika JS.
Pokaż fragment kodu
Sformatowane i skomentowane
Uwaga: To jest skomentowana wersja mojego pierwszego przesłania, która używała metody redukcyjnej (). Jest o 2 bajty dłuższy, ale łatwiejszy do odczytania.
źródło
Clojure, 96 bajtów
Pierwsze wejście to lista liczby kości, a drugie wejście to lista stron na każdej kości.
źródło
Perl 5 , 94 bajtów
Wypróbuj online!
Format wejściowy to lista kości oddzielonych znakami nowej linii. Zatem 1d10 + 2d8 wprowadziłby jako:
źródło
SageMath, 46 bajtów
Wypróbuj online
Jest to dostosowanie mojego rozwiązania do drugiego wyzwania . Pobiera dowolną liczbę kostek jako parametry (np.
f(4,4,6,6,6)
Dla2d4+3d6
) i zwraca listę.Python 2 + NumPy , 62 bajty
Wypróbuj online!
Tak jak poprzednio, dołączyłem to rozwiązanie do powyższego, ponieważ są one zasadniczo równoważne. Zauważ, że ta funkcja zwraca tablicę NumPy, a nie listę Pythona, więc dane wyjściowe wyglądają nieco inaczej
print
.numpy.ones(x)
jest „poprawnym” sposobem na stworzenie tablicy do użycia z NumPy, a zatem może być używana zamiast[x*[1]]
, ale niestety jest znacznie dłuższa.źródło