Bir harita içinde belirli bir dikdörtgenin dışında rastgele bir nokta oluşturma


15

Giriş

Bir oyun alanının bu görselleştirmesi göz önüne alındığında:

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

Oyunun oynandığı haritanın tamamı köşe koordinatları (0,0) ve (map_width, map_height) olan dikdörtgendir. Düşmanları yumurtlamaya uygun noktalar Birlik

S=(A,B,C,D)

Meydan okuma

S içinde olması garanti edilen rastgele bir nokta (x, y) döndüren kod yazma Kodunuz herhangi bir ek yanlılık getiremez, yani her koordinatın olasılığı eşit olarak dağıtılır varsayım göz önüne alındığında rastlantısallığını üreten seçiminiz (örn işlevi | library | dev / urandom) tarafsızdır.

Baytlarda en kısa çözümler kazanır!

Giriş

Sen sırayla 6 pozitif tamsayı girdi değişkenleri toplam verilecektir: map_width, map_height, W_top_left_x, W_top_left_y, W_width, W_height. Tüm bölgelerin (hesaplanan) yüzey alanının (A, B, C, D, W) her birinin> 10 olduğunu varsayabilirsiniz, bu nedenle boş alan / bölge yoktur.

Örnek Giriş: 1000, 1000, 100, 100, 600, 400

Giriş, yukarıda açıklanan 6 değeri içermelidir, ancak daha az sayıda argüman olarak ve herhangi bir sırada geçirilebilir. Örneğin,(map_width, map_height) python grubu olarak izin verilir. Elbette izin verilmeyen, W'nin sağ alt noktası gibi hesaplanan parametrelerdir.

Çıktı

2 rastgele oluşturulan tamsayı (x, y) burada

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

VEYA

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

yani yukarıdaki mantıksal ifadelerden en az birinin doğru olması gerekir.

Örnekler

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

Giriş / çıkışla ilgili ayrıntılar ve sınırlamalar için lütfen varsayılan giriş / çıkış kurallarına bakın


Bence çıktı koordinatlarının tamsayılar olduğunu (dolaylı olarak sizin niyetiniz olarak çıkarım) belirtmeniz gerektiğini düşünüyorum.
agtoever


1
@agtoever "çıktı" bölümünde bunu söylüyor; 2 randomly generated integers (x, y)
Giuseppe

1
girdileri farklı (tutarlı) bir sırayla alabilir miyiz?
attinat

@agtoever yes output, "output" bölümünde belirtildiği gibi bir tamsayı olmalıdır.
jaaq

Yanıtlar:


7

Python 2 , 114 106 102 101 bayt

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*

Çevrimiçi deneyin!


Emin değilim ama bence [i%w, i/w] aralığı w*h/w=hama x bu örnekte yüksekliğe değil genişliğe bağlı.
jaaq

@jaaq Evet, haklısın. Şimdi düzeltildi, teşekkürler :)
TFeld

Oluşturduğunuz listenin içeriğini kontrol ettim ve çözümünüz yanlış görünüyor. Noktaların çizilmesi, tüm değerlerin bir çizgi boyunca olduğunu ve tüm S bölgesini amaçlandığı gibi doldurmadığını gösterir. Ayrıca oluşturduğunuz liste tamsayı olmayan değerler içerir.
jaaq

@jaaq Ne demek istediğinden emin değilim? Koordinatlar her zaman tamsayıdır ve bir çizgi üzerinde değildir ( örneğin )
TFeld

1
@jaaq Python 2'de, a/bzaten ave eğer btamsayılarsa (buradalar) kat bölümüdür .
TFeld

4

R , 89 73 bayt

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

Çevrimiçi deneyin!

Girişi alır width,height,c(X,Y),c(W,H).

[0,w]×[0,h]


4

05AB1E , 23 21 20 18 17 bayt

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

Girdi biçimindedir [map_width, map_height], [W_top_left_x, W_top_left_y], [W_width, W_height].

-1 byte için @Grimy sayesinde ve ayrıca beni farkettirmek için son düzenlememden sonra bir hata tanıttım .

Online Deneyin , aynı anda çıkış 10 olası çıkışları veya tüm olası koordinatları doğrulamak . (Küçük not: Örnek girişi 10 kat azalttım, çünkü filtre ve rastgele seçim yerleşik büyük listeler için oldukça yavaş.)

Açıklama:

Giriş map_width, map_height, [W_top_left_x, W_top_left_y], [W_width, W_height]olarak adlandırılır [Wm, Hm], [x, y], [w, h]gösterilmiştir:

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
Doğrulama bölümünü eklediğiniz için teşekkürler :) harika bir çözüm!
jaaq

