지도에서 지정된 사각형 외부에 임의의 점을 생성


15

소개

경기장의 시각화는 다음과 같습니다.

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

게임이 진행되는 전체지도는 모서리 좌표가 (0,0) 및 (map_width, map_height) 인 사각형입니다. 적을 스폰 할 수있는 점수는 Union

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

Te 입력은 위에서 설명한 6 개의 값을 포함해야하지만 더 적은 수의 인수로 임의의 순서로 전달 될 수 있습니다. 예를 들어 전달(map_width, map_height) 파이썬 튜플로 것이 허용됩니다. 물론 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
기본 입력 / 출력 규칙을 사용할 수 있습니까 ?
Nick Kennedy

1
@agtoever는 "output"섹션에서 그렇게 말합니다; 2 randomly generated integers (x, y)
Giuseppe

1
다른 (일관된) 순서로 입력을받을 수 있습니까?
attinat

@agtoever yes 출력은 "output"섹션에 명시된 정수 여야합니다.
자크

답변:


7

파이썬 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=h있지만 x는 높이가 아닌이 예제의 너비에 묶여 있기 때문에 해야한다고 생각합니다 .
jaaq

@jaaq 그래, 맞아. 고마워요 :) :
TFeld

방금 생성 한 목록의 내용을 확인한 결과 솔루션이 올바르지 않은 것 같습니다. 점을 플로팅하면 모든 값이 선을 따라 표시되며 의도 한대로 S의 전체 영역을 채우지 않습니다. 또한 생성 한 목록에는 정수가 아닌 값이 포함됩니다.
jaaq

@jaaq 무슨 말인지 잘 모르겠습니다. 좌표는 (한 줄에 항상 정수, 그리고 예를 들어 )
TFeld

1
@jaaq에서 파이썬이는 a/b경우, 이미 바닥 부서입니다 ab(그들은 여기에 있습니다) 정수입니다.
TFeld

4

R , 89 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

05AB1E , 23 21 20 18 17 바이트

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

입력 형식은입니다 [map_width, map_height], [W_top_left_x, W_top_left_y], [W_width, W_height].

덕분에 -1 바이트에 대한 @Grimy 최신 편집 후 버그를 소개했습니다.

온라인 체험 , 동시에 출력 가능한 출력을 10 하거나 모든 가능한 좌표를 확인 . (사소한 메모 : 큰 목록의 경우 필터와 무작위 선택 내장 옵션이 상당히 느리기 때문에 예제 입력을 10으로 줄였습니다.)

설명:

입력 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(두 번 걸리는 것처럼 Š필터의 첫 번째 반복 후)를 사용하여 세 번째 입력 .. 버그가 있음을 알게 된 암묵적으로 감사합니다. :)
Kevin Cruijssen


3

PowerShell , 85 73 바이트

mazzy 덕분에 -12 바이트

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

온라인으로 사용해보십시오!

다음 함께 각 차원에 대한 값의 범위로 이루어지는 배열 시대 니스 단순한 응답은 무작위로 하나를 픽업 x하고 y. 제 1 처리에 의해 대부분의 코드를 재사용하는 것을 처리 x후 덮어 $x$y다시 실행.


1
당신은 몇 바이트를 절약 할 수 있습니다 온라인으로 사용해보십시오!
mazzy

1
@mazzy 실제로 범위 최적화를 우연히 발견했지만 뒤로 적용하여 0 바이트를 절약했습니다.
Veskah


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

파이썬 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⟧

내부 직사각형을 입력하십시오. (순서대로 입력 할 수 있으면 3 바이트 절약에 left, width, top, height사용할 수 있습니다 F²⊞υE²N.)

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

J , 54 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&{)~
  • 선택한 지점이 (<*/@,0<:[)유사하게 이동 된 내부 사각형 내에 있으면 1 단계로 돌아갑니다.2{[ . 그렇지 않으면 원래의 이동되지 않은 임의의 점을 반환합니다.
  • 입력 목록의 요소 2와 3에 의해 정의 된 점, 즉 내부 사각형의 왼쪽 위 점이 유효하지 않은 전체 프로세스를 시드합니다. {~&1

또 다른 접근법, 45 바이트

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

온라인으로 사용해보십시오!

이것은 개념적으로 더 간단하며 루핑을 방해하지 않습니다. 대신, 우리는 모든 숫자 0에서 (wxh)의 행렬을 구성하고, 내부 시작점으로 이동하고, (0, 0)에서 (inner w, innner h) 서브 그리드의 점만 잡고 전체에서 제거합니다. 그리드를 모두 병합 한 후 나머지에서 무작위로 하나를 선택하고 divmod를 사용하여 정수를 다시 점으로 변환하십시오.<.@% , |~

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.