আমার জানালায় জল আছে


13

দৃশ্যপট

আমি আমার গাড়ি নিয়ে একটি রাস্তা ধরে গাড়ি চালাই এবং বৃষ্টি শুরু হয়। বৃষ্টিপাতগুলি এলোমেলোভাবে আমার উইন্ডোয় পড়ছে এবং এখন আমি নিজেকে জিজ্ঞাসা করি, বৃহত্তম সংযুক্ত ভেজা অঞ্চলটি কোথায়?

কাজটি

এটি আরও সহজ করার জন্য, উইন্ডোটি 10 ​​* 10 স্কোয়ারের ম্যাট্রিক্সে বিভক্ত। আপনার কাজ উইন্ডোতে বৃহত্তম সংযুক্ত জলের ড্রপ-অঞ্চল সন্ধান করা find

ইনপুট

দুটি সম্ভাব্য ইনপুট রয়েছে, আপনি একটি 2-মাত্রিক অ্যারে বা 1-মাত্রিক একটি ব্যবহার করতে পারেন। আপনি স্ট্ডিন ইত্যাদির মতো যে কোনও ইনপুটগুলির মধ্যে চয়ন করতে পারেন ...
উদাহরণ:

// 2-dimensional:
[[0,1,0,0,0,0,1,0,0,0],
 [0,1,1,0,0,0,0,1,1,0],
 [0,1,1,0,0,0,0,1,0,0],
 [0,1,0,0,0,0,0,0,0,0],
 [0,0,0,0,0,0,0,0,1,0],
 [0,0,0,1,1,0,0,0,1,0],
 [0,0,0,1,1,0,0,0,1,0],
 [0,0,0,0,0,1,1,0,1,0],
 [0,0,0,0,0,1,1,0,1,0],
 [0,0,0,0,0,0,0,0,0,0]]

// 1-dimensional
[0,1,0,0,0,0,1,0,0,0,
 0,1,1,0,0,0,0,1,1,0,
 0,1,1,0,0,0,0,1,0,0,
 0,1,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,1,0,
 0,0,0,1,1,0,0,0,1,0,
 0,0,0,1,1,0,0,0,1,0,
 0,0,0,0,0,1,1,0,1,0,
 0,0,0,0,0,1,1,0,1,0,
 0,0,0,0,0,0,0,0,0,0]

আউটপুট

আপনার কোডটিতে সবচেয়ে বড় সংযুক্ত ক্ষেত্রের আকার এবং
"আয়তন: জেড কোঅর্ডিনেটস: (এক্স 1, ওয়াই 1) (এক্স 2, ওয়াই 2) ফর্ম্যাটে এই অঞ্চলের অন্তর্ভুক্ত জলাবদ্ধতার x- এবং y- স্থানাঙ্কগুলি রাখতে হবে .. "
পূর্ববর্তী ইনপুটটির উদাহরণ:

Size: 6 Coordinates: (1,0) (1,1) (2,1) (1,2) (2,2) (1,3)

সমন্বয়কারীদের আদেশের বিষয়টি বিবেচনা করে না।

বিধি

  • জলপ্রপাতগুলি সংযুক্ত থাকে, যদি তারা একে অপরকে orthogonally স্পর্শ করে
  • তির্যক সংযোগগুলি গণনা করা হয় না
  • অনেকগুলি অঞ্চল থাকতে পারে এবং আপনার কোডটিকে সর্বাধিক সন্ধান করতে হবে
  • একটি ফাঁকা ক্ষেত্র "0" এবং একটি ভিজা ক্ষেত্র "1" হিসাবে উপস্থাপিত হয়
  • একটি সংক্ষিপ্ত ব্যাখ্যা এবং পূর্ববর্তী ইনপুটটির আউটপুট সহ আপনার সমাধান পোস্ট করুন
  • আগামী 7 দিনের মধ্যে সংক্ষিপ্ততম কোডটি জিতবে
  • যদি একই আকারের দুটি ক্ষেত্র থাকে তবে আপনি একটি চয়ন করতে পারেন

বিজয়ী: ভেন্টোরো 171 সহ - রুবি


2
@ ডুরকনব কোনও টাইপোর অভিযোগ করছেন? ওপি জার্মান।
edc65

