ম্যাট্রিক্সে 1 এবং 0 দ্বীপগুলি খুঁজে পেতে


29

0 এবং 1 এর দ্বিমাত্রিক ম্যাট্রিক্স দেওয়া হয়েছে। 1s এবং 0 এর দ্বীপের সংখ্যাটি সন্ধান করুন যেখানে প্রতিবেশীরা কেবল অনুভূমিক এবং উল্লম্বে রয়েছেন।

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
আমি প্রস্তাব দিয়েছি আউটপুট উভয় অর্ডারে অর্ডার নির্দিষ্ট হওয়া পর্যন্ত হতে পারে - এটি কোনও আদেশ জোর করার কোনও মূল্য যোগ করে না
রাস্তার ২ter

8
সাইটে স্বাগতম!
আর্নৌল্ড

1
মন্তব্যে কী জবাব দেওয়া হয়েছিল তা চ্যালেঞ্জের শুরুর দিকে পরিষ্কার করা উচিত। এবং আরও সুনির্দিষ্টভাবে, আপনি যদি সত্যিই আমাদের 0 এর আগে 1 এর ফিরে আসতে চান তবে এটি স্পষ্টভাবে বলা উচিত।
আর্নৌল্ড

4
প্রস্তাবিত পরীক্ষার কেস: 11111 / 10001 / 10101 / 10001 / 111112 1
কেভিন ক্রুইজসেন

উত্তর:


16

এপিএল (ডায়ালগ ইউনিকোড) , 29 28 বাইট এসবিসিএস

-1 @ অ্যাডমকে ধন্যবাদ

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

এটি অনলাইন চেষ্টা করুন!

⊂,~∘⊂ ম্যাট্রিক্স এবং তার অবহেলা

{ তাদের প্রত্যেকের জন্য

⍸⍵ 1s এর জোড় জোড়ের তালিকা

+/↑|∘.-⍨ ম্যানহাটনের দূরত্বের ম্যাট্রিক্স

2> প্রতিবেশী ম্যাট্রিক্স

∨.∧⍨⍣≡ ট্রানজিটিভ বন্ধ

≢∪ অনন্য সারি সংখ্যা


এটা সত্যিই চালাক। চূড়ান্ত লাইনটি কেন কাজের গ্যারান্টিযুক্ত তা আপনি ব্যাখ্যা করতে পারেন - কেন, অনন্য সারি কেন উত্তরের সমান? এছাড়াও, "ট্রানজিটিভ ক্লোজার" কি জেসের মতো ^:_?
যোনা

1
@Jonah দেখতে চ্যাট
ngn

16

জে , 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-দ্বীপের সংখ্যা বলে দেয়।

0-দ্বীপের সংখ্যা পেতে আমরা "1 বিয়োগ ইনপুট" তে একই প্রক্রিয়াটি প্রয়োগ করি।


3
এটি দেখতে অনেকটা "বন্যা ভরাট" প্রক্রিয়ার মতো, সত্যিই ঝরঝরে।
ম্যাথিউ এম এম

7

জাভাস্ক্রিপ্ট (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

এটি অনলাইন চেষ্টা করুন!

কিভাবে?

আমরা একটি পুনরাবৃত্তি ফাংশন ব্যবহার করি। প্রাথমিক কলের সময় আমরা 0 এর এবং 1 এর সন্ধান করি। যখনই আমরা এইরকম কোনও শুরুর পয়েন্টটি পাই, আমরা সংশ্লিষ্ট দ্বীপ কাউন্টারকে বাড়িয়ে তুলি ( c[0] বা c[1] ) এবং পুনরাবৃত্তির পর্যায়ে 2 সহ একই সংলগ্ন কোষের অঞ্চল বন্যায় ভরাতে প্রবেশ করি2

বাইটগুলি সংরক্ষণ করতে, একই একই কোডটি মূল পুনরাবৃত্তি এবং পুনরাবৃত্ত পুনরাবৃত্তি উভয়ের জন্য ব্যবহৃত হয় তবে এটি কিছুটা আলাদাভাবে আচরণ করে।

প্রথম পুনরাবৃত্তির সময়:

  • V=0.5Vv0v=0v=1
  • Xওয়াই(এক্স-এক্স)2+ +(Y-ওয়াই)2(এক্স,Y)

পুনরাবৃত্তির পুনরাবৃত্তির সময়:

  • 2c[v ^ 1]++

মন্তব্য

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 এর মতো বড় ম্যাট্রিকের জন্য কাজ করে না।
কেবি আনন্দ 15

3
@ কেবিজয় চ্যালেঞ্জের মধ্যে অন্যথায় স্পষ্টভাবে নির্দিষ্ট না করা পর্যন্ত আমাদের ডিফল্ট নিয়মটি হ'ল যতক্ষণ না কোনও ইনপুটটির জন্য তত্ত্বের অন্তর্নিহিত অ্যালগরিদম কাজ করা হয় ততক্ষণ আমরা প্রয়োগের সীমাগুলির বিষয়ে যত্ন নিই না। ( এটি সম্পর্কে একটি মেটা পোস্ট এখানে , তবে সম্ভবত এটি আরও কোথাও প্রাসঙ্গিক একটি।)
আর্নল্ড

7

এমএটিএল , 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)\ ys এবং xs এর জন্য পৃথক দুটি তালিকা পেতে ডিভোড প্রস্থ (ইনপুট)

x-\:'x: প্রতি-অক্ষের দূরত্ব andx এবং .y

x*x: তাদের বর্গাকার

+/ ∆x² এবং ²y² যোগ করুন ²

2> প্রতিবেশী ম্যাট্রিক্স

{|/'x*\:x}/ ট্রানজিটিভ বন্ধ

#? অনন্য সারি গণনা করুন


আপনার উত্তরটি দেখার পরে আমি খুশি হয়েছি যে আমি কে এটিকে মোকাবেলা করার চেষ্টা করিনি :)
স্ট্রাস্টার

2
@ স্ট্রিস্টস্টার হা, ধন্যবাদ! এটি আমার অভিপ্রায়িত প্রভাব নয় :) আমি মানুষকে (যে কোনও উপভাষা) শিখতে এবং এর মধ্যে গল্ফ শিখতে উত্সাহিত করতে চাই
এনজিএন

