Знайти острови 1 і 0 в матриці


29

Дано двовимірну матрицю 0 і 1s. Знайдіть кількість островів за 1s та 0s, де сусіди знаходяться лише в горизонтальній та вертикальній точці.

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]]
тестовий зразок, якби

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

8
Ласкаво просимо на сайт!
Арнольд

1
На що відповіли в коментарях, слід уточнити в суті виклику. А точніше, якщо ви дійсно хочете, щоб ми повернули 1 до 0, це має бути чітко зазначено.
Арнольд

4
Рекомендований тестовий випадок: 11111 / 10001 / 10101 / 10001 / 111112 1
Кевін Круїссен

Відповіді:


16

APL (Dyalog Unicode) , 29 28 байт SBCS

-1 завдяки @ Adám

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

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

⊂,~∘⊂ матриця та її заперечення

{ для кожного з них

⍸⍵ список пар коордів 1с

+/↑|∘.-⍨ матриця відстаней на Манхеттені

2> сусідська матриця

∨.∧⍨⍣≡ перехідне закриття

≢∪ кількість унікальних рядів


це справді розумно. Ви могли б детальніше пояснити, чому підсумковий рядок гарантовано працює - тобто чому унікальні рядки еквівалентні відповіді. також, чи "транзитивне закриття" схоже на J ^:_?
Йона

1
@Jonah див. Чат
ngn

16

J , 57 байт

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

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

Це одна з тих, де ідея неймовірно проста (і я вважаю цікавою), але її виконання мала певну механічну довговічність, яка маскує простоту ... наприклад, переміщення оригінальної матриці в усі сторони з 0 заповненням є багатослівним ((,-)#:i.3) |.!.0 .

Можливо, ця механічна довговічність може бути додатково гольф, і я можу спробувати завтра ввечері, але я викладу суть її зараз.

Скажімо, наш внесок:

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

Почнемо з матриці унікальних цілих чисел однакового розміру:

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

Тоді для кожної комірки знаходимо макс усіх її сусідів і множимо на маску введення:

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

Ми повторюємо цей процес, поки матриця не перестане змінюватися:

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

А потім порахуйте кількість унікальних, ненульових елементів. Це говорить нам про кількість 1-х островів.

Ми застосовуємо той самий процес до "1 мінус вхід", щоб отримати кількість 0-островів.


3
Це дуже схоже на механізм "заливки", дійсно акуратний.
Матьє М.

7

JavaScript (ES7),  138 ... 107  106 байт

Повертає масив [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

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

Як?

01c[0]c[1]2 's.

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

Під час першої ітерації:

  • V=0,5V-v0v=0v=1
  • ХY(х-Х)2+(у-Y)2(х,у)

Під час рекурсивних ітерацій:

  • c2c[v ^ 1]++c

Прокоментував

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

Цей код не працює для великих матриць, таких як 100 * 100, із лише 1s або 0s через переповнення стека.
КБ радість

3
@KBjoy Якщо тільки не вказано інше в виклику, наше правило за замовчуванням полягає в тому, що ми не піклуємося про обмеження реалізації, поки базовий алгоритм теоретично працює на будь-який вклад. ( Ось мета-повідомлення про це, але, мабуть, є десь релевантніший.)
Арнольд,

7

MATL , 14 12 байт

,G@-K&1ZIugs

Спробуйте в Інтернеті! Або перевірити всі тестові випадки .

Пояснення

,        % 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

К (нг / к) , 60 55 51 50 46 байт

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

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

~:\ пара введення та його заперечення (буквально: заперечувати ітерацію-конвергент)

{ }' для кожного

,/x вирівняти арг

&де 1s? - перелік індексів

(0,#*x)\ ширина divmod (вхід), щоб отримати два окремих списки для ys і xs

x-\:'x: на осі відстані ∆x і ∆y

x*x: квадрат їх

+/ додати ∆x² та ∆y²

2> сусідська матриця

{|/'x*\:x}/ перехідне закриття

#? рахувати унікальні ряди


Побачивши вашу відповідь, я радий, що не намагався вирішити цю проблему в K :)
streetter

2
@streetster ха-ха, дякую! це не той ефект, який я мав на меті :) Я хотів би заохотити людей вивчати (будь-який діалект) k та гольф в ньому
ngn

6

Мова Вольфрама (Mathematica) , 64 62 байт

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

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

Завдяки attinat : ми можемо писати 1<0замістьFalse і зберігати два байти.

версія без гольфу:

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

Звичайно, є вбудована Mathematica,MorphologicalComponents яка бере масив (або зображення) і повертає те саме з пікселями кожного морфологічно пов'язаного острова, заміненого на острівний індекс. Отримавши Maxцей результат, дається кількість островів (фонові нулі залишаються на нулі, а індекс острова починається з 1). Нам потрібно зробити це окремо для масиву (даючи число 1-острівців) і один мінус масиву (даючи кількість 0-островів). Щоб переконатися, що діагональні сусіди не вважаються сусідами, CornerNeighbors->Falseнеобхідно надати варіант .


-2 байти оскільки нерівності мають більшу перевагу, ніжRule
attinat

5

Пітон 3, 144 127 байт

Це рішення використовує cv2 дивовижну потужність обробки зображень. Незважаючи на менш дивовижні, надзвичайно довгі і читабельні назви резюме, він перемагає і інші відповіді Python!

Гольф:

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

Розширено:

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, але навіщо вам потрібні чіткі назви аргументів? Чи не просто 4замість connectivity=4і n.uint8замість dtype=n.uint8можливого?
Кевін Круїссен

@KevinCruijssen, вам потрібні імена аргументів, якщо ви пропускаєте необов'язкові аргументи. Заглянувши в документи, мені насправді не потрібно пропускати, що економить мені багато байтів. Спасибі!
Даніель

Ну гаразд, я думав, що це щось подібне, але коли я просто переглянув документи, я міг знайти лише один cv2.connectedComponentsметод, тому я розгубився і подумав, що може бути інша причина необхідності імен аргументів. Як я вже сказав, я не надто знайомий з Python. Все, що я навчився від цього, є звідси на CCGC. ;) Але має сенс використовувати імена змінних, щоб пропустити інші необов'язкові аргументи.
Кевін Кройсейсен

1
Дуже хороша! Я знайшов онлайн-компілятор, який включає тут модуль cv2 .
Джитце

5

J , 46 44 43 байт

-1 байт завдяки @miles

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

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

тести та ,& -.обгортка, вкрадена з відповіді @ jonah

,& -. для введення та його заперечення виконайте:

4$.$. (y, x) координати 1s як матриця n × 2

1#.[:|@-"1/~ відстані в Манхеттені: abs (∆x) + abs (∆y)

2> сусідська матриця

[:+./ .*~^:_: перехідне закриття

#&~.&( ) кількість унікальних рядів


1
ви можете скласти довжину та унікальну, щоб зберегти ще один байт, тобто ,&#&~.уникнути обмеження[:
милі

@miles спасибі
СПП

3

Сітківка 0,8,2 , 155 байт

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

Спробуйте в Інтернеті! Посилання включає тестовий випадок. Пояснення:

s`1(.*)
;$1a

Якщо є 1, змініть його ;та додайте aдо кінця введення, щоб він не був у дорозі.

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

Повінь заповнить більше сусідніх 1s ;s.

}

Повторіть, поки всі острови Росії 1 s не перетворилися на ;s.

s`0(.*)
:$1b

Якщо є 0, змініть його на: і додайте а bдо кінця вводу, щоб він не був у дорозі.

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

Затоплення заливається більше сусіднім 0s :s.

}

Повторіть, поки всі острови Росії 0 s не перетворилися на :s.

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

Окремо порахуйте кількість островів 1s і 0s.


3

Haskell , 228 227 225 224 байт

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

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

Пояснення:

Ідея цього рішення полягає в наступному: ініціалізуйте матрицю з унікальними значеннями в кожній комірці, позитивними для 1та негативними для 0. Потім кілька разів порівнюйте кожну клітинку з сусідами і, якщо сусід має той самий знак, але число з більшим абсолютним значенням, замініть номер комірки на номер сусіда. Як тільки це досягне фіксованої точки, підрахуйте кількість чітких додатних чисел для кількості 1регіонів та виразних від’ємних чисел для кількості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..]

можна розділити на попередню обробку (присвоєння числа осередкам), ітерацію та післяобробку (підрахунок комірок)

Попередня обробка

Попередня обробка - це функція

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

Який використовується zяк абревіатура для zipWithгоління кількох байт. Що ми робимо тут, це зафіксувати двовимірний масив з цілими індексами у рядках та непарними цілими індексами у стовпцях. Ми робимо це, оскільки можемо створити унікальне ціле число з пари цілих чисел, (i,j)використовуючи формулу (2^i)*(2j+1). Якщо ми генеруємо лише непарні цілі числа j, ми можемо пропустити обчислення 2*j+1, зберігаючи три байти.

За допомогою унікального числа нам тепер залишається лише множитися на знак, виходячи зі значення в матриці, яке отримується як 2*x-1

Ітерація

Ітерація виконується

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

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

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

де lфункція порівняння (детально описана нижче) і transpose.map lвиконує половину етапів порівняння та транспозиції. (.)>>=idвиконує свій аргумент двічі, будучи точковою формою \f -> f.fта на один байт коротшою в цьому випадку завдяки правилам пріоритетності оператора.

lвизначається у рядку вище як l x=z(!)(z(!)x(0:x))$tail x++[0]. Цей код виконує оператор порівняння (!)(див. Нижче) для кожної комірки спочатку її лівим сусідом, а потім правою сусідкою, блискавками списку xправоруч зміщеним списком 0:xта лівим зміщеним спискомtail x++[0] по черзі. Ми використовуємо нулі для прокладки зміщених списків, оскільки вони ніколи не можуть зустрічатися в попередньо обробленій матриці.

a!bв рядку над цим визначається як a!b=div(max(a*a)(a*b))a. Тут ми хочемо зробити наступне розрізнення:

  • Якщо sgn(a) = -sgn(b)у матриці у нас є дві протилежні області, і ми не бажаємо їх уніфікувати, то це aзалишається незмінним
  • Якщо у sgn(b) = 0нас є кутовий випадок, де bпрокладка і тому aзалишається незмінною
  • Якщо sgn(a) = sgn(b)ми хочемо об'єднати дві області і взяти ту, що має більшу абсолютну величину (заради зручності).

Зауважте, цього sgn(a)ніколи не може бути 0. Ми виконуємо це за поданою формулою. Якщо ознаки aі bрізняться, a*bменше або дорівнює нулю, тоді a*aяк завжди більше нуля, тому ми вибираємо це як максимум і ділимось, aщоб повернутися a. В іншому випадку max(a*a)(a*b)є abs(a)*max(abs(a),(abs(b)), і ділимо це на a, отримуємо sgn(a)*max(abs(a),abs(b)), що є числом з більшим абсолютним значенням.

Для ітерації функції, ((.)>>=id$transpose.map l)поки вона не досягла фіксованої точки, ми використовуємо (until=<<((==)=<<)), що взято з цієї відповіді stackoverflow .

Подальша обробка

Для післяобробки ми використовуємо деталь

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

що є лише сукупністю кроків.

(>>=id)розбиває список списків на єдиний список, nubпозбавляється від подвійних, (\x->length.($x).filter<$>[(>0),(<0)])розділяє список на пару списків, один на додатні та один на від’ємні числа, та обчислює їх довжину.


2

Java 10, 359 355 281 280 261 246 байт

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

-74 байти завдяки @NahuelFouilleul .

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

Пояснення:

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 байти , видаливши клон та використовуючи |=2: 0 -> 2 та 1 -> 3, однак >0було змінено на==1
Nahuel Fouilleul

вибачте, що мені довелося видалити тести, щоб посилання на tio помістилося у коментарях
Nahuel Fouilleul

@NahuelFouilleul Спасибі, розумне використання |=2! І я все ще міг використовувати <2замість ==1-1 байт, спочатку перевіривши на 0(і таким чином вони будуть змінені на 2, а потім за допомогою <2для перевірки на 1(які змінені на 3).
Кевін Круїйсен

2

Пітон 3 , 167 байт

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)

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


Python 2 , 168 байт

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

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

-2 байти завдяки Кевіну Крейсейну

+2 байти виправлення форматування

Пояснення

Лічильник зберігається за 0 і 1 с. Для кожного запису в матриці виконуються наступні дії:

  • Зменшити лічильник поточного значення на 1
  • Якщо те саме значення існує безпосередньо над або зліва, зменшіть на 1

Це призводить до помилкового позитиву для випадків, що вирівнюються ліворуч

0 0 1
1 1 1

або

0 1
1 1

Якщо виникає така ситуація, лічильник зменшується на 1.

Повертається значення [#1, #0]


1
Я боюся, що ОП, згаданий у другому коментарі, повинен бути таким [#1, #0] . Трохи безглуздо, щоб це не було, але це є наразі. У всякому разі, ви можете Гольф {not c}в {c^1}, і виправити цю проблему , я вже згадував, змінивши n[c]+=до n[c^1]+=подібного питання. Хоча приємна відповідь, +1 від мене. :)
Kevin Cruijssen

Ах, ти маєш рацію. Спасибі!
Jitse

1

Perl 5 ( -0777p), 110 байт

Може бути поліпшені, використовує регулярний вираз для заміни 1з 3, то 0з 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)

ТІО


1

Желе , 44 36 байт

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

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

Монадійне посилання, що приймає список списків цілих чисел як аргумент і повертає список числа 1 і 0 островів у тому порядку.

Пояснення

Крок 1

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

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

Крок 2

Розділіть ці індекси на те, чи було у введенні 1 або 0. Повертає один список індексів із сусідами за 1s та інший для 0s.

  Ƈþ   | 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

Крок 3

Об'єднайте списки з загальними членами та підрахунок результатів

           ƲÐ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 байт

Введення - це змінна таблиця.

x і y - координати

v - значення 0 і 1 (також може обробляти інші числові значення)

Дані тесту, використані в цьому прикладі:

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

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


1

R , 194 172 байт

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

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

Виконайте пошук по глибині, починаючи з кожної комірки матриці, яка дорівнює 1 (або нулю).

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