Bir asma tanımak


31

Arka fon

Bir sürü eski ve grenli siyah-beyaz görüntülerim var. Bazıları duvara tırmanan sarmaşıkları gösteriyor, diğerleri yok - senin görevin onları benim için sınıflandırmak.

Giriş ve çıkış

İşletme giriş bit dikdörtgen 2B dizi bir uygun olan herhangi bir biçimde verilmiştir. Boş olmayacak, ancak hem 0 hem de 1 içermesi garanti edilmez. Aşağıdaki koşullar geçerli olursa, dizi bir asma gösteriyor:

  • A'nın alt sırası en az bir 1 içerir. Bunlar asmanın kökleridir.
  • A'daki her 1 , yalnızca sola, sağa ve aşağı giden (yukarı değil, çapraz olarak değil) 1 s'lik bir yolla alt satıra bağlanır. Bu yollar asmanın dallarıdır.

Girdi bir asma gösteriyorsa çıktınız tutarlı bir gerçek değer, aksi takdirde tutarlı bir sahte değerdir.

Örnekler

Bu dizi bir asma gösteriyor:

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

Bu girdi bir asma göstermez, çünkü sağ sınırın ortasında bir dal tarafından köklere bağlı olmayan bir 1 vardır:

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

All-0 dizisi hiçbir zaman bir asma çizmez, ancak all-1 dizisi her zaman yapar.

Kurallar ve puanlama

Tam bir program veya bir fonksiyon yazabilirsiniz. En düşük bayt sayısı kazanır ve standart boşluklar izin verilmez.

Test durumları

Truthy girişleri:

1

0
1
1

01
11

0000
0111
1100
1001

1111
1111
1111
1111

001001
011001
010111
110101
011101
001011

1011011
1001001
1111111
0100000
0111111
1111001
1001111
1111101

0000000
0011100
0010100
0011100
0001000
1111111
0001000
0011100
0010100
0010100

Sahte girişler:

0

1
0

10
01

000
000
000

011
110
000

111111
000000
101011
111001

010010
001000
000010
110001

001100
111111
110101
010011
111011

000110
010111
010101
011110
001101

11000000
10110001
10011111
11110001
01100011
00110110
01101100
01100001
01111111

1
Asmanın aşağı doğru büyüyemeyeceğini, bir grafiğin bağlı bileşenlerini kullanarak hoş bir fikri olduğunu fark etmemişti ...
swish

@swish Bütün bunlar sırayla her sıranın kaldırılmasının altta 1s çizgisine bağlı bir grafikle sonuçlanmaya devam etmesi gerektiğidir.
Neil

Yanıtlar:


26

Salyangozlar , 25 19 17 bayt

&
\0z),(\1dlr)+d~

Çevrimiçi deneyin!

açıklama

Salyangoz, başlangıçta 2D desen eşleştirme dili tasarım mücadelemiz için geliştirilen regex'ten esinlenilmiş bir 2D desen eşleştirme dilidir .

&Markaları Salyangoz mümkün olan her başlangıç pozisyonuna ve baskılar desen denemek 0veya 1desen hepsi kendilerine veya kibrit herhangi başarısız olmasına göre.

Şimdi Salyangozlar gizli parantezlerle çalışabilir, bu nedenle desen aşağıdakiler için kısadır:

(\0z),(\1dlr)+d~

,Bir görevi görür *düzenli ifade oysa (yani, sıfır ya da daha fazla kez eşleşen)+ düzenli ifade (bir ya da daha fazla kez eşleşen) ile aynıdır. Böylece, bir taneyle eşleşen ve ardından salyangozun yönünü keyfi bir şekilde sıfırlamasına olanak tanıyan, \0zgerektiği kadar eşleştirerek başlıyoruz . Bu, geçerli bir asma hücresinin başka bir yerde bulunabilmesi koşuluyla, girişteki sıfırlara izin verir.0z

Sonra en az bir tane eşleştiriyoruz \1dlr , eşleşiriz ki bu, tek bir eşleşir 1ve ardından salyangozun yönünü aşağı, sola veya sağa sıfırlamasını sağlar. Başladığımız hücrede bir tane varsa, 1sadece bu kısmı eşleştirdiğimizi unutmayın. Temel olarak salyangozun bir daldan dallara kök salınımını sağlar.

Son olarak, sınır dışı bir hücreyi ( ~) aşağıdan ( d) arayarak yere ulaştığımızdan emin olmalıyız .


1
Herkesin belgeleri izleyebildiğine şaşırdım :)
feersum

3

JavaScript (ES6), 135 bayt

s=>s.replace(/^[^1]*\n/,``).split`
`.map(s=>+`0b${s}`).reverse(g=(n,m,o=(m<<1|m|m>>1)&n)=>n-m?o-m&&g(n,o):n).reduce((m,n,i)=>g(n,n&m))

