Dışarıdan ne kadar uzak?


15

Eksenleri hizalanmış birim kare öğelerine bölünmüş 2B bir alan, merkezleri tamsayı aralıklarında hizalanmış olarak alın. Bir kenarın iki eleman tarafından paylaşılması durumunda dahili olduğu söylenir, aksi takdirde bir dış kenardır.

Amacınız, her bir elemanın merkezinden başlayarak traversal distanceveya distancekısa olarak adlandırılan bir dış kenara ulaşmak için geçilmesi gereken minimum komşu eleman sayısını bulmaktır . Sadece bir kenardan geçebilirsiniz (yani köşe kesme / diyagonal hareket yok). "Dış elemanlar" ın (en az bir dış kenarı olan elemanlar) 0bir dış kenara ulaşmak için komşu elemanlardan geçmesi gerektiği düşünülmektedir .

Giriş

Girdi, tüm öğelerin merkezini (x, y) gösteren negatif olmayan bir tam sayı çifti koordinatlarının bir listesidir. Üst üste binen eleman olmadığı varsayılmaktadır (yani bir x / y çifti bir elemanı benzersiz olarak tanımlamaktadır). Sen olabilir değil eleman girdi sipariş hakkında bir şey varsayalım.

Girişin kaynağını herhangi bir konuma (örneğin 0,0 veya 1,1 vb.) Dönüştürebilirsiniz.

Tüm giriş öğelerinin bağlı olduğunu veya başka bir deyişle yukarıdaki kuralları kullanarak herhangi bir öğeden başka bir öğeye seyahat etmek mümkün olduğunu varsayabilirsiniz. Bunun 2D bölgesinin basitçe bağlandığı anlamına gelmediğini unutmayın; içinde delikler olabilir.

Örnek: Aşağıdaki geçersiz bir giriş.

0,0
2,0

resim açıklamasını buraya girin

hata kontrolü gerekli değildir.

Giriş herhangi bir kaynaktan olabilir (dosya, stdio, fonksiyon parametresi, vb.)

Çıktı

Çıktı, her bir öğeyi tanımlayan koordinatların ve bir kenara ulaşmak için kat edilen karşılık gelen tamsayı mesafesinin bir listesi olmalıdır. Çıktı istenen herhangi bir eleman sırasına göre olabilir (örneğin, girdi ile aynı sırada çıktı elemanlarına ihtiyacınız yoktur).

Çıktı herhangi bir kaynağa olabilir (dosya, stdio, işlev dönüş değeri, vb.)

Öğenin dış mesafesiyle koordinatıyla eşleşen tüm çıktılar iyi, örneğin, bunların hepsi iyi:

x,y: distance
...

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

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

Örnekler

Metin örneği girişleri, x,yher satırda bir öğe olacak şekilde formdadır ; bunu uygun bir giriş biçiminde yeniden şekillendirebilirsiniz (giriş biçimi kurallarına bakın).

Metin örneği çıktıları, x,y: distanceher satırda bir öğe olacak şekilde formattadır ; yine, bunu uygun bir çıkış biçiminde yeniden şekillendirebilirsiniz (çıkış biçimi kurallarına bakın).

Grafik rakamlar (0,0) olarak sol alt sınırlıdır ve içerideki sayılar bir dış kenara ulaşmak için beklenen minimum mesafeyi temsil eder. Bu rakamların yalnızca tanıtım amaçlı olduğunu unutmayın; programınızın bunların çıktısını almasına gerek yoktur.

örnek 1

giriş:

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

Çıktı:

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

grafik gösterim:

resim açıklamasını buraya girin

ÖRNEK 2

giriş:

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

çıktı:

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

grafik gösterim:

resim açıklamasını buraya girin

ÖRNEK 3

giriş:

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

çıktı:

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

grafik gösterim:

resim açıklamasını buraya girin

puanlama

Bu kod golf. Bayt cinsinden en kısa kod kazanır. Standart boşluklar geçerlidir. Bu sorunu çözmek için özel olarak tasarlananlar dışındaki yerleşik yapılara izin verilir.


[((1,0), 0), ...] olarak çıktı alabilir miyiz?
lirtosiast

@lirtosiast yes
helloworld922

1
Örneklerinizde, girdileri açıkça belirtmezsiniz.
Dale Johnson

@DaleJohnson, x, y çiftleri için her metin girişinin ilk iki sütununu alır. Biraz uzun sürüyor gibiydi çünkü sadece girişler için ayrı bir teklif kutusu eklemedim. Bir teklif kutusu eklemenin ve dikey yüksekliğini manuel olarak sınırlandırmanın bir yolu var mı?
helloworld922