6

ওল্ফ্রাম ভাষা (গণিত) , 62৪ 62 বাইট

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

এটি অনলাইন চেষ্টা করুন!

অ্যাটিন্যাটকে ধন্যবাদ : আমরা দুটি বাইটের 1<0পরিবর্তে লিখতে Falseএবং সংরক্ষণ করতে পারি ।

আন-গল্ফ করা সংস্করণ:

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

অবশ্যই একটি ম্যাথেমেটিকা বিল্টিন রয়েছে MorphologicalComponentsযা একটি অ্যারে নেয় (বা একটি চিত্র) এবং দ্বীপ সূচী দ্বারা প্রতিস্থাপিত প্রতিটি রূপচর্চায় সংযুক্ত দ্বীপের পিক্সেলের সাথে একই ফিরিয়ে দেয়। Maxএই ফলাফলটি গ্রহণ করলে দ্বীপের সংখ্যাটি পাওয়া যায় (পটভূমি শূন্যগুলি শূন্যের মধ্যে রেখে যায়, এবং দ্বীপ সূচকটি শুরু হয় 1)। অ্যারে (1-দ্বীপের সংখ্যা দেওয়া) এবং এক বিয়োগফল অ্যারে (0-দ্বীপের সংখ্যা প্রদান) এর জন্য আমাদের আলাদাভাবে এটি করা দরকার। তির্যক প্রতিবেশীরা প্রতিবেশী হিসাবে গণনা না করে তা নিশ্চিত করার জন্য, বিকল্পটি CornerNeighbors->Falseদেওয়া দরকার।


-২ বাইট যেহেতু অসমতার চেয়ে বেশি অগ্রাধিকার রয়েছেRule
এ্যাটিন্যাট

5

পাইথন 3, 144 127 বাইট

এই সমাধানটির cv2দুর্দান্ত চিত্র প্রক্রিয়াকরণ শক্তি ব্যবহার করে। সিভির চেয়ে কম দুর্দান্ত, দুর্দান্ত দীর্ঘ এবং পঠনযোগ্য পদ্ধতির নাম থাকা সত্ত্বেও, এটি পাইথনের অন্য দুটি উত্তরকেই পরাজিত করে!

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

সম্প্রসারিত:

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)

আমি পাইথনের সাথে খুব বেশি পরিচিত নই, তবে আপনার সুস্পষ্ট যুক্তির নামগুলি কেন দরকার? শুধু 4পরিবর্তে connectivity=4এবং সম্ভব n.uint8পরিবর্তে না dtype=n.uint8?
কেভিন ক্রুইজসেন

@ কেভিন ক্রুজসেন, আপনি যদি যুক্তিযুক্ত যুক্তিগুলি এড়িয়ে যান তবে আপনার যুক্তির নামগুলি দরকার। দস্তাবেজগুলিতে তাকাতে, আমাকে আসলে এড়িয়ে যেতে হবে না, যা আমাকে প্রচুর বাইট সংরক্ষণ করে। ধন্যবাদ!
ড্যানিয়েল

আহ ঠিক আছে, আমি ভেবেছিলাম এটি এ জাতীয় কিছু ছিল তবে আমি যখন ডক্সটির দিকে তাকালাম তখন কেবলমাত্র একটি cv2.connectedComponentsপদ্ধতি খুঁজে পেয়েছি, তাই আমি বিভ্রান্ত হয়ে পড়েছিলাম এবং ভেবেছিলাম যুক্তির নামগুলির প্রয়োজনের জন্য আলাদা কারণ থাকতে পারে। আমি যেমন বলেছিলাম, আমি পাইথনের সাথে খুব বেশি পরিচিত নই। আমি এখান থেকে যা শিখেছি তা সবই সিসিজিসিতে here ;) তবে অন্যান্য alচ্ছিক যুক্তিগুলি এড়ানোর জন্য পরিবর্তনশীল নামগুলি ব্যবহার করা বুদ্ধিমান হয়ে যায়।
কেভিন ক্রুইজসেন

