Створіть випадкову точку за межами заданого прямокутника в межах карти


15

Вступ

З огляду на таку візуалізацію ігрового поля:

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

Вся карта, на якій грається гра, - це прямокутник з кутовими координатами (0,0) та (ширина карти, висота карти). Окуляри, придатні для нересту ворогів, - це союз

S=(A,B,C,D)

Змагання

Напишіть код, який повертає випадкову точку (x, y), яка гарантовано знаходиться всередині S. Ваш код не може ввести додаткового зміщення, тобто імовірність кожної координати розподілена рівномірно враховуючи припущення, що ваш вибір генерує випадковість (наприклад, функція | бібліотека | 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)дозволено передавати як кортеж пітона. Звичайно, те, що не дозволено, розраховуються такими параметрами, як нижня права точка 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
Чи можемо ми використовувати правила вводу / виводу за замовчуванням ?
Нік Кеннеді

1
@agtoever це говорить так у розділі "вихід"; 2 randomly generated integers (x, y)
Джузеппе

1
чи можемо ми приймати матеріали в іншому (послідовному) порядку?
attinat

@agtoever yes висновок повинен бути цілим числом, як зазначено в розділі "output".
jaaq

Відповіді:


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 У Python 2 a/bвже є поділ підлоги, якщо aі bє цілими числами (які вони тут).
TFeld


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].

Завдяки @Grimy за -1 байт, а також за те, що я зрозумів, що я ввів помилку після останнього редагування.

Спробуйте в Інтернеті , виведіть 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+до Š+, ви справді маєте рацію, що це було б саме. На жаль, я помилився сам, і це мало бути ²³+замість цього II+, оскільки він би використовував третій вклад для обох I(точно так, як це би зайняло два рази більше, ніж третій вхід з Š) після першої ітерації фільтра .. Тож явно дякую за те, що я зрозумів, що у мене помилка. :)
Kevin Cruijssen


3

PowerShell , 85 73 байт

-12 байт завдяки мазі

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

Спробуйте в Інтернеті!

Хороший простий відповідь, який обмотує масив, виготовлений з діапазону значень для кожного вимірника, а потім вибирає один випадковим чином для xта y. Керує повторно більшу частину коду на першій обробці x, а потім перезаписати $xз $yі запустити його знову.


1
Ви можете зберегти кілька байт. Спробуйте в Інтернеті!
mazzy

1
@mazzy Я насправді натрапив на оптимізацію діапазону, але застосував її назад, заощадивши 0 байт.
Веська


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

Python 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⟧

Введіть внутрішній прямокутник. (Якщо я міг би ввести порядок, left, width, top, heightтоді я міг би використовувати F²⊞υE²Nдля 3-байтного збереження.)

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

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&{)~
  • Поверніться до кроку 1, якщо вибране місце знаходиться в (<*/@,0<:[)прямокутнику, що зміщується аналогічним чином 2{[. В іншому випадку поверніть початкову, не зміщену випадкову точку.
  • Помістіть весь процес з точки, яку ми знаємо, недійсною, а саме лівою верхньою точкою внутрішнього прямокутника, визначеною елементами 2 і 3 вхідного списку: {~&1

Ще один підхід, 45 байт

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

Спробуйте в Інтернеті!

Цей концептуально простіший і не турбується циклічно. Замість цього ми побудуємо матрицю всіх чисел 0 до (wxh), змістимо її на внутрішню початкову точку, захопимо лише точки в (0, 0) до (внутрішній w, intern h) підрешітку, вилучимо їх із загальної сітку після вирівнювання обох, виберіть одне випадково з решти і перетворіть ціле число назад у точку, використовуючи divmod<.@% , |~

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.