Hasilkan titik acak di luar kotak yang diberikan dalam peta

15

pengantar

Diberikan visualisasi ini dari lapangan bermain:

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

Seluruh peta permainan yang dimainkan adalah persegi panjang dengan koordinat sudut (0,0) dan (map_width, map_height). Poin yang memenuhi syarat untuk memunculkan musuh adalah Union

S=(A,B,C,D)

Tantangan

Tulis kode yang mengembalikan titik acak (x, y) yang dijamin berada di dalam S. Kode Anda tidak dapat menimbulkan bias tambahan, artinya probabilitas setiap koordinat terdistribusi secara seragam mengingat asumsi bahwa pilihan Anda untuk menghasilkan keacakan (mis. Fungsi | perpustakaan | dev / urandom) tidak bias.

Solusi terpendek dalam byte menang!

Memasukkan

Anda akan diberikan total 6 variabel input integer positif dalam urutan: map_width, map_height, W_top_left_x, W_top_left_y, W_width, W_height . Anda dapat mengasumsikan bahwa luas permukaan (dihitung) semua wilayah (A, B, C, D, W) adalah masing-masing> 10, sehingga tidak ada spasi / wilayah kosong.

Input Contoh: 1000, 1000, 100, 100, 600, 400

Input harus mengandung 6 nilai yang diuraikan di atas, tetapi dapat diteruskan dengan jumlah argumen yang lebih sedikit dan dalam urutan apa pun. Misalnya lewat (map_width, map_height)sebagai tupel python diizinkan. Yang tidak diperbolehkan tentu saja adalah parameter yang dihitung seperti titik kanan bawah W.

Keluaran

2 bilangan bulat yang dihasilkan secara acak (x, y) di mana

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

ATAU

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

artinya setidaknya satu dari ekspresi logis di atas harus benar.

Contohnya

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

Untuk perincian dan batasan input / output, silakan merujuk pada aturan input / output default

jaaq
sumber
Saya pikir Anda harus secara eksplisit menyatakan bahwa koordinat output adalah bilangan bulat (yang saya simpulkan sebagai maksud implisit Anda).
agtoever
1
Bisakah kita menggunakan aturan input / output default ?
Nick Kennedy
1
@agtoever dikatakan demikian di bagian "output"; 2 randomly generated integers (x, y)
Giuseppe
1
bolehkah kita mengambil input dengan urutan yang berbeda (konsisten)?
attinat
@agtoever ya output harus berupa bilangan bulat seperti yang dinyatakan di bagian "output".
jaaq

Jawaban:

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*

Cobalah online!

TFeld
sumber
Saya tidak yakin tapi saya pikir itu seharusnya [i%w, i/w] karena rentang w*h/w=htetapi x terkait dengan lebar dalam contoh ini bukan ketinggian.
jaaq
@jaaq Ya, kamu benar. Diperbaiki sekarang, terima kasih :)
TFeld
Saya baru saja memeriksa isi daftar yang Anda hasilkan dan tampaknya solusi Anda salah. Memplot poin menunjukkan bahwa semua nilai berada di sepanjang garis dan tidak mengisi seluruh wilayah S sebagaimana dimaksud. Juga daftar yang Anda hasilkan mengandung nilai-nilai non-integer.
jaaq
@jaaq Saya tidak yakin apa yang Anda maksud? Koordinat selalu bilangan bulat, dan bukan pada garis ( mis. )
TFeld
1
@jaaq Dalam Python 2, a/bsudah pembagian lantai, jika adan badalah bilangan bulat (yang ada di sini).
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}

Cobalah online!

Mengambil input sebagai width,height,c(X,Y),c(W,H) .

[0,w]×[0,h]

Giuseppe
sumber
4

05AB1E , 23 21 20 18 17 byte

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

Input dalam format [map_width, map_height], [W_top_left_x, W_top_left_y], [W_width, W_height] .

Terima kasih kepada @Grimy untuk -1 byte, dan juga untuk membuat saya sadar saya memperkenalkan bug setelah edit terakhir saya.

Cobalah secara online , hasilkan 10 kemungkinan hasil pada saat yang sama atau verifikasi semua kemungkinan koordinat . (Catatan kecil: Saya telah mengurangi input contoh dengan faktor 10, karena filter dan pilihan acak bawaan cukup lambat untuk daftar besar.)

Penjelasan:

Masukan map_width, map_height, [W_top_left_x, W_top_left_y], [W_width, W_height]tersebut disebut sebagai [Wm, Hm], [x, y], [w, h]berikut:

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)
Kevin Cruijssen
sumber
1
Terima kasih telah menambahkan bagian verifikasi :) solusi hebat!
jaaq
1
@jaaq Terima kasih! Saya telah menggunakan verifier sendiri setelah versi awal saya, yaitu ketika saya melihat bug yang harus saya perbaiki, karena itu termasuk koordinat [map_height, 0]mungkin sebagai hasil acak tanpa ¨. :)
Kevin Cruijssen
*ݨ¹‰bisa L`â<dengan mengambil dua input pertama sebagai [map_height, map_width]. Juga IIbisa Š, kecuali aku melewatkan sesuatu.
Grimmy
@Syukur terima kasih untuk L`â<. Adapun II+untuk Š+, Anda memang benar bahwa itu akan sama .. Sayangnya saya membuat kesalahan sendiri dan itu seharusnya ²³+bukanII+ , karena akan menggunakan masukan ketiga untuk kedua I(seperti itu akan mengambil dua kali input ketiga dengan Š) setelah iterasi pertama dari filter .. Jadi secara implisit terima kasih untuk membuat saya sadar bahwa saya memiliki bug. :)
Kevin Cruijssen
3

