Wprowadzenie
Biorąc pod uwagę tę wizualizację pola gry:
(0,0)
+----------------------+(map_width, 0)
| A |
|-----+-----------+----|
| D | W | B |
|-----+-----------+----|
| C |
+----------------------+(map_width, map_height)
(0, map_height)
Cała mapa, na której gra się, to prostokąt z współrzędnymi narożnymi (0,0) i (szerokość_kresu, wysokość_kresu). Punkty kwalifikujące się do odradzania wrogów to Unia
Wyzwanie
Napisz kod, który zwraca losowy punkt (x, y), który z pewnością znajduje się w środku S. Twój kod nie może wprowadzić żadnych dodatkowych odchyleń, co oznacza, że prawdopodobieństwo każdej współrzędnej rozkłada się równomiernie, przy założeniu, że twój wybór generowania losowości (np. Funkcja | biblioteka | dev / urandom) jest bezstronna.
Najkrótsze rozwiązania w bajtach wygrywają!
Wejście
Będziesz mieć łącznie 6 pozytywnych zmiennych wejściowych całkowitą w kolejności:
map_width, map_height, W_top_left_x, W_top_left_y, W_width, W_height
. Możesz założyć, że (obliczona) powierzchnia wszystkich regionów (A, B, C, D, W) wynosi> 10, więc nie ma pustych przestrzeni / regionów.
Przykładowe dane wejściowe: 1000, 1000, 100, 100, 600, 400
Dane wejściowe muszą zawierać 6 wartości opisanych powyżej, ale można je przekazać jako mniejszą liczbę argumentów w dowolnej kolejności. Na przykład przekazywanie (map_width, map_height)
jako krotka python jest dozwolone. Oczywiście nie jest dozwolone obliczanie parametrów takich jak dolny prawy punkt W.
Wynik
2 losowo generowane liczby całkowite (x, y) gdzie
LUB
co oznacza, że co najmniej jedno z powyższych wyrażeń logicznych musi być prawdziwe.
Przykłady
Input Output(valid random samples)
1000 1000 100 100 600 400 10 10
1000 1000 100 100 600 400 800 550
1000 1000 100 100 600 400 800 10
1000 1000 100 100 600 400 10 550
Szczegółowe informacje i ograniczenia dotyczące wejścia / wyjścia znajdują się w domyślnych zasadach wejścia / wyjścia
2 randomly generated integers (x, y)
Odpowiedzi:
Python 2 ,
114106102101 bajtówWypróbuj online!
źródło
[i%w, i/w]
ponieważ zakres,w*h/w=h
ale x jest związany w tym przykładzie z szerokością, a nie z wysokością.a/b
jest już podział na piętra, jeślia
ib
są liczbami całkowitymi (które są tutaj).R ,
8973 bajtówWypróbuj online!
Pobiera dane wejściowe jako
width,height,c(X,Y),c(W,H)
.źródło
05AB1E ,
2321201817 bajtówDane wejściowe są w formacie
[map_width, map_height], [W_top_left_x, W_top_left_y], [W_width, W_height]
.Dzięki @Grimy za -1 bajt, a także za uświadomienie mi, że wprowadziłem błąd po mojej ostatniej edycji.
Wypróbuj online , wypisz 10 możliwych wyników jednocześnie lub sprawdź wszystkie możliwe współrzędne . (Drobna uwaga: Zmniejszyłem przykładowe dane wejściowe o współczynnik 10, ponieważ wbudowane filtry i losowy wybór są dość wolne dla dużych list).
Wyjaśnienie:
Dane wejściowe
map_width, map_height, [W_top_left_x, W_top_left_y], [W_width, W_height]
są określone[Wm, Hm], [x, y], [w, h]
poniżej:źródło
[map_height, 0]
jak to możliwe, losowy wynik bez¨
. :)*ݨ¹‰
może byćL`â<
przyjmowanie pierwszych dwóch danych wejściowych jako[map_height, map_width]
. Mogę teżII
byćŠ
, chyba że coś przeoczyłem.L`â<
. Co doII+
celuŠ+
, jesteś rzeczywiście prawda, że byłoby to samo .. Niestety ja sam popełnił błąd i powinno być²³+
zamiastII+
, ponieważ byłoby użyć trzeciego wejścia dla obuI
(podobnie jak zajęłoby dwa razy więcej trzecie wejście zŠ
) po pierwszej iteracji filtra .. Więc domyślnie dziękuję za uświadomienie mi, że mam błąd. :)C # (interaktywny kompilator Visual C #) , 110 bajtów
Wypróbuj online!
źródło
PowerShell ,
8573 bajtów-12 bajtów dzięki mazzy
Wypróbuj online!
Ładna prosta odpowiedź, która łączy tablicę z zakresu wartości dla każdego wymiaru, a następnie wybiera jedną losowo dla
x
iy
. Prowadzi do ponownego wykorzystania najbardziej kodu z pierwszej obróbkix
, a następnie zastąpieniem$x
w$y
i uruchamiając ponownie.źródło
Julia ,
767167 bajtówWypróbuj online!
źródło
Galaretka , 11 bajtów
Wypróbuj online!
Dyadyczny link, który wymaga dwóch argumentów,
[map_width, map_height], [W_width, W_height]
aW_left, W_top
i zwraca losowo wybrany punkt spełniająca wymagania.Wyjaśnienie
źródło
Python 2 , 100 bajtów
Dane wejściowe powinny mieć postać
((map_width, W_top_left_x, W_width),(map_height, W_top_left_y, W_height))
Dane wyjściowe są podane w postaci:
[[x],[y]]
Wypróbuj online!
Losowe dane wyjściowe uzyskane z przykładowego wejścia:
źródło
Java (OpenJDK 8) , 100 bajtów
Wypróbuj online!
Wykorzystuje
java.awt.Rectangle
jako posiadacz niektórych parametrów. Oczywiście używająint
pól, a niefloat
lubdouble
.źródło
Rectangle#contains
wbudowanemu! : DWolfram Language (Mathematica) ,
846860 bajtówWypróbuj online!
Weź dane jako
{map_width, map_height}, {W_width, W_height}, {W_top_left_x, W_top_left_y}
.źródło
Węgiel ,
5543 bajtówWypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Podaj rozmiar mapy. (Gdyby były ostatnie, mógłbym wprowadzić wysokość w linii, aby zaoszczędzić 1 bajt.)
Wprowadź wewnętrzny prostokąt. (Gdybym mógł wprowadzić kolejność
left, width, top, height
, mógłbym użyćF²⊞υE²N
do zapisania 3 bajtów).Wygeneruj listę wszystkich współrzędnych w terenie.
Filtruj wpisy, w których obie współrzędne leżą wewnątrz prostokąta.
Wydrukuj losowy element pozostałych.
źródło
Perl 5
-ap
, 84 bajtówWypróbuj online!
źródło
Scala , 172 bajty
Losowość? Gotcha
Zabawna implementacja, o której mogłem pomyśleć.
Jak to działa : Wygeneruj losową parę na mapie. Jeśli jest w wewnętrznym prostokącie, spróbuj ponownie.
Wypróbuj online!
źródło
J ,
54474539 bajtówWypróbuj online!
Weź dane jako siatkę 3 x 2, np .:
0?@{[
(-1&{)~
(<*/@,0<:[)
podobnie przesuniętym wewnętrznym prostokącie2{[
. W przeciwnym razie zwróć oryginalny, nieprzesunięty losowy punkt.{~&1
Inne podejście, 45 bajtów
Wypróbuj online!
Ten jest koncepcyjnie prostszy i nie przeszkadza w zapętlaniu. Zamiast tego tworzymy macierz wszystkich liczb od 0 do (wxh), przesuwamy ją o wewnętrzny punkt początkowy, chwytamy tylko punkty w podsieci (0, 0) do (wewnętrzna w, wewnętrzna h), usuwamy je z całości siatki po spłaszczeniu obu, wybierz jedną losowo z reszty i przekonwertuj liczbę całkowitą z powrotem na punkt za pomocą divmod
<.@% , |~
źródło