在地图内的指定矩形之外生成随机点


15

介绍

鉴于此公平的竞争环境:

(0,0)
+----------------------+(map_width, 0)
|           A          |
|-----+-----------+----|
|  D  |     W     | B  |
|-----+-----------+----|
|           C          |
+----------------------+(map_width, map_height)
(0, map_height)

玩游戏的整个地图是带有角坐标(0,0)和(map_width,map_height)的矩形。有资格产生敌人的点是联盟

S=(A,B,C,D)

挑战

编写返回肯定位于S内的随机点(x,y)的代码。您的代码不能引入任何其他偏差,这意味着每个坐标的概率为 假设您选择生成随机性(例如函数)均匀分布的| library | dev / urandom)。

以字节为单位的最短解决方案获胜!

输入值

您将按顺序总共得到6个正整数输入变量: map_width, map_height, W_top_left_x, W_top_left_y, W_width, W_height。您可以假设所有区域(A,B,C,D,W)的(计算出的)表面积均> 10,因此没有空白/区域。

输入示例: 1000, 1000, 100, 100, 600, 400

输入必须包含上述6个值,但可以较少数量的参数和以任何顺序传递。例如通过(map_width, map_height),允许作为python元组。当然是不允许的是计算得出的参数,例如W的右下角。

输出量

2个随机生成的整数(x,y)其中

(0x<map_width)¬(W_top_left_xx<W_top_left_x+view_width)

要么

(0y<map_height)¬(W_top_left_yy<W_top_left_y+view_height)

意思是以上逻辑表达式中的至少一个必须为真。

例子

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

有关输入/输出的详细信息和限制,请参考默认的输入/输出规则


我认为您应该明确声明输出坐标是整数(我推断这是您的隐含意图)。
agtoever

1
我们可以使用默认的输入/输出规则吗?
肯尼迪

1
@agtoever在“输出”部分这样说;2 randomly generated integers (x, y)
朱塞佩

1
我们可以按不同(一致)的顺序接受输入吗?
attinat

@agtoever yes输出必须是“输出”部分中所述的整数。
jaaq

Answers:


7

Python 2中114个 106 102 101字节

lambda w,h,X,Y,W,H:choice([(i%w,i/w)for i in range(w*h)if(W>i%w-X>-1<i/w-Y<H)<1])
from random import*

在线尝试!


我不确定,但我认为应该是[i%w, i/w] 因为w*h/w=hx 的范围是与宽度相关联的,而不是高度。
jaaq

@jaaq是的,你是对的。立即修复,谢谢:)
TF

我只是检查了您生成的列表的内容,看来您的解决方案不正确。绘制点表示所有值都沿着一条线,并且没有按预期填充S的整个区域。另外,您生成的列表还包含非整数值。
jaaq

@jaaq我不确定你的意思吗?坐标始终是整数,不在一行上(例如
TF

1
@jaaq在Python 2中,a/b如果ab是整数(它们在此处),已经是地板除法。
TF

4

R89 73字节

function(w,h,K,D,`*`=sample){while(all((o<-c(0:w*1,0:h*1))<=K+D&o>K))0
o}

在线尝试!

将输入作为width,height,c(X,Y),c(W,H)

[0,w]×[0,h]


4

05AB1E23 21 20 18 17 字节

L`â<ʒ²³+‹y²@«P≠}Ω

输入采用格式[map_width, map_height], [W_top_left_x, W_top_left_y], [W_width, W_height]

谢谢 @Grimy提供了-1个字节,也感谢我使我意识到我在最新编辑后引入了一个错误。

在线尝试,同时输出10个可能的输出验证所有可能的坐标。(要注意的是:我将示例输入减少了10倍,因为对于大型列表,过滤器和随机选择内置的arer相当慢。)

说明:

的输入map_width, map_height, [W_top_left_x, W_top_left_y], [W_width, W_height]被称为[Wm, Hm], [x, y], [w, h]如下:

L          # Convert the values of the first (implicit) input to an inner list in
           # the range [1, n]: [[1,2,3,...,Wm],[1,2,3,....,Hm]]
 `         # Push both inner lists separated to the stack
  â        # Get the cartesian product of both lists, creating each possible pair
   <       # Decrease each pair by 1 to make it 0-based
           # (We now have: [[0,0],[0,1],[0,2],...,[Wm,Hm-2],[Wm,Hm-1],[Wm,Hm]])
    ʒ      # Filter this list of coordinates [Xr, Yr] by:
     ²³+   #  Add the next two inputs together: [x+w, y+h]
          #  Check for both that they're lower than the coordinate: [Xr<x+w, Yr<y+h]
     y     #  Push the coordinate again: [Xr, Yr]
      ²    #  Push the second input again: [x, y]
       @   #  Check for both that the coordinate is larger than or equal to this given 
           #  input: [Xr>=x, Yr>=y] (the w,h in the input are ignored)
     «     #  Merge it with the checks we did earlier: [Xr<x+w, Yr<y+h, Xr>=x, Yr>=y]
      P   #  And check if any of the four is falsey (by taking the product and !=1,
           #  or alternatively `ß_`: minimum == 0)
         # After the filter: pick a random coordinate
           # (which is output implicitly as result)

1
感谢您添加验证部分:)很好的解决方案!
jaaq

