1 ve 0 adalarını matris içinde bulmak


29

0 ve 1 s iki boyutlu bir matris verildi. Komşuların sadece yatay ve dikey olduğu 1'ler ve 0lar için ada sayısını bulun.

Given input:

1 1 1 0
1 1 1 0

output = 1 1
Number of 1s island = 1

xxx-
xxx-

Number of 0s island = 1 

---x
---x

------------------------------

Given input:

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

output = 2 2
Number of 1s island = 2

----
xxxx  <-- an island of 1s
----
xxxx  <-- another island of 1s

Number of 0s island = 2

xxxx  <-- an island
----
xxxx  <-- another island
----

------------------------------

Given input:

1 0 0
0 0 0
0 0 1
output = 2 1
Number for 1's island = 2:

x--  <-- an island of 1s
---
--x  <-- an island of 1s

Number of 0's island = 1:

-xx  \
xxx   > 1 big island of 0s
xx-  / 


------------------------------

Given input:

1 1 0
1 0 0
output = 1 1
Number for 1's island =1 and number of 0's island = 1

------------------------------

Given input:

1 1
1 1
output = 1 0
Number for 1's island =1 and number of 0's island = 0

11
[[1,0];[0,1]]Çapraz bağlantının dahil olmadığından emin olmak gibi bir
testis eklemelisiniz

8
Siparişin belirtildiği sürece çıktının herhangi bir sırada olabileceğini öneriyorum - sipariş vermek için herhangi bir değer
katmıyor

8
Siteye Hoşgeldiniz!
Arnauld,

1
Yorumlarda cevaplananlar, zorluk çerçevesinde açıklığa kavuşturulmalıdır. Ve daha spesifik olarak, gerçekten 0'dan önce 1'i geri döndürmemizi istiyorsanız, açıkça belirtilmesi gerekir.
Arnauld,

4
Önerilen test davası: 11111 / 10001 / 10101 / 10001 / 111112 1
Kevin Cruijssen

Yanıtlar:


16

APL (Dyalog Unicode) , 29 28 bayt SBCS

@ Adám sayesinde -1

{≢∪∨.∧⍨⍣≡2>+/↑|∘.-⍨⍸⍵}¨⊂,~∘⊂

Çevrimiçi deneyin!

⊂,~∘⊂ matris ve olumsuzlama

