Przegląd
W tym wyzwaniu Twoim zadaniem jest losowe wygenerowanie monotonicznej funkcji matematycznej między dwoma zestawami.
Wejście
Twoje dane wejściowe to dwie dodatnie liczby całkowite s
i n
.
Po uzyskaniu tych danych wejściowych program wygeneruje losową funkcję matematyczną f
z zestawu do . Innymi słowy, jest to „zasada”, który odbywa się w -tuple liczb całkowitych między a i zwraca jeden taki całkowitych. Ponadto powinien być monotoniczny w następującym znaczeniu. Jeśli i są dwie pary, takie, które obowiązują dla każdej współrzędnej , to .{0,1,...,s-1}n
{0,1,...,s-1}
f
n
0
s-1
f
A
B
n
A[i] ≥ B[i]
i
f(A) ≥ f(B)
Dokładny rozkład funkcji monotonicznych f
nie ma znaczenia, o ile każda taka funkcja ma dodatnie prawdopodobieństwo wygenerowania (przy założeniu idealnego RNG).
Wynik
Twój wynik powinien być wyliczeniem danych wejściowych i wyjściowych f
. Powinien zawierać wszystkie n
liczby całkowite między 0
iw s-1
jakiejś kolejności, po których każdemu następują odpowiednie dane wyjściowe z f
. Dokładny format wyjściowy jest elastyczny (w granicach rozsądku).
Przykłady
Dane wejściowe s = 3
i n = 2
mogą generować dane wyjściowe
(0, 0) 0
(0, 1) 1
(0, 2) 2
(1, 0) 0
(1, 1) 1
(1, 2) 2
(2, 0) 1
(2, 1) 1
(2, 2) 2
Zawiera wszystkie pary w zestawie {0, 1, 2}
dokładnie raz, a po każdej z nich znajduje się jej f
-value. Warunek monotoniczności jest również spełniony. Krotki podano tutaj w kolejności leksykograficznej, ale nie jest to konieczne.
Jako kolejny przykład s = 2
i n = 4
może produkować
(0, 0, 0, 0) 0
(0, 0, 0, 1) 0
(0, 0, 1, 0) 0
(0, 0, 1, 1) 0
(0, 1, 0, 0) 1
(0, 1, 0, 1) 1
(0, 1, 1, 0) 1
(0, 1, 1, 1) 1
(1, 0, 0, 0) 0
(1, 0, 0, 1) 1
(1, 0, 1, 0) 0
(1, 0, 1, 1) 1
(1, 1, 0, 0) 1
(1, 1, 0, 1) 1
(1, 1, 1, 0) 1
(1, 1, 1, 1) 1
Poniżej przedstawiono wszystkie możliwe dane wyjściowe dla s = 2
i n = 2
(aż do zmiany kolejności krotek); twój program powinien losowo wypisać jeden z nich:
(0,0) 0
(0,1) 0
(1,0) 0
(1,1) 0
-------
(0,0) 0
(0,1) 0
(1,0) 0
(1,1) 1
-------
(0,0) 0
(0,1) 0
(1,0) 1
(1,1) 1
-------
(0,0) 0
(0,1) 1
(1,0) 0
(1,1) 1
-------
(0,0) 0
(0,1) 1
(1,0) 1
(1,1) 1
-------
(0,0) 1
(0,1) 1
(1,0) 1
(1,1) 1
Zasady i punktacja
Możesz napisać pełny program lub funkcję. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone. Preferowany jest kod z wyjaśnieniem.
Nie ma ograniczeń dotyczących złożoności czasu, ale dam premię w wysokości -15%, jeśli Twoje rozwiązanie zawsze gwarantuje ukończenie w określonym czasie (w zależności od nakładów i przy założeniu idealnego RNG działającego w stałym czasie) .