Introducción
Dada esta visualización de un campo de juego:
(0,0)
+----------------------+(map_width, 0)
| A |
|-----+-----------+----|
| D | W | B |
|-----+-----------+----|
| C |
+----------------------+(map_width, map_height)
(0, map_height)
El mapa completo en el que se juega es el rectángulo con las coordenadas de las esquinas (0,0) y (map_width, map_height). Los puntos elegibles para generar enemigos es la Unión
El reto
Escriba el código que devuelve un punto aleatorio (x, y) que se garantiza que está dentro de S. Su código no puede introducir ningún sesgo adicional, lo que significa que la probabilidad de cada coordenada se distribuye uniformemente dado el supuesto de que su elección de generar aleatoriedad (por ejemplo, función | biblioteca | dev / urandom) es imparcial.
¡Las soluciones más cortas en bytes ganan!
Entrada
Se le dará un total de 6 variables de entrada de enteros positivos en orden:
map_width, map_height, W_top_left_x, W_top_left_y, W_width, W_height
. Puede suponer que el área de superficie (calculada) de todas las regiones (A, B, C, D, W) es cada una> 10, por lo que no hay espacios / regiones vacíos.
Entrada de ejemplo: 1000, 1000, 100, 100, 600, 400
La entrada tiene que contener los 6 valores descritos anteriormente, pero se puede pasar como un menor número de argumentos y en cualquier orden. Por ejemplo, pasar (map_width, map_height)
como python tuple está permitido. Lo que no está permitido, por supuesto, son parámetros calculados como el punto inferior derecho de la W.
Salida
2 enteros generados aleatoriamente (x, y) donde
O
lo que significa que al menos una de las expresiones lógicas anteriores tiene que ser verdadera.
Ejemplos
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
Para obtener detalles y limitaciones para la entrada / salida, consulte las reglas predeterminadas de entrada / salida
2 randomly generated integers (x, y)
Respuestas:
Python 2 ,
114106102101 bytesPruébalo en línea!
fuente
[i%w, i/w]
porque el rangow*h/w=h
pero x está vinculado al ancho en este ejemplo, no a la altura.a/b
ya es división de piso, sia
yb
son enteros (que están aquí).R ,
8973 bytesPruébalo en línea!
Toma entrada como
width,height,c(X,Y),c(W,H)
.Muestras de[ 0 , w ] × [ 0 , h ] uniformemente hasta que encuentre un punto fuera del rectángulo interno.
fuente
05AB1E ,
2321201817 bytesLa entrada está en el formato
[map_width, map_height], [W_top_left_x, W_top_left_y], [W_width, W_height]
.Gracias a @Grimy por -1 byte, y también por darme cuenta de que introduje un error después de mi última edición.
Pruébelo en línea , envíe 10 salidas posibles al mismo tiempo o verifique todas las coordenadas posibles . (Nota menor: he disminuido la entrada de ejemplo en un factor 10, porque el filtro y la selección aleatoria incorporada son bastante lentos para las listas grandes).
Explicación:
Las entradas
map_width, map_height, [W_top_left_x, W_top_left_y], [W_width, W_height]
se denominan a[Wm, Hm], [x, y], [w, h]
continuación:fuente
[map_height, 0]
como salida aleatoria posible sin el¨
. :)*ݨ¹‰
podría serL`â<
tomando las dos primeras entradas como[map_height, map_width]
. TambiénII
podría serŠ
, a menos que me haya perdido algo.L`â<
. En cuanto alII+
toŠ+
, tienes razón en que sería lo mismo ... Desafortunadamente, cometí un error y debería haber sido en²³+
lugar deII+
, ya que usaría la tercera entrada para ambosI
(al igual que tomaría dos veces el tercera entrada conŠ
) después de la primera iteración del filtro. Así que, implícitamente, gracias por hacerme darme cuenta de que tenía un error. :)C # (compilador interactivo de Visual C #) , 110 bytes
Pruébalo en línea!
fuente
PowerShell ,
8573 bytes-12 bytes gracias a mazzy
Pruébalo en línea!
Buena respuesta simple que improvisa una matriz hecha del rango de valores para cada dimensión y luego elige uno al azar para
x
yy
. Se las arregla para reutilizar la mayor parte del código por primera transformaciónx
, a continuación, sobrescribir$x
con$y
y funcionando de nuevo.fuente
Julia ,
767167 bytesPruébalo en línea!
fuente
Jalea , 11 bytes
Pruébalo en línea!
Un enlace diádico que toma dos argumentos,
[map_width, map_height], [W_width, W_height]
yW_left, W_top
y devuelve un punto seleccionado al azar el cumplimiento de los requisitos.Explicación
fuente
Python 2 , 100 bytes
La entrada debe estar en forma de
((map_width, W_top_left_x, W_width),(map_height, W_top_left_y, W_height))
La salida se da en la forma:
[[x],[y]]
Pruébalo en línea!
Salidas aleatorias obtenidas de la entrada de ejemplo:
fuente
Java (OpenJDK 8) , 100 bytes
Pruébalo en línea!
Usos
java.awt.Rectangle
como titular de algunos de los parámetros. Naturalmente, esos usanint
campos, y nofloat
odouble
.fuente
Rectangle#contains
incorporado! : DWolfram Language (Mathematica) ,
846860 bytesPruébalo en línea!
Tomar entradas como
{map_width, map_height}, {W_width, W_height}, {W_top_left_x, W_top_left_y}
.fuente
Carbón ,
5543 bytesPruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Ingrese el tamaño del mapa. (Si fueran los últimos, podría ingresar la altura en línea para un ahorro de 1 byte).
Ingrese el rectángulo interno. (Si pudiera ingresar en el orden
left, width, top, height
, podría usarloF²⊞υE²N
para un ahorro de 3 bytes).Genere una lista de todas las coordenadas en el campo.
Filtre las entradas donde ambas coordenadas se encuentran dentro del rectángulo.
Imprima un elemento aleatorio de los que quedan.
fuente
Perl 5
-ap
, 84 bytesPruébalo en línea!
fuente
Scala , 172 bytes
Aleatoriedad? Gotcha
Una implementación divertida que se me ocurre.
Cómo funciona : genera un par aleatorio en el mapa. Si está en el rectángulo interno, intente nuevamente.
Pruébalo en línea!
fuente
J ,
54474539 bytesPruébalo en línea!
Tome la entrada como una cuadrícula de 3 x 2 como:
0?@{[
(-1&{)~
(<*/@,0<:[)
del rectángulo interior desplazado de manera similar2{[
. De lo contrario, devuelva el punto aleatorio original no desplazado.{~&1
Otro enfoque, 45 bytes
Pruébalo en línea!
Este es conceptualmente más simple y no se molesta con el bucle. En su lugar, construimos una matriz de todos los números 0 a (wxh), la desplazamos por el punto de inicio interno, tomamos solo los puntos en la subcuadrícula (0, 0) a (interior w, innner h), los eliminamos del total cuadrícula después de aplanar ambos, elija uno al azar del resto y convierta el entero de nuevo en un punto usando divmod
<.@% , |~
fuente