1
@jaaq Teşekkürler! İlk sürümümden sonra doğrulayıcıyı kendim kullandım, bu da düzeltmek zorunda olduğum bir hatayı fark ettiğim için, koordinat [map_height, 0]olmadan mümkün olan rastgele çıktıyı içerdiğinden ¨. :)
Kevin Cruijssen

*ݨ¹‰L`â<ilk iki girişi alarak olabilir [map_height, map_width]. Bir şey kaçırmadıkça da IIolabilir Š.
Grimmy

@Grimy için teşekkürler L`â<. Gelince II+üzere Š+, sen Ne yazık ki bir hatayı yaptı .. aynı olurdu bu doğru aslında kendim konum ve olmalıydı ²³+yerine II+o ikisi için üçüncü girişini kullanmak olacağından, Iiki kez alacaktı gibi ( üçüncü girdi ile Š) filtrenin ilk yinelemesinden sonra .. Bu yüzden dolaylı olarak bana bir hata olduğunu fark ettiğiniz için teşekkürler. :)
Kevin Cruijssen


3

PowerShell , 85 73 bayt

Mazzy sayesinde -12 bayt

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

Çevrimiçi deneyin!

Her bir boyut için değer aralığından oluşan bir diziyi bir araya toplayan ve sonra xve için rastgele bir tane seçen güzel basit cevap y. İlk işleme göre kodun en yeniden yönetir xsonra üzerine yazarak $xile $yve tekrar çalıştırarak.


1
birkaç bayt kaydedebilirsiniz Çevrimiçi deneyin!
mazzy

1
@mazzy Aslında aralık optimizasyonu genelinde rastladım ama geriye doğru uygulayarak 0 bayt tasarruf ettim.
Veskah


1

Jöle , 11 bayt

p/’$€+2¦ḟ/X

Çevrimiçi deneyin!

İki argüman alan ikili bir bağlantı, [map_width, map_height], [W_width, W_height] ve W_left, W_topve gereksinimlerini karşılayan rasgele seçilen noktayı döndürür.

açıklama

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

Girdi şu biçimde olmalıdır: ((map_width, W_top_left_x, W_width),(map_height, W_top_left_y, W_height))

Çıktı şu şekilde verilir: [[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

Çevrimiçi deneyin!

Örnek girişten elde edilen rastgele çıktılar:

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



0

Kömür , 55 43 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

NθNη

Harita boyutunu girin. (Eğer son olsaydı, 1 baytlık tasarruf için yükseklik satırını girebilirim.)

FE²N⊞υ⟦ιN⟧

İç dikdörtgeni girin. ( Sıraya girebilseydim, 3 baytlık bir tasarruf için left, width, top, heightkullanabilirdim F²⊞υE²N.)

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

Alandaki tüm koordinatların bir listesini oluşturun.

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

Her iki koordinatın da dikdörtgenin içinde olduğu girişleri filtreleyin.

I‽...

Kalanlardan rastgele bir öğe yazdırın.



0

Scala , 172 bayt

Rastgelelik? Anladım.

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

Düşünebileceğim eğlenceli bir uygulama.
Nasıl çalışır : Haritada rastgele bir çift oluşturun. İç dikdörtgenin içindeyse tekrar deneyin.
Çevrimiçi deneyin!


0

J , 54 47 45 39 bayt

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

Çevrimiçi deneyin!

Girişi aşağıdaki gibi 3 x 2 ızgara olarak alın:

grid_height  grid_width
inner_top    inner_left
inner_height inner_width
  • Tüm ızgarada rastgele bir nokta seçin: 0?@{[
  • İç dikdörtgenin sol üst noktasıyla sola ve aşağı kaydırın: (-1&{)~
  • Seçilen nokta (<*/@,0<:[)benzer şekilde kaydırılmış iç dikdörtgenin içindeyse 1. adıma dönün2{[ . Aksi takdirde orijinal, kaydırılmamış rastgele noktayı döndürün.
  • Tüm işlemi, bildiğimiz bir nokta ile, yani giriş listesinin 2 ve 3 öğeleri tarafından tanımlanan iç dikdörtgenin sol üst noktası ile tohumlayın: {~&1

Başka bir yaklaşım, 45 bayt

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

Çevrimiçi deneyin!

Bu kavramsal olarak daha basittir ve döngü ile uğraşmaz. Bunun yerine, 0 ila (gxy) arasındaki tüm sayıların bir matrisini oluştururuz, onu iç başlangıç ​​noktasına kaydırırız, (0, 0) 'daki noktaları (iç w, iç h) alt ızgaraya alırız, toplamdan çıkarırız Her ikisini de düzleştirdikten sonra ızgara, geri kalanından rastgele birini seçin ve divmod kullanarak tamsayıyı tekrar bir noktaya dönüştürün<.@% , |~

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.