{ her biri için yapmak

⍸⍵ 1'lerin kod çiftlerinin listesi

+/↑|∘.-⍨ manhattan uzaklık matrisi

2> komşu matris

∨.∧⍨⍣≡ Geçişli kapatma

≢∪ benzersiz satır sayısı


bu gerçekten zekice. Nihai çizginin neden işe yaramasının garanti edildiğini açıklayabilir misiniz - yani, benzersiz satırların neden cevaba eşdeğer olduğunu. ayrıca, "geçişli kapanma" J'lere benziyor ^:_mu?
Jonah

1
@Jonah sohbet gör
ngn

16

J , 57 bayt

,&([:(0#@-.~~.@,)](*@[*[:>./((,-)#:i.3)|.!.0])^:_ i.@$)-.

Çevrimiçi deneyin!

Bu fikir (ve eğlenceli düşünüyorum) inanılmaz derecede basittir nerede onlardan biri, ama yürütme basitlik ... örneğin 0 dolgu ile her yöne orijinal matris kayması ayrıntılı olduğu maskeler bazı mekanik uzunluğu, vardı ((,-)#:i.3) |.!.0.

Muhtemelen bu mekanik uzunluk daha fazla golf oynayabilir ve yarın akşam deneyebilirim, ama şimdi kayığını göndereceğim.

Diyelim ki girişimiz:

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

Aynı büyüklükte bir tamsayı matrisi ile başlıyoruz:

 0  1  2  3
 4  5  6  7
 8  9 10 11
12 13 14 15

Daha sonra her bir hücre için tüm komşularının maksimum değerlerini bulduk ve giriş maskesiyle çarptık:

 0  0  0  0
 8  9 10 11
 0  0  0  0
13 14 15 15

Bu işlemi matris değişmeyi bırakana kadar yineliyoruz:

 0  0  0  0
11 11 11 11
 0  0  0  0
15 15 15 15

Ve sonra benzersiz, sıfır olmayan öğelerin sayısını sayın. Bu bize 1 ada sayısını gösteriyor.

Aynı işlemi 0 ada sayısını bulmak için "giriş 1 eksi" ye uygularız.


3
Bu çok "temiz bir dolgu" mekanizması gibi görünüyor, çok temiz.
Matthieu M.,

7

JavaScript (ES7),  138 ... 107  106 bayt

Bir dizi döndürür [ones, zeros] .

f=(m,X,Y,V=.5,c=[0,0])=>m.map((r,y)=>r.map((v,x)=>V-v|(x-X)**2+(y-Y)**2>1||f(m,x,y,v,r[c[v^1]++,x]=2)))&&c

Çevrimiçi deneyin!

Nasıl?

Özyinelemeli bir işlev kullanıyoruz. İlk arama sırasında 0 ve 1 'i ararız . Ne zaman böyle bir başlangıç ​​noktası bulduğumuzda, karşılık gelen ada sayacını ( c[0] veya c[1] ) arttırır ve benzer bitişik hücrelerin alanını 2 ile doldurmak için özyinelemeli faza gireriz.2 'nin.

Baytları kurtarmak için aynı kod hem kök yinelemede hem de özyinelemeli yinelemelerde kullanılır, ancak biraz farklı davranır.

İlk yineleme sırasında:

  • V=0.5Vv0v=0v=1
  • XY(xX)2+(yY)2(x,y)

Özyinelemeli yinelemeler sırasında:

  • c2c[v ^ 1]++c

Yorumlananlar

f = (                 // f is a recursive function taking:
  m,                  //   m[]  = input binary matrix
  X, Y,               //   X, Y = coordinates of the previous cell, initially undefined
  V = .5,             //   V    = value of the previous cell, initially set to 0.5
                      //          so that the integer part of V - v is 0 for v = 0 or 1
  c = [0, 0]          //   c[]  = array of counters of 1's and 0's islands
) =>                  //          (or an integer when called recursively)
  m.map((r, y) =>     // for each row r[] at position y in m[]:
    r.map((v, x) =>   //   for each value v at position x in r[]:
      V - v |         //     abort if |V - v| ≥ 1
      (x - X) ** 2 +  //     or X and Y are defined and the quadrance between
      (y - Y) ** 2    //     (X, Y) and (x, y)
      > 1 ||          //     is greater than 1
      f(              //     otherwise, do a recursive call to f:
        m,            //       leave m[] unchanged
        x, y,         //       pass the new coordinates
        v,            //       pass the new reference value
        r[c[v ^ 1]++, //       increment c[v ^ 1] (ineffective if c is an integer)
          x           //       and set the current cell ...
        ] = 2         //       ... to 2
      )               //     end of recursive call
    )                 //   end of inner map()
  ) && c              // end of outer map(); return c

Bu kod, yığın taşması nedeniyle yalnızca 1 veya 0 olan 100 * 100 gibi büyük matrislerde çalışmaz.
KB eğlencesi

3
@KBjoy Zorlukta aksi açıkça belirtilmediği sürece, varsayılan kuralımız, temel algoritma herhangi bir girdi için teoride çalıştığı sürece uygulama sınırlarını umursamamızdır. ( İşte bu konuda bir meta yazı , ama muhtemelen bir yerde daha alakalı bir tane var.)
Arnauld

7

Matl , 14 12 bayt

,G@-K&1ZIugs

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

,        % Do twice
  G      %   Push input
  @      %   Push iteration index: first 0, then 1
  -      %   Subtract. This converts 0 and 1 into -1 and 0 in the second iteration 
  K      %   Push 4
  &1ZI   %   Label connected components of matrix using 4-connectedness. Zeros in the
         %   matrix are background. This replaces the nonzeros by 1, 2, 3, ..., where 
         %   each number defines a connected component
  u      %   Unique values. This gives [0; 1; 2; ..., L], where L is the number of
         %   connected components.
  g      %   Convert nonzeros to 1
  s      %   Sum. This gives L, to be output
         % End (implicit).
         % Display stack (implicit)

6

K (ngn / k) , 60 55 51 50 46 bayt

{#?{|/'x*\:x}/2>+/x*x:x-\:'x:(0,#*x)\&,/x}'~:\

Çevrimiçi deneyin!

~:\ girdi ve olumsuzlama çifti

{ }' her biri için

,/x argümanı düzeltmek

&1'ler nerede? - endekslerin listesi

(0,#*x)\ yv ve xs için iki ayrı liste almak için divmod genişliği (giriş)

x-\:'x: eksen başına mesafeleri ∆x ve ∆y

x*x: onları kare

+/ ²x² ve ²y² ekleyin

2> komşu matris

{|/'x*\:x}/ Geçişli kapatma

#? benzersiz satırları say


Cevabınızı gördükten sonra çok memnunum ki bu konuyu K: 'de
çözmeyi

2
@streetster haha, teşekkürler! bu benim hedeflediğim bir etki değil :) aslında insanları (herhangi bir lehçesi) k ve golf öğrenmelerini teşvik etmek istiyorum
ngn

6

Wolfram Dili (Mathematica) , 64 62 bayt

Max@MorphologicalComponents[#,CornerNeighbors->1<0]&/@{#,1-#}&

Çevrimiçi deneyin!

Attinat sayesinde : İki bayt 1<0yerine yazabilir Falseve kaydedebiliriz.

golfsüz versiyonu:

F[M_] := {Max[MorphologicalComponents[M,   CornerNeighbors -> False]], 
          Max[MorphologicalComponents[1-M, CornerNeighbors -> False]]}

Elbette, bir dizi (veya görüntü) alan ve aynı zamanda ada indeksinin yerine morfolojik olarak bağlı her adanın pikselleri ile aynı olan bir Mathematica yerleşimi MorphologicalComponentsvar. Alarak Maxadaların sayısı bu sonucun verir (arka plan sıfır sıfır bırakılır ve ada endeksi başlar 1'de). Bunu dizi için ayrı ayrı yapmamız gerekir (1 ada sayısını verir) ve bir eksi dizi (0 ada sayısını verir). Çapraz komşuların komşular olarak sayılmadığından emin olmak için seçeneğin CornerNeighbors->Falseverilmesi gerekir.


Eşitsizlikler önceliğinden daha yüksek olduğundan -2 baytRule
attinat

5

Python 3, 144 127 bayt

Bu çözüm cv2harika görüntü işleme gücünü kullanıyor. CV'nin daha az harika, süper uzun ve okunabilir yöntem adlarına rağmen, diğer Python cevaplarını da geçiyor!

golfed:

import cv2,numpy as n
f=lambda b:n.amax(cv2.connectedComponents(b*255,0,4)[1])
def g(a):b=n.array(a,n.uint8);print(f(1-b),f(b))

Expanded:

import cv2
import numpy as np

# Finds the number of connected 1 regions 
def get_components(binary_map):
    _, labels = cv2.connectedComponents(binary_map*255, connectivity=4) # default connectivity is 8
    # labels is a 2d array of the binary map but with 0, 1, 2, etc. marking the connected regions
    components = np.amax(labels)
    return components

# Takes a 2d array of 0s and 1s and returns the number of connected regions
def solve(array): 
    binary_map = np.array(input_map, dtype=np.uint8)
    black_regions = get_components(1 - binary_map) # 0s
    white_regions = get_components(binary_map) # 1s
    return (black_regions, white_regions)

Python'a fazla aşina değilim, ama neden açık tartışma isimlerine ihtiyacınız var? Adil değil mi 4yerine connectivity=4ve n.uint8yerine dtype=n.uint8mümkün?
Kevin Cruijssen

@KevinCruijssen, isteğe bağlı argümanları atlarsanız, argüman adlarına ihtiyacınız vardır. Dokümanlara göz attığımda, aslında atlamak zorunda değilim, bu da beni çok fazla bayt kurtarıyor. Teşekkürler!
Daniel

Ah, böyle bir şey olduğunu düşünmüştüm, ancak doktora baktığımda sadece tek bir cv2.connectedComponentsyöntem bulabildim , bu yüzden kafam karışmıştı ve tartışma isimlerine ihtiyaç duymak için farklı bir neden olabileceğini düşündüm. Dediğim gibi, Python'u çok iyi tanımadım. Bundan öğrendiğim tek şey buradan CCGC'de. ;) Fakat diğer isteğe bağlı argümanları atlamak için değişken isimlerini kullanmak mantıklıdır.
Kevin Cruijssen

1
Çok hoş! Burada cv2 modülünü içeren çevrimiçi bir derleyici buldum .
Jitse

5

J , 46 44 43 bayt

@Miles sayesinde -1 bayt

,&#&~.&([:+./ .*~^:_:2>1#.[:|@-"1/~4$.$.)-.

Çevrimiçi deneyin!

testleri ve ,& -.sarıcı @ jonah'ın cevabından çalındı

,& -. Giriş ve olumsuzlamaları için:

4$.$. (y, x) 1'lerin n × 2 matrisi olarak koordinatları

1#.[:|@-"1/~ manhattan mesafeleri: abs (∆x) + abs ()y)

2> komşu matris

[:+./ .*~^:_: Geçişli kapatma

#&~.&( ) benzersiz satır sayısı


1
Eğer uzunluğu oluşturabilirsiniz ve başka byte kaydetmek için eşsiz, yani ,&#&~.kap önlemek için[:
mil

@miles thank you
ngn

3

Retina 0.8.2 , 155 bayt

s`1(.*)
;$1a
}+`(?<=(.)*)(1|;)(.*¶(?<-1>.)*(?(1)$))?(?!\2)[1;]
;$3;
s`0(.*)
:$1b
}+`(?<=(.)*)(0|:)(.*¶(?<-1>.)*(?(1)$))?(?!\2)[0:]
:$3:
\W+(a*)(b*)
$.1 $.2

Çevrimiçi deneyin! Bağlantı, test senaryosunu içerir. Açıklama:

s`1(.*)
;$1a

A varsa 1, değiştirip girişin ;sonuna bir ekleme ayapın, böylece yoldan çekilir.

}+`(?<=(.)*)(1|;)(.*¶(?<-1>.)*(?(1)$))?(?!\2)[1;]
;$3;

Sel daha bitişik 1s ile doldurun ;.

}

Tüm adalar 1s olana kadar tekrarlayın ;.

s`0(.*)
:$1b

A varsa 0, onu değiştirin :ve bgirişin sonuna bir a ekleyin .

+`(?<=(.)*)(0|:)(.*¶(?<-1>.)*(?(1)$))?(?!\2)[0:]
:$3:

Sel daha bitişik 0s ile doldurun :.

}

Tüm adalar 0s olana kadar tekrarlayın :.

\W+(a*)(b*)
$.1 $.2

Ayrı ayrı 1s ve 0s adalarının sayısını sayın .


3

Haskell , 228 227 225 224 bayt

import Data.List
z=zipWith
a!b=div(max(a*a)(a*b))a
l x=z(!)(z(!)x(0:x))$tail x++[0]
s=(\x->length.($x).filter<$>[(>0),(<0)]).nub.(>>=id).(until=<<((==)=<<))((.)>>=id$transpose.map l).z(\i->z(\j x->2^i*j*(2*x-1))[1,3..])[1..]

Çevrimiçi deneyin!

Açıklama:

Bu çözüm için fikir aşağıdaki gibidir: Her hücrede benzersiz değerlere sahip matrisi, pozitif 1ve negatif için başlat 0. Daha sonra her bir hücreyi tekrar komşularıyla karşılaştırın ve eğer komşu aynı işarete ancak daha büyük bir mutlak değere sahip bir sayıya sahipse, hücrenin numarasını komşunun numarasıyla değiştirin. Bu, sabit bir noktaya ulaştığında, bölge sayısı için belirgin pozitif sayıları ve sayı 1için belirgin negatif sayıları sayın .0 .

Kodunda:

s=(\x->length.($x).filter<$>[(>0),(<0)]).nub.(>>=id).(until=<<((==)=<<))((.)>>=id$transpose.map l).z(\i->z(\j x->2^i*j*(2*x-1))[1,3..])[1..]

ön işleme (hücrelere sayı atama), yineleme ve son işleme (hücreleri sayma) ayrılabilir

Ön İşleme

Ön işleme bölümü fonksiyondur

z(\i->z(\j x->2^i*j*(2*x-1))[1,3..])[1..]

Birkaç byte'ı tıraş etmek ziçin kısaltma olarak kullanılır zipWith. Burada yaptığımız şey, iki boyutlu diziyi satırlarda tamsayı indeksleri ve sütunlarda tek tamsayı dizinleri ile sıkıştırmak. Bunu (i,j), formülü kullanarak bir çift tam sayıdan benzersiz bir tam sayı oluşturabileceğimiz için yapıyoruz (2^i)*(2j+1). Eğer için sadece tuhaf tamsayılar üretersek , üç bayt tasarrufu jyaparak hesaplamayı geçebiliriz 2*j+1.

Eşsiz sayı ile, şimdi sadece matristeki değere dayalı bir işaretle çarpmak zorundayız. 2*x-1

tekrarlama

Yineleme tarafından yapılır

(until=<<((==)=<<))((.)>>=id$transpose.map l)

Girdi bir liste listesi biçiminde olduğundan, her satıra komşu karşılaştırması yaparız, matrisi çeviririz, her satırda karşılaştırmayı tekrar yaparız (translasyon nedeniyle daha önce sütunların ne olduğudır) ve tekrar dönüştürür. Bu adımlardan birini gerçekleştiren kod şudur:

((.)>>=id$transpose.map l)

lKarşılaştırma fonksiyonu nerede (aşağıda detaylandırılmıştır) ve transpose.map lkarşılaştırma ve aktarma adımlarının yarısını gerçekleştirir. (.)>>=idArgümanını iki kez gerçekleştirir, \f -> f.fbu durumda operatör öncelik kuralları nedeniyle , amaçsız ve bir bayt daha kısadır.

lyukarıdaki satırda tanımlanmıştır l x=z(!)(z(!)x(0:x))$tail x++[0]. Bu kod (!), listeyi xsağa kaydırılan liste 0:xve sola kaydırılan liste tail x++[0]sırayla sıkıştırmak suretiyle, önce sol komşusu olan ve ardından sağ komşusu olan her hücrede bir karşılaştırma operatörü (aşağıya bakınız) gerçekleştirir . Önceden işlenmiş matriste asla bulunamadıkları için kaydırılmış listeleri doldurmak için sıfırları kullanırız.

a!bBunun üstündeki satırda tanımlanmıştır a!b=div(max(a*a)(a*b))a. Burada yapmak istediğimiz, aşağıdaki durum ayrımıdır:

  • Eğer sgn(a) = -sgn(b)matristeki iki zıt alanımız varsa ve onları birleştirmek istemiyorsak, o zaman adeğişmeden kalır.
  • Öyleyse sgn(b) = 0, byastığın olduğu ve bu nedenle adeğişmeden kalan köşe kılıfına sahibiz.
  • Eğer sgn(a) = sgn(b)bu iki alanı birleştirmek ve mutlak değeri en büyük olanı almak istiyoruz (kolaylık uğruna).

Not sgn(a)olamaz 0. Bunu, verilen formülle başardık. Belirtileri varsa ave bfarklılık a*bise, az ya da sıfır eşit a*asıfırdan her zaman büyüktür biz maksimum ve böl olarak almak, böylece ageri almak için a. Aksi takdirde, max(a*a)(a*b)bir abs(a)*max(abs(a),(abs(b))ve bu bölerek a, bundan elde sgn(a)*max(abs(a),abs(b))büyük bir mutlak değere sahip numarası olan.

Fonksiyonu ((.)>>=id$transpose.map l)sabit bir noktaya gelinceye kadar yinelemek için (until=<<((==)=<<)), bu stackoverflow yanıtından alınan kullanın .

Rötuş

Postprocessing için bu kısmı kullanıyoruz

(\x->length.($x).filter<$>[(>0),(<0)]).nub.(>>=id)

Bu sadece bir adımlar topluluğudur.

(>>=id)listeler listesini tek bir listeye yerleştirir, nubçiftlerden kurtulur (\x->length.($x).filter<$>[(>0),(<0)]), listeyi bir çift listeye ayırır, biri pozitif, diğeri negatif sayılar için hesaplar ve uzunluklarını hesaplar.


2

Java 10, 359 355 281 280 261 246 bayt

int[][]M;m->{int c[]={0,0},i=m.length,j,t;for(M=m;i-->0;)for(j=m[i].length;j-->0;)if((t=M[i][j])<2)c[t^1]+=f(t,i,j);return c;}int f(int v,int x,int y){try{if(M[x][y]==v){M[x][y]|=2;f(v,x+1,y);f(v,x,y+1);f(v,x-1,y);f(v,x,y-1);}}finally{return 1;}}

-NahuelFouilleul sayesinde -74 bayt .

Çevrimiçi deneyin.

Açıklama:

int[][]M;              // Integer-matrix on class-level, uninitialized

m->{                   // Method with integer-matrix parameter and integer-array return-type
  int c[]={0,0}        //  Counters for the islands of 1s/0s, starting both at 0
      i=m.length,      //  Index of the rows
      j,               //  Index of the columns
      t;               //  Temp-value to decrease the byte-count
  for(M=m;             //  Set the class-level matrix to the input-matrix
      i-->0;)          //  Loop over the rows
    for(j=m[i].length;j-->0)
                       //   Inner loop over the columns
      if((t=M[i][j])   //    Set the temp value `t` to the value of the current cell
         <2)           //    And if this value is a 0 or 1:
        c[t^1]+=       //     Increase the corresponding counter by:
          f(t,i,j);    //      Call the recursive flood-fill method with value `t`
                       //      Which always returns 1 to increase the counter
  return c;}           //  After the nested loops: return the counters-array as result

// Recursive method with value and cell-coordinate as parameters,
// This method will flood-fill the matrix, where 0 becomes 2 and 1 becomes 3
int f(int v,int x,int y){
  try{if(M[x][y]==v){  //   If the cell contains the given value:
    M[x][y]|=2;        //    Fill the cell with 0→2 or 1→3 depending on the value
    f(v,x+1,y);        //    Do a recursive call downwards
    f(v,x,y+1);        //    Do a recursive call towards the right
    f(v,x-1,y);        //    Do a recursive call upwards
    f(v,x,y-1);}       //    Do a recursive call towards the left
  }finally{return 1;}} //  Ignore any ArrayIndexOutOfBoundsExceptions with a finally-return,
                       //  which is shorter than manual checks
                       //  And return 1 to increase the counter

1
-74 bayt , klon kaldırma ve kullanma |=2: 0 -> 2 ve 1 -> 3, ancak >0değiştirildi==1
Nahuel Fouilleul,

üzgünüm testleri kaldırmak zorunda kaldım, böylece tio bağlantısı yorumlara
uyuyordu

@NahuelFouilleul Teşekkürler, kullanarak akıllı |=2! Ve önce kontrol ederek -1 bayt <2yerine hala kullanabiliyordum (ve böylece değiştirildiler , sonra kontrol etmek için kullanıldılar (değiştirildi ).==102<213
Kevin Cruijssen

2

Python 3 , 167 bayt

def f(m):
 n=[0,0];i=-2
 for r in m:
  j=0;i+=1
  for c in r:n[c^1]+=1-((i>=0)*(m[i][j]==c)*(1+({*r[:j]}=={c})*({*m[i][:j]}=={c^1}))or(j>0)*(r[j-1]==c));j+=1
 print(n)

Çevrimiçi deneyin!


Python 2 , 168 bayt

def f(m):
 n=[0,0];i=-2
 for r in m:
	j=0;i+=1
	for c in r:n[c^1]+=1-((i>=0)*(m[i][j]==c)*(1+(set(r[:j])=={c})*(set(m[i][:j])=={c^1}))or(j>0)*(r[j-1]==c));j+=1
 print n

Çevrimiçi deneyin!

Kevin Cruijssen sayesinde -2 bayt

+2 bayt biçimlendirme düzeltmesi

açıklama

0 ve 1 saniye için bir sayaç tutulur. Matristeki her giriş için aşağıdaki eylemler gerçekleştirilir:

  • Geçerli değer için sayacı 1 ile artır
  • Aynı değer doğrudan yukarı veya sola doğru ise, 1 oranında azaltın

Bu gibi sola hizalı durumlar için yanlış pozitif sonuçlanır.

0 0 1
1 1 1

veya

0 1
1 1

Böyle bir durum ortaya çıkarsa, sayaç 1 azalır.

Dönüş değeri [#1, #0]


1
İkinci yorumda belirtilen OP'nin emrin olması gerektiği konusunda korkuyorum [#1, #0]. Bunu zorlamak için biraz anlamsız imo, ama şimdilik bu. Neyse, golf can {not c}için {c^1}, ben değiştirerek belirtilen sorunu gidermek n[c]+=için n[c^1]+=de benzer bir konuda. Güzel cevap olsa da, benden +1. :)
Kevin Cruijssen

Ah haklısın. Teşekkürler!
Jitse

1

Perl 5 (-0777p ), 110 bayt

Geliştirilmiş olabilir, yerine bir normal ifade kullanır 1ile 3, daha sonra 0birlikte 2.

/
/;$m="(.{@-})?";sub f{($a,$b,$c)=@_;1while s/$b$m\K$a|$a(?=$m$b)/$b/s||s/$a/$b/&&++$c;$c}$_=f(1,3).$".f(0,2)

TIO


1

Jöle , 44 36 bayt

ŒJfⱮ+€¥Ø.,UŻ¤œịƇþ,¬$¹ƇfƇⱮ`ẎQ$€QƲÐL€Ẉ

Çevrimiçi deneyin!

Argüman olarak tamsayı listelerinin bir listesini kabul eden ve bu sırayla 1 ve 0 adalarının bir listesini veren monadik bir bağlantı.

açıklama

Aşama 1

Her birinin komşusunun indeksleri sağa (sağ tarafta değilse) ve aşağı (altta değilse) olan tüm matris indekslerinin listesini oluşturun

ŒJ            | Multi-dimensional indices (e.g. [1,1],[1,2],[1,3],[2,1],[2,2],[2,3])
      ¥       | Following as as a dyad:
  fⱮ          | - Filter the indices by each of:
    +€      ¤ |   - The indices added to the following
       Ø.     |     - 0,1
         ,U   |     - Paired with itself reversed [0,1],[1,0]
           Ż  |     - Prepended with zero 0,[0,1],[1,0]

Adım 2

Girdide 1 veya 0 olup olmadığını bu endeksleri bölün. 1 saniye için komşulardan biri, 0 saniye için başka bir dizin listesi döndürür.

  Ƈþ   | Filter each member of the output of stage 1 using the following criteria:
œị   $ | - Corresponding value for the multi-dimensional indices in each of the following as a monad:
   ,¬  |   - The input paired with its inverse

Aşama 3

Üyeleri ortak listelerde ve çıkış sayımlarında birleştirin

           ƲÐL€  | For each of the outputs from stage 2, do the following as a monad and repeat until no changes
¹Ƈ               | - Filter out empty lists (only needed on first pass through but included here to save a byte)         
  fƇⱮ`           | - Take each list of indices and filter the list of indices for those containing a match for any of them
        $€       | - For each resulting list of lists:
      Ẏ          |   - Tighten (concatenate top level of lists)
       Q         |   - Uniquify
          Q      | - Uniquify
               Ẉ | Finally output the lengths of the final lists

1

T-SQL 2008, 178 bayt

Giriş bir tablo değişkenidir.

x ve y koordinatlardır

v, 0 ve 1 değerleridir (diğer sayısal değerleri de kullanabilir)

Bu örnekte kullanılan test verileri:

100
000
001
DECLARE @ table(x int, y int, v int)

INSERT @ values
(1,1,1),(1,2,0),(1,3,0),
(2,1,0),(2,2,0),(2,3,0),
(3,1,0),(3,2,0),(3,3,1)
SELECT*,y-x*99r INTO # FROM @
WHILE @@rowcount>0UPDATE #
SET r=b.r
FROM #,# b
WHERE abs(#.x-b.x)+abs(#.y-b.y)=1and #.v=b.v and #.r>b.r
SELECT v,count(distinct r)FROM #
GROUP BY v

Çevrimiçi deneyin


1

R , 194 172 bayt

function(m,u=!1:2){for(i in 1:2){w=which(m==i-1,T)
N=1:nrow(w)
A=!!N
for(s in N){u[i]=u[i]+A[s]
while(any(s)){A[s]=F
s=c(N[as.matrix(dist(w))[s[1],]==1&A],s[-1])}}}
rev(u)}

Çevrimiçi deneyin!

Matrisin her bir hücresinden başlayarak 1'e (veya sıfıra) eşit bir derinlik ilk arama yapın.

  • @Giuseppe sayesinde -2 bayt
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.