bir dış kenara ulaşmak için geçilmesi gereken minimum komşu eleman sayısını bulmak Nereden başlıyor? Ve çıktıyı test kafeslerine ekleyebilir misiniz?
Luis Mendo

Yanıtlar:


2

MATLAB / Oktav, 143 bayt

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

Ungolfed

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

açıklama

Oluşturma S kaynağını bulup ve R sıfırlarla doldurulur uygun büyüklükte esult matrisler.

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

xyKenarlarda bir öğe dolgusu ile-çiftlerine karşılık gelen doğrusal indeksleri hesaplayın .

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

Yapıyı çizin.

S(i)=1;

Sburada Örnek 2 için gösterilmiştir :

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

Görüntü erozyonu ile tüm sınır elemanlarını kaldır

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

yarıçap 1 ile yapılandırma elemanı diskini kullanarak :

0   1   0
1   1   1
0   1   0

Çapraz harekete izin verilmişse, bunun yerine dikdörtgeni kullanırız:

1   1   1
1   1   1
1   1   1

Ardından, tüm kenarlıksız öğeler için sonucu artırın

R+=S;

ve görüntü tamamen aşınıncaya kadar döngü yapın.

while nnz(S)

Her xyçift için sonucu döndür.

v=R(i);

2

Pyth, 26 bayt

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

ÖRNEK 2

Kullandığım çıktı biçimi:

[[4, 3]]
2

Yani, noktayı içeren bir liste, ardından dıştan olan mesafe.

Kod, o anda ulaşılan bir küme kullanılarak çalışır, her nokta için girdiyi o noktadan tam olarak 1 uzaklığa kadar tüm filtreler için filtreler ve elde edilen nokta sayısının başlangıç ​​sayısının 4 katı olup olmadığını kontrol eder ve . Belirli bir noktada başladığında, bu noktanın dıştan ne kadar uzak olduğunu verir.


2

MATL , 38 37 36 33 bayt

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

Bu , dilin / derleyicinin geçerli sürümünü (15.0.0) kullanır .

Girdi biçimi: x değerlerine sahip bir dizi ve y değerlerine sahip bir dizi . Giriş ve çıkış 1 tabanlıdır. Bu yüzden test senaryoları aşağıdaki girişlere sahiptir:

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

Çevrimiçi deneyin!

açıklama

Başlangıçta 1, giriş konumlarında 1 ve aksi halde 0 olan bir matris oluşturulur. Daha sonra "Kuzey, Doğu, Güney, Batı" maskesi ( [0 1 0; 1 0 1; 0 1 0]) ile bir kıvrım uygulanır ve her bir konumdaki sonuç 4 ile karşılaştırılır. 4'ün bir sonucu, bu konumun diğer noktalarla çevrili olduğu ve böylece Sonuç (her nokta için 0 veya 1) orijinal matrise eklenir. Bu pozisyonlar şimdi 2 içerir (işlemin sonunda matris 1 azaltılır).

Evrişim süreci yinelenir. Bir sonraki yineleme için, evrişimin girdisi 2 ile eşiklenmiş birikmiş matristir; yani, 2'den düşük değerler 0'a ayarlanır. Evrişimin sonucu, hangi noktaların en az 2 mesafeye sahip olduğunu gösterir (tüm komşularının mesafesi 1'dir).

Yineleme sayısı, kolaylık sağlamak için girdi matrisinin sütun sayısı olarak seçilir. Bu yeterlidir (aslında, gereken maksimum yineleme sayısı minimum matris boyutunun yarısıdır). Son iterasyonlar işe yaramayabilir, ancak zarar vermez (tüm noktalara 0 eklerler).

İşlemin sonunda, 1 sonuçtan çıkarılır, çünkü k değeri olan konumlar dışa k -1 mesafesine sahiptir . Tüm konumların koordinatları ve değerleri çıkarılır ve görüntülenir.

           % 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

Piton 3, 180 166 160 bayt

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

Bir koordinatın dörtten az komşusu varsa, bunun "dışta" olması gerektiğini biliyoruz. Bu nedenle, dış hücreleri tekrar tekrar şeritleyebilir ve bu durumda yineleme sayısına / özyineleme derinliğine eşit bir mesafe atayabiliriz.

Kesinlikle iyileştirme için bir yer olduğunu düşünün - Komşu komşuları kontrol etmenin en iyi yolu nedir?

edit: Çiftler listesini tuples olarak kabul etmeme izin verilmeli.


0

PHP, 316 Bayt

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

Çevrimiçi sürüm

Yıkmak

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 karakterleri olarak görselleştirin

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