Як далеко від зовнішності?


15

Візьміть 2D область простору, розділену на осі, вирівняні квадратними елементами, їх центри вирівняні через цілі інтервали. Кажуть, що край є внутрішнім, якщо він розділений двома елементами, інакше це зовнішній край.

Ваша мета - знайти мінімальну кількість сусідніх елементів, які необхідно пройти, щоб досягти зовнішнього краю, починаючи від центру кожного елемента, відомого як " traversal distanceабо" distance. Ви можете проходити лише через край (тобто відсутність різання кута / діагоналі). Зауважте, що "зовнішні елементи" (елементи, що мають принаймні один зовнішній край) вважаються необхідними для проходження 0сусідніх елементів для досягнення зовнішнього краю.

Вхідні дані

Вхід - це список невід’ємних цілих парних координат, що позначають (x, y) центр усіх елементів. Передбачається, що елементів, що перекриваються, немає (тобто пара x / y однозначно ідентифікує елемент). Ви можете не припускати нічого про порядок введення елементів.

Ви можете перетворити початок введення даних у будь-яке місце (наприклад, 0,0 або 1,1 тощо).

Ви можете припустити, що всі вхідні елементи підключені, або іншими словами, можна переходити від будь-якого одного елемента до будь-якого іншого елемента, використовуючи правила, наведені вище. Зауважте, що це не означає, що 2D область просто пов'язана; він може мати отвори всередині нього.

Приклад: нижче наведено недійсний ввід.

0,0
2,0

введіть тут опис зображення

перевірка помилок не потрібна.

Вхід може бути з будь-якого джерела (файл, stdio, параметр функції тощо)

Вихідні дані

На виході повинен бути список координат, що ідентифікують кожен елемент, і відповідне ціле відстань, пройдене, щоб дістатися до краю. Вихід може бути в будь-якому бажаному порядку елементів (наприклад, вам не потрібно виводити елементи в тому ж порядку, що приймаються як входи).

Вихід може бути до будь-якого джерела (файл, stdio, значення повернення функції тощо)

Будь-який вихід, який відповідає координаті елемента з його зовнішньою відстані, добре, наприклад, все це добре:

x,y: distance
...

[((x,y), distance), ...]

[(x,y,distance), ...]

Приклади

Приклади тексту вкладаються у формі x,yз одним елементом на рядок; Ви можете змінити це в зручний формат введення (див. правила введення формату).

Текстові приклади виводів у форматі x,y: distanceз одним елементом на рядок; знову ж таки, вам пропонується переробити це у зручний формат виходу (див. правила виведення формату).

Графічні фігури мають нижню ліву межу як (0,0), а цифри всередині представляють очікувану мінімальну пройдену відстань для досягнення зовнішнього краю. Зауважте, що ці цифри суто для демонстрації; вашій програмі не потрібно їх виводити.

Приклад 1

вхід:

1,0
3,0
0,1
1,2
1,1
2,1
4,3
3,1
2,2
2,3
3,2
3,3

Вихід:

1,0: 0
3,0: 0
0,1: 0
1,2: 0
1,1: 1
2,1: 0
4,3: 0
3,1: 0
2,2: 1
2,3: 0
3,2: 0
3,3: 0

графічне зображення:

введіть тут опис зображення

Приклад 2

вхід:

4,0
1,1
3,1
4,1
5,1
6,1
0,2
1,2
2,2
3,2
4,2
5,2
6,2
7,2
1,3
2,3
3,3
4,3
5,3
6,3
7,3
8,3
2,4
3,4
4,4
5,4
6,4
3,5
4,5
5,5

вихід:

4,0: 0
1,1: 0
3,1: 0
4,1: 1
5,1: 0
6,1: 0
0,2: 0
1,2: 1
2,2: 0
3,2: 1
4,2: 2
5,2: 1
6,2: 1
7,2: 0
1,3: 0
2,3: 1
3,3: 2
4,3: 2
5,3: 2
6,3: 1
7,3: 0
8,3: 0
2,4: 0
3,4: 1
4,4: 1
5,4: 1
6,4: 0
3,5: 0
4,5: 0
5,5: 0

графічне зображення:

введіть тут опис зображення

Приклад 3

вхід:

4,0
4,1
1,2
3,2
4,2
5,2
6,2
8,2
0,3
1,3
2,3
3,3
4,3
5,3
6,3
7,3
8,3
9,3
1,4
2,4
3,4
4,4
5,4
6,4
7,4
8,4
9,4
2,5
3,5
4,5
5,5
6,5
9,5
10,5
11,5
3,6
4,6
5,6
9,6
10,6
11,6
6,7
7,7
8,7
9,7
10,7
11,7

вихід:

4,0: 0
4,1: 0
1,2: 0
3,2: 0
4,2: 1
5,2: 0
6,2: 0
8,2: 0
0,3: 0
1,3: 1
2,3: 0
3,3: 1
4,3: 2
5,3: 1
6,3: 1
7,3: 0
8,3: 1
9,3: 0
1,4: 0
2,4: 1
3,4: 2
4,4: 2
5,4: 2
6,4: 1
7,4: 0
8,4: 0
9,4: 0
2,5: 0
3,5: 1
4,5: 1
5,5: 1
6,5: 0
9,5: 0
10,5: 0
11,5: 0
3,6: 0
4,6: 0
5,6: 0
9,6: 0
10,6: 1
11,6: 0
6,7: 0
7,7: 0
8,7: 0
9,7: 0
10,7: 0
11,7: 0

графічне зображення:

введіть тут опис зображення

Оцінка балів

Це код гольфу. Виграє найкоротший код у байтах. Застосовуються стандартні лазівки. Будь-які вбудовані модулі, крім тих, які спеціально розроблені для вирішення цієї проблеми, дозволені.


Чи можемо ми вивести як [((1,0), 0), ...]?
lirtosiast

@lirtosiast так
helloworld922

1
У своїх прикладах ви не чітко вказуєте дані.
Дейл Джонсон

@DaleJohnson просто візьміть перші два стовпці кожного введення тексту для пар x, y. Я не додав окремого поля цитат лише для входів, оскільки, здавалося, він стає трохи довгим. Чи є спосіб додати кошик і вручну обмежити його вертикальну висоту?
helloworld922

знайти мінімальну кількість сусідніх елементів, які необхідно пройти, щоб досягти зовнішнього краю Починаючи звідки? І чи можете ви додати результат у тестових кесах?
Луїс Мендо

Відповіді:


2

MATLAB / Octave, 143 байти

function [v,x,y]=d(x,y)R=S=zeros(max(y+3),max(x+3));i=sub2ind(size(S),y+2,x+2);S(i)=1;while nnz(S=imerode(S,strel('disk',1,0)))R+=S;end;v=R(i);

Безумовно

function [v,x,y]=d(x,y)
  R=S=zeros(max(y+3),max(x+3));
  i=sub2ind(size(S),y+2,x+2);
  S(i)=1;
  while nnz(S=imerode(S,strel('disk',1,0)))
    R+=S;
  end;
  v=R(i);

Пояснення

Створіть матриці S ource та R esult відповідного розміру, заповнені нулями.

R=S=zeros(max(y+3),max(x+3));

Обчисліть лінійні індекси, що відповідають xy-парам, з прокладкою на кордоні одним елементом.

i=sub2ind(size(S),y+2,x+2);

Намалюйте структуру.

S(i)=1;

Sпоказано тут для прикладу 2 :

0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   1   0   0   0   0   0
0   0   1   0   1   1   1   1   0   0   0
0   1   1   1   1   1   1   1   1   0   0
0   0   1   1   1   1   1   1   1   1   0
0   0   0   1   1   1   1   1   0   0   0
0   0   0   0   1   1   1   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0

Видаліть усі рамкові елементи за допомогою ерозії зображення

S=imerode(S,strel('disk',1,0))

використовуючи диск структуризуючого елемента з радіусом 1 :

0   1   0
1   1   1
0   1   0

Якщо дозволено рух по діагоналі, ми б замість цього використали прямокутник:

1   1   1
1   1   1
1   1   1

Потім збільшують результат для всіх безмежних елементів

R+=S;

і петлю, поки зображення повністю не зірветься.

while nnz(S)

Повертайте результат для кожного xy-пара.

v=R(i);

2

Pyth, 26 байт

V]MQNf>*4Nl=Nsmfq1.a,dYQN0

Приклад 2

Я використовував вихідний формат:

[[4, 3]]
2

Тобто список, що містить крапку з подальшим відстанню від зовнішності.

Код працює, використовуючи набраний на даний момент набір, для кожної точки фільтруючи вхід для всіх точок точно на відстані 1 від цієї точки і перевіряючи, чи отримана кількість очок у 4 рази більше стартового числа, і повторюється, поки не буде . Якщо почати в заданій точці, це дає наскільки далеко ця точка знаходиться від зовнішньої сторони.


2

MATL , 38 37 36 33 байт

1Z?t"tX@<~5Bt!Z~2X53$Y+4=+]3#fqhh

Для цього використовується поточна версія (15.0.0) мови / компілятора.

Формат введення: один масив зі значеннями x та один масив зі значеннями y . Вхід і вихід на основі 1. Отже, тестові приклади мають такі входи:

[2 4 1 2 2 3 5 4 3 3 4 4]
[1 1 2 3 2 2 4 2 3 4 3 4]

[5 2 4 5 6 7 1 2 3 4 5 6 7 8 2 3 4 5 6 7 8 9 3 4 5 6 7 4 5 6]
[1 2 2 2 2 2 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 5 5 5 5 5 6 6 6]