PowerShell , 85 73 byte

-12 byte berkat mazzy

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

Cobalah online!

Jawaban sederhana yang bagus yang menyatukan array yang terbuat dari kisaran nilai untuk setiap dimensi dan kemudian mengambil satu secara acak untuk xdan y. Berhasil menggunakan kembali sebagian besar kode dengan terlebih dahulu memproses x, lalu menimpa $xdengan $ydan menjalankannya lagi.

Veskah
sumber
1
Anda dapat menyimpan beberapa byte Cobalah secara online!
mazzy
1
@ Mazzy Saya benar-benar tersandung pada kisaran optimasi tetapi menerapkannya ke belakang, menghemat 0 byte.
Veskah
1

Julia , 76 71 67 byte

f(w,h,a,b,c,d)=rand(setdiff((0:w-1)'.=>0:h-1,(a:a+c-1)'.=>b:b+d-1))

Cobalah online!

pengguna3263164
sumber
1

Jelly , 11 byte

p/’$€+2¦ḟ/X

Cobalah online!

Tautan diad yang mengambil dua argumen, [map_width, map_height], [W_width, W_height]dan W_left, W_topdan mengembalikan titik yang dipilih secara acak memenuhi persyaratan.

Penjelasan

   $€       | 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
Nick Kennedy
sumber
1

Python 2 , 100 byte

Masukan harus dalam bentuk ((map_width, W_top_left_x, W_width),(map_height, W_top_left_y, W_height))

Output diberikan dalam bentuk: [[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

Cobalah online!

Output acak diperoleh dari contoh input:

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

Java (OpenJDK 8) , 100 byte

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

Cobalah online!

Digunakan java.awt.Rectanglesebagai pemegang beberapa parameter. Secara alami, itu menggunakan intbidang, dan bukan floatatau double.

Olivier Grégoire
sumber
1
Oh, cara yang bagus untuk menerima tantangan secara harfiah dengan Rectangle#containsbuiltin! : D
Kevin Cruijssen
1

Bahasa Wolfram (Mathematica) , 84 68 60 byte

RandomChoice[g=Join@@List~Array~##&;#~g~0~Complement~g@##2]&

Cobalah online!

Ambil input sebagai {map_width, map_height}, {W_width, W_height}, {W_top_left_x, W_top_left_y}.

attinat
sumber
0

Arang , 55 43 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

NθNη

Masukkan ukuran peta. (Jika mereka yang terakhir, saya bisa memasukkan ketinggian sebaris untuk penghematan 1 byte.)

FE²N⊞υ⟦ιN⟧

Masukkan persegi panjang bagian dalam. (Jika saya bisa memasukkan dalam urutan left, width, top, heightmaka saya bisa menggunakan F²⊞υE²Nuntuk penghematan 3-byte.)

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

Buat daftar semua koordinat di lapangan.

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

Saring entri di mana kedua koordinat berada di dalam persegi panjang.

I‽...

Cetak elemen acak dari yang tersisa.

Neil
sumber
0

Perl 5 -ap , 84 byte

sub c{($c=0|rand((pop)+($l=pop)-"@_"))<$l?$c:$c+"@_"-$l}say c@F[4,2,0];$_=c@F[5,3,1]

Cobalah online!

Xcali
sumber
0

Scala , 172 byte

Keserampangan? Kena kau.

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

Implementasi yang menyenangkan yang bisa saya pikirkan.
Cara kerjanya : Menghasilkan pasangan acak di peta. Jika berada di kotak bagian dalam, coba lagi.
Cobalah online!

V. Courtois
sumber
0

J , 54 47 45 39 byte

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

Cobalah online!

Ambil input sebagai kisi 3 x 2 seperti:

grid_height  grid_width
inner_top    inner_left
inner_height inner_width
  • Pilih titik acak di seluruh kisi: 0?@{[
  • Geser ke kiri dan ke bawah pada titik kiri atas persegi panjang interior: (-1&{)~
  • Kembali ke langkah 1 jika tempat yang dipilih berada dalam (<*/@,0<:[)persegi panjang interior yang sama bergeser 2{[. Kalau tidak, kembalikan titik acak asli yang tidak tergeser.
  • Seed seluruh proses dengan titik yang kita tahu tidak valid, yaitu titik kiri atas dari persegi panjang interior, didefinisikan oleh elemen 2 dan 3 dari daftar input: {~&1

Pendekatan lain, 45 byte

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

Cobalah online!

Yang ini secara konsep lebih sederhana, dan tidak repot dengan perulangan. Sebagai gantinya, kami membuat matriks dari semua angka 0 hingga (wxh), menggesernya dengan titik awal bagian dalam, mengambil hanya titik-titik dalam subgrid (0, 0) ke (bagian dalam, inner h), menghapusnya dari keseluruhan kisi setelah meratakan keduanya, pilih satu secara acak dari sisanya, dan ubah bilangan bulat kembali ke titik menggunakan divmod<.@% , |~

Jonah
sumber