1
খুব সুন্দর! আমি একটি অনলাইন সংকলক পেয়েছি যা এখানে সিভি 2 মডিউল অন্তর্ভুক্ত করে ।
জিতসে

5

জে , 46 44 43 বাইট

-1 বাইট @ মাইল ধন্যবাদ

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

এটি অনলাইন চেষ্টা করুন!

@ জোনার উত্তর,& -. থেকে পরীক্ষাগুলি এবং মোড়ক চুরি হয়েছে

,& -. ইনপুট এবং এর অবহেলার জন্য:

4$.$. (y, x) n এর সাথে মেট্রিক্স হিসাবে 1 এর স্থানাঙ্ক

1#.[:|@-"1/~ ম্যানহাটন দূরত্ব: অ্যাবস (∆x) + অ্যাবস (∆y)

2> প্রতিবেশী ম্যাট্রিক্স

[:+./ .*~^:_: ট্রানজিটিভ বন্ধ

#&~.&( ) অনন্য সারি সংখ্যা


1
আপনি দৈর্ঘ্য রচনা করতে পারেন এবং অন্য বাইট সংরক্ষণ করার জন্য অনন্য, অর্থাত ,&#&~.ক্যাপটি এড়ানোর জন্য[:
মাইল

@miles তোমাকে ধন্যবাদ
ngn

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;

বন্যার 1সাথে আরও কোনও সংলগ্ন গুলি পূরণ করুন ;

}

সমস্ত দ্বীপ 1গুলি এসে পরিণত না হওয়া পর্যন্ত পুনরাবৃত্তি করুন ;

s`0(.*)
:$1b

যদি একটি থাকে তবে 0এটিকে পরিবর্তন :করুন এবং ইনপুটটির bশেষে একটি যুক্ত করুন যাতে এটির পথ চলে না।

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

বন্যার 0সাথে আরও কোনও সংলগ্ন গুলি পূরণ করুন :

}

সমস্ত দ্বীপ 0গুলি এসে পরিণত না হওয়া পর্যন্ত পুনরাবৃত্তি করুন :

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

পৃথকভাবে 1গুলি এবং 0s এর দ্বীপের সংখ্যা গণনা করুন ।


3

হাস্কেল , 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=<<((==)=<<)), যা এই স্ট্যাকওভারফ্লো উত্তর থেকে নেওয়া হয়েছে ।

পোস্ট প্রসেসিং

পোস্টপ্রসেসিংয়ের জন্য, আমরা অংশটি ব্যবহার করি

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

যা কেবলমাত্র পদক্ষেপের সংগ্রহ।

(>>=id)তালিকাগুলির তালিকাকে একক তালিকায় স্কোয়াশ করে nubডাবল থেকে মুক্তি (\x->length.($x).filter<$>[(>0),(<0)])পেয়ে তালিকার একজোড়া তালিকায় পার্টিশন দেয়, একটি ইতিবাচক এবং একটি নেতিবাচক সংখ্যার জন্য এবং তার দৈর্ঘ্য গণনা করে।


2

জাভা 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
নাহুয়েল ফুইলুল

দুঃখিত, আমাকে পরীক্ষাগুলি সরিয়ে ফেলতে হয়েছিল যাতে
টিও

@ নাহুয়েলফৌইল ধন্যবাদ, স্মার্ট ব্যবহার করে |=2! আর আমি ব্যবহার করতে পারে <2পরিবর্তে ==1জন্য -1 বাইট প্রথম টিক চিহ্ন দেওয়ার দ্বারা জন্য 0এবং (এইভাবে তারা পরিবর্তিত হয় 2, এবং তারপর ব্যবহার <2জন্য চেক করতে 1(পরিবর্তিত যা 3)।
কেভিন Cruijssen

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)

এটি অনলাইন চেষ্টা করুন!


পাইথন 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 বাইট ফর্ম্যাটিং ফিক্স

ব্যাখ্যা

একটি কাউন্টার 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। :)
কেভিন ক্রুইজসেন

আহ, আপনি ঠিক বলেছেন। ধন্যবাদ!
Jitse

1

পার্ল 5 (-0777p ), 110 বাইট

উন্নত হতে পারে, Regex প্রতিস্থাপন করতে ব্যবহার 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)

Tio


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]

ধাপ ২

ইনপুটটিতে 1 বা 0 ছিল কিনা তা দ্বারা এই সূচকগুলি বিভক্ত করুন। প্রতিবেশীদের সাথে 1s এর জন্য সূচকগুলির একটি তালিকা এবং অন্যরকম 0 এর জন্য ফেরত দেয়।

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

টি-এসকিউএল 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

আর , 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 (বা শূন্য) এর সমান ম্যাট্রিক্সের প্রতিটি কক্ষে শুরু করে একটি গভীরতা-প্রথম অনুসন্ধান করুন।

  • -২ বাইটস @ জিউসেপ্পকে ধন্যবাদ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.