Tạo một điểm ngẫu nhiên bên ngoài một hình chữ nhật đã cho trong bản đồ


15

Giới thiệu

Đưa ra hình dung này của một sân chơi:

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

Toàn bộ bản đồ mà trò chơi được chơi là hình chữ nhật có tọa độ góc (0,0) và (map_ rắc, map_height). Những điểm đủ điều kiện để đẻ trứng kẻ thù được Liên minh

S=(A,B,C,D)

Các thách thức

Viết mã trả về một điểm ngẫu nhiên (x, y) được đảm bảo ở bên trong S. Mã của bạn không thể đưa ra bất kỳ sai lệch bổ sung nào, có nghĩa là xác suất của mỗi tọa độ được phân phối đồng đều với giả định rằng lựa chọn tạo ngẫu nhiên của bạn (ví dụ: hàm | thư viện | dev / urandom) không thiên vị.

Các giải pháp ngắn nhất trong byte giành chiến thắng!

Đầu vào

Bạn sẽ được cung cấp tổng cộng 6 biến số nguyên dương theo thứ tự: map_width, map_height, W_top_left_x, W_top_left_y, W_width, W_height . Bạn có thể giả sử rằng diện tích bề mặt (được tính) của tất cả các vùng (A, B, C, D, W) là mỗi> 10, do đó không có khoảng trống / vùng trống.

Ví dụ đầu vào: 1000, 1000, 100, 100, 600, 400

Đầu vào Te phải chứa 6 giá trị được mô tả ở trên nhưng nó có thể được chuyển qua với số lượng đối số ít hơn và theo bất kỳ thứ tự nào. Ví dụ, vượt qua (map_width, map_height)như tuple python được cho phép. Tất nhiên những gì không được phép là các tham số được tính toán như điểm dưới cùng bên phải của W.

Đầu ra

2 số nguyên được tạo ngẫu nhiên (x, y) trong đó

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

HOẶC LÀ

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

có nghĩa là ít nhất một trong các biểu thức logic ở trên phải là đúng.

Ví dụ

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

Để biết chi tiết và giới hạn cho đầu vào / đầu ra, vui lòng tham khảo các quy tắc đầu vào / đầu ra mặc định


Tôi nghĩ bạn nên nói rõ rằng tọa độ đầu ra là số nguyên (mà tôi suy ra là ý định ngầm của bạn).
bất cứ lúc nào

1
Chúng ta có thể sử dụng các quy tắc đầu vào / đầu ra mặc định ?
Nick Kennedy

1
@agtoever nó nói như vậy trong phần "đầu ra"; 2 randomly generated integers (x, y)
Giuseppe

1
chúng ta có thể lấy đầu vào theo một thứ tự khác (nhất quán) không?
attinat

@agtoever có đầu ra phải là một số nguyên như đã nêu trong phần "đầu ra".
jaaq

Câu trả lời:


7

Python 2 , 114 106 102 101 byte

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*

Hãy thử trực tuyến!


Tôi không chắc chắn nhưng tôi nghĩ rằng nó nên [i%w, i/w] bởi vì phạm vi w*h/w=hnhưng x được gắn với chiều rộng trong ví dụ này không phải là chiều cao.
jaaq

@jaaq Vâng, bạn nói đúng. Đã sửa bây giờ, cảm ơn :)
TFeld

Tôi chỉ kiểm tra nội dung của danh sách bạn tạo và có vẻ như giải pháp của bạn không chính xác. Vẽ các điểm cho thấy rằng tất cả các giá trị nằm dọc theo một dòng và không điền vào toàn bộ khu vực của S như dự định. Ngoài ra danh sách bạn tạo chứa các giá trị không nguyên.
jaaq

@jaaq Tôi không chắc ý bạn là gì? Các tọa độ luôn là số nguyên và không nằm trên một dòng ( ví dụ )
TFeld

1
@jaaq Trong Python 2, a/bđã phân chia tầng, nếu ablà số nguyên (mà chúng ở đây).
TFeld

4

R , 89 73 byte

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

Hãy thử trực tuyến!

Đưa đầu vào là width,height,c(X,Y),c(W,H) .

Các mẫu từ [0,w]×[0,h] đồng đều cho đến khi tìm thấy một điểm bên ngoài hình chữ nhật bên trong.


4

05AB1E , 23 21 20 18 17 byte

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

Đầu vào là ở định dạng [map_width, map_height], [W_top_left_x, W_top_left_y], [W_width, W_height].

Cảm ơn @Grimy cho -1 byte và cũng để tôi nhận ra tôi đã giới thiệu một lỗi sau lần chỉnh sửa mới nhất của mình.

Hãy thử trực tuyến , xuất 10 đầu ra có thể cùng một lúc hoặc xác minh tất cả các tọa độ có thể . (Lưu ý nhỏ: Tôi đã giảm đầu vào ví dụ xuống 10 lần, bởi vì bộ lọc và lựa chọn ngẫu nhiên dựng sẵn khá chậm đối với các danh sách lớn.)

Giải trình:

Các đầu vào map_width, map_height, [W_top_left_x, W_top_left_y], [W_width, W_height]được gọi như [Wm, Hm], [x, y], [w, h]dưới đây:

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
Cảm ơn đã thêm phần xác minh :) giải pháp tuyệt vời!
jaaq