Not: Tam sayı türündeki sınırlamalar nedeniyle, yalnızca 31 karakter genişliğindeki asmalar için çalışır. Açıklama: Her bir satır, bağlantı noktalarını belirlemek için bitişik sıra ile bittikçe ANDED yapılır ve daha sonra ggenişleyemez hale gelinceye kadar işlevi tekrarlı olarak yatay olarak genişletmek için kullanılır. Örneğin, iki bitişik satır 1110111ve 1011100sonra bağlantı noktaları ise 1010100ve bu daha sonra genişler 1110110ve daha 1110111sonra sıranın bağlı olduğunu bulur. Eğer gfonksiyon başarısız olursa, sonraki tüm gfonksiyonların da başarısız olmasına neden olan sıfırı döndürür ve sonuç hatalı olur. gİşlev başarılı olursa, reducesonraki satırı test etmek için içinden geçirilen yeni satırı döndürür .

s=>s.replace(/^[^1]*\n/,``)         Remove irrelevant leading "blank" rows
    .split`\n`                      Split into lines
    .map(s=>+`0b${s}`)              Convert into binary
    .reverse(                       Process from bottom to top
     g=(n,m,o=(m<<1|m|m>>1)&n)=>     Expand row horizontally
      n-m?o-m&&g(n,o):n)             Check whether rows are connected
    .reduce((m,n,i)=>g(n,n&m))      Check all rows

31 karakterin yeterince geniş olduğuna ve bu yaklaşımın geçerli olduğuna karar vereceğim.
Zgarb

2

Python 2,254 bayt

Kütüphane yok

def f(A,r=0,c=-1):
 B=A[r];R=len(A)-1;C=len(B);i=1 in A[R]
 if c<0:
    for j in range(R*C+C):
        if A[j/C][j%C]:i&=f(A,j/C,j%C)
    return i&1
 _=B[c];B[c]=0;i=_&(r==R)
 if _:
    if c>0:i|=f(A,r,c-1)
    if r<R:i|=f(A,r+1,c)
    if c<C-1:i|=f(A,r,c+1)
 B[c]=_;return i

İkinci ve üçüncü seviye girintilerinin bayt sayısındaki sekmelerden oluştuğunu unutmayın.

Çevrimiçi deneyin


1

Wolfram - 254

Bu işi yapmak için biraz zaman harcayın, bu yüzden sadece burada bırakacağım:

f[s_]:=(
v=Characters@StringSplit@s;
{h,w}=Dimensions@v;
g=GridGraph@{w,h};
r=First/@Position[Flatten@v,"0"];
g=VertexDelete[Graph[VertexList@g,
EdgeList@g/.x_y_/;Abs[x-y]>1yx],r];
v=VertexList@g;
v≠{}∧v~Complement~VertexOutComponent[g,Select[v,#>w h-w&]]{}
)

Temel olarak, yönlendirilmiş kenarları yukarı dönük olarak bir ızgara grafiği yapıyorum, 0'lara karşılık gelen köşeleri kaldırın, alt köşe bileşenlerinin tüm köşeleri içerdiğini kontrol edin. Saçma, biliyorum ...


2
Bu neden rekabet etmiyor?
Downgoat

1
Şu anda bunu "cevap değil" olarak değerlendiririz çünkü golf oynanmaz. Gereksiz boşlukları kaldırır ve bir bayt sayısı eklerseniz, bunun rekabet etmemesi için bir neden göremiyorum.
Alex A. 0

0

Python + NumPy 204 202 195 Bayt

from numpy import*
def f(A):
 r,c=A.shape
 z,s=zeros((r,1)),array([0,2,c+3])
 B=hstack((z,A,z)).flat
 for i in range(1,(r-1)*(c+2)):
    if B[i]and not any(B[s]):return 1<0
    s+=1
 return any(B[i:])

Beklediğini A2D numpy dizisi olmaya.

Matrisi alır, sıfır sütunları sola ve sağa kaydırır ve matrisi düzleştirir. ssol, sağ ve alt elemana işaret eden bir şablondur. Döngü, her satırın son satır dışında olup olmadığını kontrol eder 1ve şablonun en az biri, aksi takdirde 1döner False. Ardından, son satırın içerip içermediğini kontrol edin 1.

Sizin için iki test penceresi:

I1 = '001001\n011001\n010111\n110101\n011101\n001011'
A1 = array([int(c) for c in I1.replace('\n','')]).reshape(6,6)
print f(A1) #True

I2 = '001100\n111111\n110101\n010011\n111011'
A2 = array([int(c) for c in I2.replace('\n','')]).reshape(5,6)
print f(A2) #False

Düzenleme1: 1<0kısaFalse

Edit2: döngüdeki ikinci girinti için tabülatörlere ve bunları kullanmaya flatiyi bir alternatifflatten()

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.