1
@ ডুরকনব আমি এটি পরিবর্তন করেছি, আপনাকে ধন্যবাদ। সময়সীমা কেবল বলে, আমি যখন বিজয়ী নির্ধারণ করব তবে আপনি এখনও উত্তর পোস্ট করতে পারবেন।
ইজলিন


1
@ টিউনপ্রংক: ওপি মানে আসল পোস্টার। গুগলে এটি সন্ধান করুন :)
জাস্টহেল্ফ

2
কী ইনপুট পদ্ধতি অনুমোদিত তা সম্পর্কে কিছু স্পষ্টতা, হ'ল দুর্দান্ত would
ভেন্টোরো

উত্তর:


3

রুবি, 171 টি অক্ষর

r=eval *$*
u=(0..99).map(&v=->p{-~p*r[p]>0?" (#{r[p]=0;u=p%c=10},#{p/c})"+v[p+c]+v[p-c]+v[u>0?p-1:p]+v[u<9?p+1:p]:""}).max_by &:size
puts"Size: #{u.size/6} Coordinates:"+u

এক-মাত্রিক অ্যারে হিসাবে কমান্ড লাইন প্যারামিটারের মাধ্যমে ইনপুট।

নমুনা ইনপুট জন্য আউটপুট: Size: 6 Coordinates: (1,0) (1,1) (1,2) (1,3) (2,2) (2,1)

এই উত্তরটি প্রতিটি রেইনড্রপ ক্লাস্টারের জন্য স্থানাঙ্কের একটি তালিকা তৈরি করে একটি সহজ বন্যা-পূরণ পদ্ধতির ব্যবহার করে। কোডটির বেশিরভাগটি সীমাবদ্ধতা যাচাইয়ের জন্য এবং I / O এর জন্য ব্যবহৃত হয়।


5

পাইথন - 192

a=10;g+=[0]*a
def f(k):
 if g[k]:g[k]=0;return" (%d,%d)"%(k/a,k%a)+f(k+a)+f(k-a)+f(k+(k%a<9))+f(k-(k%a>0))
 return''
m=max(map(f,range(100)),key=len)
print"Size: "+`len(m)/6`+" Coordinates:"+m

ইনপুট (কোডের আগে পেস্ট করুন):

g=[0,1,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0]

প্রস্তাবিত সম্পাদনাগুলির জন্য ক্যালভিনের শখগুলি ধন্যবাদ!


আপনি 8 টি অক্ষর সংরক্ষণ করার map(f,range(100))পরিবর্তে ব্যবহার করতে পারেন [f(i)for i in range(100)]। এছাড়াও আমি বিশ্বাস করি যে আপনার স্থানাঙ্কগুলি (y, x) নয় (x, y)।
ক্যালভিনের

3

সি # - 548 523 522 511 503 476

(500 এর নিচে ... ইয়ে)

আমি নিশ্চিত উন্নতির অনেক জায়গা আছে ।