1
@jaaq谢谢!我在最初的版本后使用了验证程序,这是当我注意到必须修复的错误时,因为它包含[map_height, 0]尽可能多的坐标,而不包含¨。:)
Kevin Cruijssen

*ݨ¹‰可以L`â<通过将前两个输入作为[map_height, map_width]。也II可能是Š,除非我错过了一些东西。
Grimmy

@Grimy谢谢L`â<。至于II+to Š+,那的确是相同的。。不幸的是,我自己犯了一个错误,它应该是²³+而不是II+,因为它将对两者都使用第三个输入I(就像它需要两​​次输入一样)。Š在过滤器的第一次迭代之后,用)进行第三次输入。.因此,隐式感谢您使我意识到我有一个错误。:)
凯文·克鲁伊森


3

PowerShell85 73字节

-12字节感谢mazzy

param($a,$b,$x,$y,$w,$h)$a,$b|%{0..--$x+($x+$w+2)..$_|random
$x,$w=$y,$h}

在线尝试!

很好的简单答案,将每个维度的值范围组成的数组拼凑在一起,然后为x和随机选择一个y。管理由第一处理重用大部分的代码x,然后重写$x$y并再次运行它。


1
您可以节省一些字节在线尝试!
mazzy

1
@mazzy实际上,我确实在范围优化上遇到了麻烦,但是向后应用了它,节省了0个字节。
维斯卡


1

果冻,11字节

p/’$€+2¦ḟ/X

在线尝试!

带有两个参数的二元链接, [map_width, map_height], [W_width, W_height]W_left, W_top返回符合条件的随机选择的点。

说明

   $€       | For each of member of the left argument, do the following as a monad:
p/          | - Reduce using Cartesian product (will generate [1,1],[1,2],... up to the width and height of each of the rectangles)
  ’         | - Decrease by 1 (because we want zero-indexing)
     +2¦    | Add the right argument to the second element of the resulting list
        ḟ/  | Reduce by filtering members of the second list from the first
          X | Select a random element

1

Python 2,100字节

输入应采用以下形式 ((map_width, W_top_left_x, W_width),(map_height, W_top_left_y, W_height))

输出形式为: [[x],[y]]

lambda C:[c(s(r(i[0]))-s(r(i[1],i[1]+i[2])),1)for i in C]
from random import*;c=sample;r=range;s=set

在线尝试!

从示例输入获得的随机输出:

[[72], [940]]
[[45], [591]]
[[59], [795]]
[[860], [856]]
[[830], [770]]
[[829], [790]]
[[995], [922]]
[[23], [943]]
[[761], [874]]
[[816], [923]]



0

木炭55 43字节

NθNηFE²N⊞υ⟦ιN⟧I‽ΦE×θη⟦﹪ιθ÷ιθ⟧⊙υ∨‹§ιμ§λ⁰¬‹§ιμΣλ

在线尝试!链接是详细版本的代码。说明:

NθNη

输入地图尺寸。(如果它们是最后一个,我可以内联输入高度以节省1个字节。)

FE²N⊞υ⟦ιN⟧

输入内部矩形。(如果可以按顺序输入,left, width, top, height则可以F²⊞υE²N节省3个字节。)

E×θη⟦﹪ιθ÷ιθ⟧

生成该字段中所有坐标的列表。

Φ...⊙υ∨‹§ιμ§λ⁰¬‹§ιμΣλ

过滤掉两个坐标都位于矩形内的条目。

I‽...

打印剩余的随机元素。



0

斯卡拉,172字节

随机性?知道了

(a:Int,b:Int,c:Int,d:Int,e:Int,f:Int)=>{var r=new scala.util.Random
var z=(0,0)
do{z=(r.nextInt(a),r.nextInt(b))}while((c to e+c contains z._1)|(d to e+d contains z._2))
z}

我能想到的一个有趣的实现。
工作原理:在地图中生成随机对。如果它在内部矩形中,请重试。
在线尝试!


0

J54 47 45 39字节

(0?@{[)^:((-1&{)~(<*/@,0<:[)2{[)^:_{~&1

在线尝试!

将输入作为3 x 2网格,例如:

grid_height  grid_width
inner_top    inner_left
inner_height inner_width
  • 在整个网格上选择一个随机点: 0?@{[
  • 左右移动内部矩形的左上角: (-1&{)~
  • 如果选择的位置在范围内,请返回步骤1 (<*/@,0<:[)类似移动的内部矩形,2{[。否则,返回原始的,不变的随机点。
  • 给整个过程添加一个我们知道是无效的点,即内部矩形的左上点,该点由输入列表的元素2和3定义: {~&1

另一种方法,45字节

{.#:i.@{.(?@#{])@-.&,([:<@;&i./{:){1&{|.i.@{.

在线尝试!

从概念上讲,这更简单,并且不麻烦循环。取而代之的是,我们构造一个所有数字0到(wxh)的矩阵,将其移动到内部起点,仅抓取(0,0)到(inner w,innner h)子网格中的点,将它们从总体中删除将两者均压平后网格,从余数中随机选择一个,然后使用divmod将整数转换回一个点<.@% , |~

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.