1
@jaaq Cảm ơn! Tôi đã sử dụng trình xác minh sau phiên bản ban đầu của mình, đó là khi tôi nhận thấy một lỗi tôi phải sửa, vì nó bao gồm cả tọa độ [map_height, 0]là đầu ra ngẫu nhiên có thể có mà không có ¨. :)
Kevin Cruijssen

*ݨ¹‰có thể L`â<bằng cách lấy hai đầu vào đầu tiên là [map_height, map_width]. Cũng IIcó thể Š, trừ khi tôi bỏ lỡ một cái gì đó.
Grimmy

@Grimy Cảm ơn vì L`â<. Đối với II+tới Š+, bạn đang thực sự đúng rằng nó sẽ là như nhau .. Đáng tiếc là tôi thực hiện một lỗi bản thân mình và nó cần phải có được ²³+thay vì II+, vì nó sẽ sử dụng các đầu vào thứ ba cho cả I(giống như nó sẽ mất hai lần đầu vào thứ ba với Š) sau lần lặp đầu tiên của bộ lọc .. Vì vậy, cảm ơn ngầm vì đã khiến tôi nhận ra mình có một lỗi. :)
Kevin Cruijssen


3

PowerShell , 85 73 byte

-12 byte nhờ mazzy

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

Hãy thử trực tuyến!

Câu trả lời đơn giản đẹp mắt kết hợp một mảng được tạo thành từ các giá trị cho mỗi thứ nguyên và sau đó chọn ngẫu nhiên một thứ cho xy. Quản lý để tái sử dụng hầu hết các mã bằng cách xử lý đầu tiên x, sau đó ghi đè lên $xvới $yvà chạy nó một lần nữa.


1
bạn có thể tiết kiệm một vài byte Hãy thử trực tuyến!
mê mẩn

1
@mazzy Tôi thực sự đã vấp ngã trong việc tối ưu hóa phạm vi nhưng áp dụng ngược lại, tiết kiệm 0 byte.
Veskah


1

Thạch , 11 byte

p/’$€+2¦ḟ/X

Hãy thử trực tuyến!

Một liên kết dyadic có hai đối số, [map_width, map_height], [W_width, W_height]W_left, W_topvà trả về một điểm đã chọn ngẫu nhiên đáp ứng yêu cầu.

Giải trình

   $€       | 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

Con trăn 2 , 100 byte

Đầu vào phải ở dạng ((map_width, W_top_left_x, W_width),(map_height, W_top_left_y, W_height))

Đầu ra được đưa ra dưới dạng: [[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

Hãy thử trực tuyến!

Đầu ra ngẫu nhiên thu được từ đầu vào ví dụ:

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



0

Than , 55 43 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

NθNη

Nhập kích thước bản đồ. (Nếu chúng là lần cuối cùng, tôi có thể nhập nội tuyến chiều cao để tiết kiệm 1 byte.)

FE²N⊞υ⟦ιN⟧

Nhập hình chữ nhật bên trong. (Nếu tôi có thể nhập theo thứ tự left, width, top, heightthì tôi có thể sử dụng F²⊞υE²Nđể tiết kiệm 3 byte.)

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

Tạo một danh sách tất cả các tọa độ trong trường.

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

Lọc ra các mục trong đó cả hai tọa độ nằm bên trong hình chữ nhật.

I‽...

In một yếu tố ngẫu nhiên của những người còn lại.



0

Scala , 172 byte

Ngẫu nhiên? Gotcha.

(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}

Một triển khai thú vị tôi có thể nghĩ ra.
Cách thức hoạt động : Tạo một cặp ngẫu nhiên trong bản đồ. Nếu nó nằm trong hình chữ nhật bên trong, hãy thử lại.
Hãy thử trực tuyến!


0

J , 54 47 45 39 byte

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

Hãy thử trực tuyến!

Lấy đầu vào dưới dạng lưới 3 x 2 như:

grid_height  grid_width
inner_top    inner_left
inner_height inner_width
  • Chọn một điểm ngẫu nhiên trên toàn bộ lưới: 0?@{[
  • Di chuyển nó sang trái và xuống bởi điểm trên bên trái của hình chữ nhật bên trong: (-1&{)~
  • Quay trở lại bước 1 nếu vị trí đã chọn nằm trong (<*/@,0<:[)hình chữ nhật bên trong được dịch chuyển tương tự2{[ . Nếu không, trả lại điểm ngẫu nhiên ban đầu, không di chuyển.
  • Hạt giống toàn bộ quá trình với một điểm chúng ta biết là không hợp lệ, cụ thể là điểm trên bên trái của hình chữ nhật bên trong, được xác định bởi các yếu tố 2 và 3 của danh sách đầu vào: {~&1

Một cách tiếp cận khác, 45 byte

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

Hãy thử trực tuyến!

Cái này đơn giản hơn về mặt khái niệm và không bận tâm đến việc lặp. Thay vào đó, chúng tôi xây dựng một ma trận gồm tất cả các số từ 0 đến (wxh), dịch chuyển nó theo điểm bắt đầu bên trong, chỉ lấy các điểm trong phần phụ (0, 0) thành (sub w, innner h), loại bỏ chúng khỏi tổng thể lưới sau khi làm phẳng cả hai, chọn ngẫu nhiên một từ phần còn lại và chuyển đổi số nguyên trở lại thành một điểm bằng cách sử dụng divmod<.@% , |~

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.