আমি যেভাবে ডেটা ইনপুট করেছিলাম তা হল একটি অ্যারে শুরু করা ize আমি এই অ্যারেটিকে স্কোরটিতে অন্তর্ভুক্ত করি নি (যদি আপনি মনে করেন এটি প্রতারণা করছে তবে আমি কোডটি পরিবর্তন করতে পারি তবে এটি তুলনামূলকভাবে অনেক কোড যুক্ত করবে কারণ সি # পার্সিং এ পার্টে দুর্দান্ত নয়)

using o=System.Console;using l=System.Collections.Generic.List<int[]>;class P{
static int[,] a ={{0,1,0,0,0,0,1,0,0,0},{0,1,1,0,0,0,0,1,1,0},{0,1,1,0,0,0,0,1,0,0},{0,1,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,1,0},{0,0,0,1,1,0,0,0,1,0},{0,0,0,1,1,0,0,0,1,0},{0,0,0,0,0,1,1,0,1,0},{0,0,0,0,0,1,1,0,1,0},{0,0,0,0,0,0,0,0,0,0}};
static int w=10,h=w,x=0,y;static l t=new l(),m=new l();static void f(int r,int c){if(a[r,c]==1){a[r,c]=0;if(r<h)f(c,r+1);if(r>0)f(c,r-1);if(c<w)f(c+1,r);if(c>0)f(c-1,r);t.Add(new[]{c,r});}}static void Main(){for(;++x<w;)for(y=0;++y<h;){if(a[x,y]==1)f(x,y);if(t.Count>m.Count)m=t.FindAll(r=>true);t.Clear();}o.Write("Size: "+m.Count+" Coordinates: ");m.ForEach(c=>o.Write("({0},{1}) ",c[0],c[1]));}}

এটি http://ideone.com/UCVCPM এ পরীক্ষা করুন

দ্রষ্টব্য: বর্তমান সংস্করণটি আদর্শে কাজ করে না কারণ এটি পছন্দ করে না using l=System.Collections..., তাই আদর্শ সংস্করণটি কিছুটা পুরানো (এবং আরও দীর্ঘ)

কিভাবে এটা কাজ করে

এটি আছে কিনা তা মূলত যাচাই করে 1। যদি এক খুঁজে বের, এটা বন্যা ভরাট আলগোরিদিম ব্যবহার করে সব সংলগ্ন প্রতিস্থাপন 1সঙ্গে এর 0একটি অস্থায়ী লিস্টে প্রতিস্থাপিত স্থানাঙ্ক যোগ করা হয়েছে। পরবর্তীতে এটির উপরে তালিকা (তুলনা m) অস্থায়ী তালিকা (থেকে t) এবং সেট mকরার tযদি tআরো উপাদানগুলি রয়েছে।


3

গণিত - 180 বাইট

এই ফাংশনটি 2-মাত্রিক অ্যারে নেয়।

Golfed

f@x_:=(c=MorphologicalComponents[x,CornerNeighbors->False];m=Last@SortBy[ComponentMeasurements[c,"Count"],Last];Print["Size: ",Last@m," Coordinates: ",Reverse/@Position[c,m[[1]]]])

চমত্কার

f@x_ := (
   c = MorphologicalComponents[x, CornerNeighbors -> False];
   m = Last@SortBy[ComponentMeasurements[c, "Count"], Last];
   Print["Size: ", Last@m, " Coordinates: ", Reverse/@Position[c, m[[1]]]]
   );

উদাহরণ

{0,1,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0};
w=Partition[%,10];
f@w

আকার: 6 স্থানাঙ্ক: {{1,2}, {2,2}, {2,3}, {3,2}, {3,3}, {4,2}}

আউটপুট সামান্য ব্যাহত হয়। ম্যাথমেটিকা ​​0 এর পরিবর্তে 1 এ সূচী শুরু করে এবং {}অবস্থান নির্দেশ করতে ব্যবহার করে। -1পজিশনগুলি 0-সূচকের প্রয়োজন হলে 2 বাইট যুক্ত করুন ( এর ()পরিবর্তে যদি প্রয়োজন হয় তবে প্রচুর বাইট যুক্ত করুন {}:(

ব্যাখ্যা

fএর একটি ফাংশন x। এটি এর cরূপান্তর হিসাবে সংজ্ঞায়িত হয় x, যেখানে প্রতিটি (i, j) এখন এটি সংযুক্ত উপাদানটির সাথে সম্পর্কিত একটি পূর্ণসংখ্যার সমতুল্য। এটিতে মূল কাজ জড়িত:

MorphologicalComponents[w, CornerNeighbors -> False] // Colorize

এখানে চিত্র বর্ণনা লিখুন

তারপরে mপ্রতিটি উপাদানগুলিতে কতগুলি উপাদান রয়েছে তা গণনা করে that সংখ্যা অনুসারে এটিকে বাছাই করে এবং শেষ ফলাফলটি (অর্থাত্ সর্বাধিক উপাদান সহ) গ্রহণ করে। শেষ লাইনটি গণনাটি এবং cইনডেক্সের ইনডেক্সের অবস্থানগুলি মুদ্রণ করে m


2

হাস্কেল, 246

r=[0..9]
q=[(i,j)|i<-r,j<-r]
t v p@(i,j)|elem p v||notElem p q||g!!j!!i==0=v|1<2=foldr(\(k,l)v->t v(i+k,j+l))(p:v)$zip[-1,0,1,0][0,-1,0,1]
(?)=map
a=t[]?q;(b,c)=maximum$zip(length?a)a
main=putStrLn.unwords$["Size:",show b,"Coordinates:"]++show?c

ইনপুট

কোডের আগে দুটি মাত্রা এবং পেস্ট করুন g, উদাহরণস্বরূপ:

g = [[0, 1, 1, ......, 0], [......], ....]

Ungolfed

field = [
 [0,1,0,0,0,0,1,0,0,0],
 [0,1,1,0,0,0,0,1,1,0],
 [0,1,1,0,0,0,0,1,0,0],
 [0,1,0,0,0,0,0,0,0,0],
 [0,0,0,0,0,0,0,0,1,0],
 [0,0,0,1,1,0,0,0,1,0],
 [0,0,0,1,1,0,0,0,1,0],
 [0,0,0,0,0,1,1,0,1,0],
 [0,0,0,0,0,1,1,0,1,0],
 [0,0,0,0,0,0,0,0,0,0]
 ]
range = [0..9]
positions = [(i, j) | i <- range, j <- range]
directions = zip [-1, 0, 1, 0] [0, -1, 0, 1]
traverse visited pos@(i, j)
  | pos `elem` visited || pos `notElem` positions || field!!j!!i == 0 = visited
  | otherwise = foldr folder (pos:visited) directions
  where folder = (\(di, dj) visited -> traverse visited (i + di, j + dj))
blocks = map (traverse []) positions
(maxCount, maxBlock) = maximum $ zip (map length blocks) blocks
main = putStrLn.unwords $ ["Size:", show maxCount, "Coordinates:"] ++ map show maxBlock

2

সি # 374 বাইট ফাংশন

এটি আমার উত্তরটির একটি ভারী পরিবর্তিত সংস্করণ আপনি কি সবচেয়ে বড় ঘরে আছেন? । এটি ইনটগুলির এক-মাত্রিক অ্যারে নেয় এবং প্রয়োজনীয় স্টাইলে একটি স্ট্রিং দেয়। এটি ইনপুট (প্রথম লুপ) থেকে বিচ্ছিন্ন সেটগুলি তৈরি করে, প্রতিটি সেটের আকার নির্ধারণ করে এবং বৃহত্তম সেট (দ্বিতীয় লুপ) খুঁজে বের করে এবং তারপরে যে সেটটি কোনও সেল আউটপুট স্ট্রিং (তৃতীয় লুপ) এ সংযুক্ত করে যা তারপরে ফিরে আসে ।

static string F(int[]g){int s=10,e=0,d=s*s,a=0,b=d+1;int[]t=new int[b],r=new int[b];t[d]=d;System.Func<int,int>T=null,k=v=>t[T(v)]=t[v]<d?a:d;T=v=>t[v]!=v?T(t[v]):v;for(;a<d;a++)if(g[a]>0){e=t[a]=a;if(a>s)k(a-s);if(a%s>0)k(a-1);}else t[a]=d;for(;a-->0;)e=r[e]<++r[b=T(a)]&&b<d?b:e;var p="Size: "+r[e]+" Coordinates:";for(;d-->1;)p+=T(d)==e?" ("+d%s+","+d/s+")":"";return p;}

কম গল্ফড (এবং পরীক্ষার কোড সহ):

class P
{
    static int[] z = {0,1,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0};

    static string F(int[]g)
    {
        int s=10,e=0,d=s*s,a=0,b=d+1;

        int[]t=new int[b],r=new int[b];
        t[d]=d;
        System.Func<int,int>T=null,k=v=>t[T(v)]=t[v]<d?a:d;
        T=v=>t[v]!=v?T(t[v]):v;

        for(;a<d;a++)
            if(g[a]>0)
            {
                e=t[a]=a;
                if(a>s)k(a-s);
                if(a%s>0)k(a-1);
            }
            else
                t[a]=d;
        for(;a-->0;)
            e=r[e]<++r[b=T(a)]&&b<d?b:e;

        var p="Size: "+r[e]+" Coordinates:";
        for(;d-->1;)
            p+=T(d)==e?" ("+d%s+","+d/s+")":"";

        return p;
    }

    static void Main()
    {
        System.Console.WriteLine(F(z));
    }
}

এটি আমার 476 বাইট সমাধান সম্পর্কে আমার খারাপ লাগছে :( +1 আপনার জন্য, ভাল স্যার
ক্রিস্টোফ বাহ্মওয়ালদার

1

জাভাস্ক্রিপ্ট (একমা স্ক্রিপ্ট 6) 183 189

অ্যারে ইনপুট এবং স্ট্রিং রিটার্ন মান সহ একটি ফাংশন। যদি সত্যিকারের আউটপুট প্রয়োজন হয় (আমার কাছে পরিষ্কার নয়) 'সতর্কতা ()' এর জন্য 7 বাইট যুক্ত করুন।

W=(a,n=10,x=0)=>(F=p=>a[p]|0&&(a[p]=0,o+=' ('+p%n+','+(p/n|0)+')',1+F(p-n)+F(p+n)+F(p-(p%n>0))+F(p+((p+1)%n>0))),a.map((e,p)=>(t=F(p,o=''))>x&&(x=t,k=o)),'Size: '+x+' Coordinates:'+k)

পরীক্ষা আউটপুট

Size: 6 Coordinates: (1,0) (1,1) (1,2) (1,3) (2,2) (2,1)

আরও পঠনযোগ্য

W=(a,n=10,x=0)=>
(
  F=p=>
    a[p]|0&&(  
      a[p]=0,o+=' ('+p%n+','+(p/n|0)+')',
      1+F(p-n)+F(p+n)+F(p-(p%n>0))+F(p+((p+1)%n>0)) // modulo takes care of not overflowing out of a row
    ),
  a.map((e,p)=>(t=F(p,o=''))>x&&(x=t,k=o)), 
  'Size: '+x+' Coordinates:'+k
)

ব্যাখ্যা

একটি একক মাত্রার অ্যারে এবং একটি সারির আকারের সাথে একটি alচ্ছিক প্যারামিটার পান। ফাংশনটি বিভিন্ন অ্যারের মাত্রা এমনকি x! = Y এর সাথেও কাজ করে।

সুডোকোড:

 For each element, 
   try to fill. 
   During the fill operation build a string with the coordiinates. 
   Remember the longest fill and the corresponding string and 
 output that at the end.

1

জাভাস্ক্রিপ্ট, 273

ফাংশন অ্যারে নেয় এবং স্ট্রিং দেয়। আমার প্রথম প্রয়াস ছিল 500 ডলার অক্ষর এবং বন্যা ভরাট ব্যবহার করেনি। এই এক না। আমি জাভাস্ক্রিপ্ট শিখছি তাই কোনও পরামর্শ প্রশংসা করা হবে।

এই ফাংশনটি ইনপুট অ্যারের মধ্য দিয়ে যায় এবং প্রতিটি 1 এর জন্য এটি শুরু হয় এবং ফিল ফাংশনটি ব্যবহার করে 1 থেকে 0 এর সাথে সংযুক্ত সমস্ত পরিবর্তন করে। এটি করার সময় এটি সর্বাধিক 1 টি সহ ব্লবটি স্মরণ করে। ফিল ফাংশনটি বর্তমান অবস্থানে 0 তে পরিবর্তিত হয় এবং তারপরে উপরের অবস্থানে, ডানদিকে, নীচে এবং বামে নিজেকে কল করে।

function G(m){var B="",b=0;for(var p=0;p<m.length;p++)if(m[p]){var T="",t=0;
Z(p);if(t>b){b=t;B=T;}}return"Size: "+b+" Coordinates:"+B;function Z(p){if(m[p])
{m[p]=0;t++;T+=" ("+p%10+","+Math.floor(p/10)+")";if(p>9)Z(p-10);if(p%10)Z(p-
1);if(p<90)Z(p+10);if(p%10!=9)Z(p+1);}}}

এখানে পরীক্ষা করুন: http://goo.gl/9Hz5OH

পঠনযোগ্য কোড

var map = [0, 1, 0, 0, 0, 0, 1, 0, 0, 0,
           ...
           0, 0, 0, 0, 0, 0, 0, 0, 0, 0];

function F(map) {

    var bestBlob = "", bestLen=0;
    for (var p = 0; p < map.length; p++)
        if (map[p]) {
            var thisBlob = "", thisLen=0;
            Fill(p);
            if (thisLen > bestLen){
                bestLen=thisLen ; bestBlob = thisBlob;
            }
        }
    return "Size: " + bestLen + " Coordinates:" + bestBlob;

    function Fill(p) {
        if (map[p]) {
            map[p] = 0; thisLen++;
            thisBlob += " (" + p % 10 + "," + Math.floor(p / 10) + ")";
            if (p > 9) Fill(p - 10);
            if (p % 10) Fill(p - 1);
            if (p < 90) Fill(p + 10);
            if (p % 10 != 9) Fill(p + 1);
        }
    }
}

1

স্কালা, 420

হাই, আমার এন্ট্রি হিসাবে একটি 2 ডি অ্যারে নেয় List[List[Int]], একটি প্রদান করেString

val o=for{(r, y)<-w.zipWithIndex;(v,x)<-r.zipWithIndex;if(v == 1)}yield(x,y);val a=o.flatMap(c=>o.collect{case(x,y)if{(x==c._1+1||x==c._1-1)&&y==c._2^(y==c._2+1||y==c._2-1)&&x==c._1}=>c->(x,y)}).groupBy(_._1).map(n => (n._1->n._2.map(t=>t._2)));val b=a.values.flatMap(v=>v.map(c=>a(c)++v));val l=b.collect{case x if (x.length==b.map(_.length).max)=>x}.head;println(s\"Size: ${l.length} Coordinates: ${l.mkString(" ")}\")

ব্যাখ্যা

উইন্ডোটিকে একটি হিসাবে দেওয়া হয়েছে List[List[Int]], প্রথমে আমরা প্রতিটি "1" খুঁজে পাই এবং তালিকার স্থানাঙ্কগুলি সংরক্ষণ করি। এরপরে আমরা সেই তালিকাটিকে Mapপ্রতিটি সংযুক্ত "1" এর স্থানাঙ্কের তালিকায় প্রতিটি "1" এর স্থানাঙ্কের একটিতে পরিণত করি। তারপরে সাব-ব্লবগুলিকে ব্লবগুলিতে রূপান্তরভাবে সংযুক্ত করতে সংলগ্ন মানচিত্রটি ব্যবহার করুন এবং অবশেষে আমরা সবচেয়ে বড় ব্লবটি ফিরিয়ে আনি (এবং ডুপ্লিকেট ব্লবগুলি উপেক্ষা করে যেহেতু প্রত্যাবর্তিত স্থানাঙ্কগুলির আদেশের বিষয়টি বিবেচনা করে না)।

আরও পঠনযোগ্য

 val w = {
  List(//0,1,2,3,4,5,6,7,8,9
    List(0,1,0,0,0,0,1,0,0,0), //0
    List(0,1,1,0,0,0,0,1,1,0), //1
    List(0,1,1,0,0,0,0,1,0,0), //2
    List(0,1,0,0,0,0,0,0,0,0), //3
    List(0,0,0,0,0,0,0,0,1,0), //4
    List(0,0,0,1,1,0,0,0,1,0), //5
    List(0,0,0,1,1,0,0,0,1,0), //6
    List(0,0,0,0,0,1,1,0,1,0), //7
    List(0,0,0,0,0,1,1,0,1,0), //8
    List(0,0,0,0,0,0,0,0,0,0)) //9
}

case class Coord(x: Int, y: Int)

val ones: List[Coord] = for{
  (row, y)   <- w.zipWithIndex
  (value, x) <- row.zipWithIndex
  if (value == 1)        
} yield Coord(x,y)

val adjacencyMap: Map[Coord, List[Coord]] = ones.flatMap(keyCoord => ones.collect{
case Coord(adjacentX, adjacentY) if {
    (adjacentX == keyCoord.x + 1 || adjacentX == keyCoord.x - 1) && adjacentY == keyCoord.y ^ 
    (adjacentY == keyCoord.y + 1 || adjacentY == keyCoord.y - 1) && adjacentX == keyCoord.x
  }  => keyCoord->Coord(adjacentX,adjacentY)
}).groupBy(_._1).map(n => (n._1->n._2.map(t=>t._2) ))

val blobs: Iterable[List[Coord]] = adjacencyMap.values.flatMap(v => v.map(coord => adjacencyMap(coord)++v))

val largestBlob: List[Coord] = blobs.collect{case x if (x.length == blobs.map(b=> b.length).max) => x}.head

println(s"""Size: ${largestBlob.length} Coordinates: ${largestBlob.collect{case Coord(x,y) => (x,y)}.mkString(" ")}""")

সমালোচনা খুব প্রশংসা করা হয়।

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