Introdução
Dada esta visualização de um campo de jogo:
(0,0)
+----------------------+(map_width, 0)
| A |
|-----+-----------+----|
| D | W | B |
|-----+-----------+----|
| C |
+----------------------+(map_width, map_height)
(0, map_height)
O mapa inteiro em que o jogo é jogado é o retângulo com as coordenadas dos cantos (0,0) e (map_width, map_height). Os pontos elegíveis para desovar inimigos são a União
O desafio
Escreva um código que retorne um ponto aleatório (x, y) com garantia de estar dentro de S. Seu código não pode introduzir nenhum viés adicional, o que significa que a probabilidade de cada coordenada é distribuída uniformemente, considerando que sua escolha de gerar aleatoriedade (por exemplo, função | library | dev / urandom) é imparcial.
As soluções mais curtas em bytes ganham!
Entrada
Você será dado um total de 6 variáveis de entrada inteiro positivo na ordem:
map_width, map_height, W_top_left_x, W_top_left_y, W_width, W_height
. Você pode assumir que a área de superfície (calculada) de todas as regiões (A, B, C, D, W) é cada> 10, portanto, não há espaços / regiões vazios.
Exemplo de entrada: 1000, 1000, 100, 100, 600, 400
A entrada deve conter os 6 valores descritos acima, mas pode ser passada como menor número de argumentos e em qualquer ordem. Por exemplo, passar (map_width, map_height)
como tupla python é permitido. O que não é permitido, é claro, são parâmetros calculados, como o ponto inferior direito do W.
Resultado
2 inteiros gerados aleatoriamente (x, y) em que
OU
ou seja, pelo menos uma das expressões lógicas acima deve ser verdadeira.
Exemplos
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 detalhes e limitações para entrada / saída, consulte as regras padrão de entrada / saída
2 randomly generated integers (x, y)
Respostas:
Python 2 ,
114106102101 bytesExperimente online!
fonte
[i%w, i/w]
porque o intervalo,w*h/w=h
mas x, está vinculado à largura neste exemplo, não à altura.a/b
já é a divisão do piso, sea
eb
são inteiros (que estão aqui).R ,
8973 bytesExperimente online!
Toma entrada como
width,height,c(X,Y),c(W,H)
.Amostras de[ 0 , w ] × [ 0 , h ] uniformemente até encontrar um ponto fora do retângulo interno.
fonte
05AB1E ,
2321201817 bytesA entrada está no formato
[map_width, map_height], [W_top_left_x, W_top_left_y], [W_width, W_height]
.Graças ao @Grimy por -1 byte, e também por me fazer perceber que introduzi um bug após minha última edição.
Experimente on-line , produza 10 saídas possíveis ao mesmo tempo ou verifique todas as coordenadas possíveis . (Observação secundária: reduzi o exemplo de entrada em um fator 10, porque o filtro e a escolha aleatória incorporados são muito lentos para grandes listas.)
Explicação:
As entradas
map_width, map_height, [W_top_left_x, W_top_left_y], [W_width, W_height]
são referidas[Wm, Hm], [x, y], [w, h]
abaixo:fonte
[map_height, 0]
como possível saída aleatória sem o¨
. :)*ݨ¹‰
poderia serL`â<
pegando as duas primeiras entradas como[map_height, map_width]
. TambémII
poderia serŠ
, a menos que eu perdesse alguma coisa.L`â<
. Quanto aoII+
toŠ+
, você está realmente certo de que seria o mesmo .. Infelizmente eu cometi um erro e deveria ter sido, em²³+
vez deII+
, pois ele usaria a terceira entrada para ambosI
(assim como levaria duas vezes a terceira entrada comŠ
) após a primeira iteração do filtro .. Então, implicitamente, obrigado por me fazer perceber que eu tinha um bug. :)C # (compilador interativo do Visual C #) , 110 bytes
Experimente online!
fonte
PowerShell ,
8573 bytes-12 bytes graças ao mazzy
Experimente online!
Resposta simples e agradável, que reúne uma matriz composta pelo intervalo de valores para cada dimensão e, em seguida, seleciona uma aleatoriamente para
x
ey
. Consegue reutilizar a maior parte do código processando primeirox
, depois substituindo$x
-o$y
e executando-o novamente.fonte
Julia ,
767167 bytesExperimente online!
fonte
Gelatina , 11 bytes
Experimente online!
Um link dyadic que leva dois argumentos,
[map_width, map_height], [W_width, W_height]
eW_left, W_top
e retorna um ponto selecionado aleatoriamente atender aos requisitos.Explicação
fonte
Python 2 , 100 bytes
A entrada deve estar na forma de
((map_width, W_top_left_x, W_width),(map_height, W_top_left_y, W_height))
A saída é fornecida no formato:
[[x],[y]]
Experimente online!
Saídas aleatórias obtidas a partir da entrada de exemplo:
fonte
Java (OpenJDK 8) , 100 bytes
Experimente online!
Utiliza
java.awt.Rectangle
como detentor de alguns dos parâmetros. Naturalmente, esses usamint
campos, e nãofloat
oudouble
.fonte
Rectangle#contains
builtin! : DWolfram Language (Mathematica) ,
846860 bytesExperimente online!
Tome entradas como
{map_width, map_height}, {W_width, W_height}, {W_top_left_x, W_top_left_y}
.fonte
Carvão ,
5543 bytesExperimente online! Link é a versão detalhada do código. Explicação:
Insira o tamanho do mapa. (Se eles fossem os últimos, eu poderia inserir a altura em linha para economizar 1 byte.)
Insira o retângulo interno. (Se eu pudesse inserir o pedido
left, width, top, height
, poderia usá-loF²⊞υE²N
para economizar 3 bytes.)Gere uma lista de todas as coordenadas no campo.
Filtre as entradas em que as duas coordenadas estão dentro do retângulo.
Imprima um elemento aleatório daqueles que restam.
fonte
Perl 5
-ap
, 84 bytesExperimente online!
fonte
Scala , 172 bytes
Aleatoriedade? Peguei vocês.
Uma implementação divertida em que pude pensar.
Como funciona : gere um par aleatório no mapa. Se estiver no retângulo interno, tente novamente.
Experimente online!
fonte
J ,
54474539 bytesExperimente online!
Tome entrada como uma grade 3 x 2 como:
0?@{[
(-1&{)~
(<*/@,0<:[)
do retângulo interno com a mesma alteração2{[
. Caso contrário, retorne o ponto aleatório original, sem deslocamento.{~&1
Outra abordagem, 45 bytes
Experimente online!
Este é conceitualmente mais simples e não se preocupa com o loop. Em vez disso, construímos uma matriz de todos os números de 0 a (wxh), deslocamos-a pelo ponto inicial interno, agarramos apenas os pontos da sub-grade (0, 0) a (interna w, inn h) e os removemos do conjunto geral grade após achatar os dois, escolha um aleatoriamente do restante e converta o número inteiro novamente em um ponto usando divmod
<.@% , |~
fonte