マップ内の指定された長方形の外側にランダムポイントを生成します


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)

上記の論理式の少なくとも1つが真でなければならないことを意味します。

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
@agtoeverは、「出力」セクションでそう述べています。2 randomly generated integers (x, y)
ジュゼッペ

1
異なる(一貫した)順序で入力を取得できますか?
-attinat

@agtoever yesの出力は、「出力」セクションに記載されている整数である必要があります。
jaaq

回答:


7

Python 2114の 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*

オンラインでお試しください!


よくわかりませんが、この例ではxは[i%w, i/w] 範囲ではw*h/w=hなく、幅は高さではなく、幅に関係しているためだと思います。
jaaq

@jaaqええ、その通りです。今修正、ありがとう:)
TFeld

生成したリストの内容を確認したところ、ソリューションが間違っているようです。点をプロットすると、すべての値が線に沿っており、Sの領域全体を意図したとおりに埋めていないことがわかります。また、生成するリストには整数以外の値が含まれます。
jaaq

@jaaqどういう意味かわかりませんか?座標は常に整数であり、線上ではありません(
-TFeld

1
@jaaq Python 2では、が整数a/bである場合a、すでに階除算されbています(ここにあります)。
TFeld

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分の1に減らしました。)

説明:

入力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]ことなく可能ランダム出力として¨。:)
ケビンクルーイッセン

*ݨ¹‰L`â<、最初の2つの入力をとして取得できます[map_height, map_width]。また、私が何かを見逃さない限り、II可能性がありますŠ
グリムミー

@GrimyをありがとうL`â<II+するŠ+、あなたはそれが同じになる権利ことを確かにしている...残念ながら、私はエラーを自分で作り、それがされているはず²³+の代わりに、II+それは両方のための第3の入力を使用しているので、Iそれが2倍かかるだろうと同じように(Šフィルターを最初に繰り返した後、)を使用して3番目の入力を行います。:)
ケビンクルーッセン


3

PowerShell85 73バイト

Mazzyのおかげで-12バイト

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

オンラインでお試しください!

一緒に各次元の値の範囲からなるアレイを玉石、その後のために無作為にいずれかを選ぶ素敵な単純な答えxy。最初に処理しx、それで上書き$x$yて再度実行することで、ほとんどのコードを再利用できます。



1
@mazzy実際に範囲の最適化に出くわしましたが、後方に適用し、0バイトを節約しました。
ベスカ


1

ゼリー、11バイト

p/’$€+2¦ḟ/X

オンラインでお試しください!

2つの引数を取る二項リンク、 [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 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]]

1

Java(OpenJDK 8)、100バイト

W->H->r->{int x=0,y=0;for(;r.contains(x+=W*Math.random(),y+=H*Math.random());x=y=0);return x+","+y;}

オンラインでお試しください!

java.awt.Rectangle一部のパラメーターのホルダーとして使用します。当然、これらはintフィールドを使用しますが、floatまたはではありませんdouble


1
ああ、Rectangle#containsビルトインで文字通り挑戦するいい方法です!:D
ケビンクルーッセン


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

Scala、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&{)~
  • 選択されたスポットが(<*/@,0<:[)同様にシフトされた内部長方形内にある場合、ステップ1に戻ります。2{[。それ以外の場合は、元のシフトされていないランダムポイントを返します。
  • 無効であることがわかっているポイント、つまり、入力リストの要素2と3で定義されている内部の四角形の左上のポイントでプロセス全体をシードします。 {~&1

別のアプローチ、45バイト

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

オンラインでお試しください!

これは概念的には単純であり、ループを気にしません。代わりに、0から(wxh)までのすべての数字の行列を作成し、内側の開始点だけシフトし、(0、0)から(内側w、内側h)のサブグリッドの点のみを取得し、全体から削除します両方を平坦化した後のグリッド、残りからランダムに1つを選択し、divmodを使用して整数をポイントに変換します<.@% , |~

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.