[5 5 2 4 5 6 7 9 1 2 3 4 5 6 7 8 9 10 2 3 4 5 6 7 8 9 10 3 4 5 6 7 10 11 12 4 5 6 10 11 12 7 8 9 10 11 12]
[1 2 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 7 7 7 7 7 7 8 8 8 8 8 8]

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

Пояснення

Матриця спочатку будується з 1 на вхідних положеннях, а 0 - в іншому випадку. Тоді застосовується згортання з маскою "Північ, Схід, Південь, Захід" ( [0 1 0; 1 0 1; 0 1 0]), і результат у кожній позиції порівнюється з 4. Результат 4 означає, що ця позиція оточена іншими точками, і так має відстань- до зовнішньої, принаймні 1. Результат (0 або 1 для кожної точки) додається до вихідної матриці. Ці позиції тепер містять 2 (в кінці процесу матриця зменшиться на 1).

Процес згортання повторюється. Для наступної ітерації входом згортки є накопичена матриця з порогом 2; тобто значення, менші ніж 2, встановлюються 0. Результат згортки вказує, які точки мають відстань принаймні 2 (усі їхні сусіди мають відстань 1).

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

В кінці процесу 1 віднімається від результату, оскільки позиції зі значенням k мають відстань k -1 до зовнішньої. Координати та значення всіх позицій витягуються та відображаються.

           % take x and y implicitly
1          % push 1
Z?         % build sparse matrix from that x, y indices with 1 as value
t          % duplicate
"          % for each column of that matrix
  t        %   duplicate
  X@       %   push iteration index
  <~       %   true for matrix entries that are >= iteration index
  5B       %   5 in binary: row vector [1 0 1]
  t!       %   duplicate and transpose into a column vector
  Z~       %   element-wise XOR with broadcast: gives desired mask,
           %   [0 1 0; 1 0 1; 0 1 0]
  2X53$Y+  %   2D convolution. Output has same size as input
  4=       %   compare with 4: are all neighbouring positions occupied?
  +        %   add to accumulated matrix from previous iteration
]          % end for each
3#f        % extract row index, column index and value for nonzero
           % entries. In this case all entries are nonzero
q          % subtract 1 to value to yield distance to exterior
hh         % concatenate vertically twice
           % display implicitly 

1

Пітон 3, 180 166 160 байт

def f(l,d=0):
 l=set(l);
 if l:i={(a,b)for a,b in l if all([x in l for x in[(a+1,b),(a-1,b),(a,b+1),(a,b-1)]])};return{(c,d)for c in l-i}|f(i,d+1)
 return set()

Ми знаємо, що якщо в координаті менше чотирьох сусідів, вона повинна бути на «зовнішній стороні». Тому ми можемо неодноразово роздягати зовнішні осередки і призначати їм відстань, рівне кількості ітерацій / глибини рекурсії в цьому випадку.

Безумовно, думаю, що є місце для вдосконалення. Який найкращий спосіб перевірити сусідніх сусідів?

редагувати: мені слід дозволити приймати список пар як кортежі.


0

PHP, 316 байт

<?preg_match_all("#^(\d+),(\d+)#m",$_GET[i],$t);foreach($t[1]as$k=>$v)$a[$v][$t[2][$k]]=0;function w($x,$y){global$a;return isset($a[$x][$y])?$a[$x][$y]:-1;};for(;$z++<max($t[2]);$o=$s,$s="")foreach($a as$x=>$b)foreach($b as$y=>$c)$s.="\n$x,$y: ".$a[$x][$y]=1+min(w($x+1,$y),w($x-1,$y),w($x,$y-1),w($x,$y+1));echo$o;

Інтернет-версія

Зламатися

preg_match_all("#^(\d+),(\d+)#m",$_GET[i],$t); 
foreach($t[1]as$k=>$v) 
$a[$v][$t[2][$k]]=0;  # make a 2 D array
function w($x,$y){global$a;return isset($a[$x][$y])?$a[$x][$y]:-1;};# check the neighbours
for(;$z++<max($t[2]);$o=$s,$s="") # stored the last loop string first run make possible to 1 and so on
foreach($a as$x=>$b) # x values
foreach($b as$y=>$c) # y values
$s.="\n$x,$y: ".$a[$x][$y]=1+min(w($x+1,$y),w($x-1,$y),w($x,$y-1),w($x,$y+1)); # concanate array item x+y+value
echo$o; #Output

Візуалізуйте як символи Ascii

ksort($a); 
foreach($a as$x=>$b){
for($y=0;$y<=max($t[2]);$y++)
echo isset($a[$x][$y])?$a[$x][$y]:" ";
#The better way would be make a SVG and use the text element and use a factor
#echo '<text x="'.($x*$factor).'" y="'.($y*$factor).'">'.$a[$x][$y].'</text>';
echo"\n";}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.