কোড-গল্ফ: গণনা দ্বীপপুঞ্জ


31

একটি সাধারণ প্রতিযোগিতা, এই স্ট্যাকওভারফ্লো প্রশ্ন দ্বারা অনুপ্রাণিত :

আপনাকে উপগ্রহের মাধ্যমে ছবি তোলার উপরিভাগের একটি চিত্র দেওয়া হয়েছে image চিত্রটি একটি বিটম্যাপ যা যেখানে জল ' .' দ্বারা চিহ্নিত থাকে এবং স্থল দ্বারা চিহ্নিত থাকে ' *'। সংলগ্নদের দলগুলি *একটি দ্বীপ গঠন করে। (দুটি ' *' সংলগ্ন যদি তারা অনুভূমিক, উল্লম্ব বা তির্যক প্রতিবেশী হয়)। আপনার কাজটি বিটম্যাপে দ্বীপের সংখ্যা মুদ্রণ করা।

একটি একক *একটি দ্বীপ হিসাবে গণনা।

নমুনা ইনপুট:

.........**
**......***
...........
...*.......
*........*.
*.........*

নমুনা আউটপুট:

5

বিজয়ীর কোডটিতে ছোট সংখ্যক বাইট সহ এন্ট্রি হয়।


যুক্তি বুঝতে পারছি না। উপরের ডান কোণে 5 টি তারকা কি এক দ্বীপ হিসাবে বিবেচিত নয়? তারপরে আপনার উদাহরণটিতে 4 টি দ্বীপ রয়েছে।
অগস্ট

পর্দা মোড়ানো না। প্রতিটি কোণে একটি দ্বীপ + একাকী *দ্বীপ
ক্লাদিউ

2
তবে আপনার সংজ্ঞা অনুসারে একটি দ্বীপ '*' অক্ষরের একটি গ্রুপ যা একাধিককে বোঝায়।
অ্যাকলিট

ওহ ফেয়ার পয়েন্ট একাকী *s এছাড়াও দ্বীপ হয়।
ক্লদিউ

উত্তর:


30

গণিত 188 185 170 115 130 46 48 চর

ব্যাখ্যা

পূর্ববর্তী সংস্করণগুলিতে, আমি একে অপরের থেকে 1 এর দাবাবোর্ড দূরত্বের অবস্থানের একটি গ্রাফ তৈরি করেছি। GraphComponentsতারপরে দ্বীপের সংখ্যা প্রকাশিত হয়েছে, প্রতিটি উপাদান হিসাবে এক।

বর্তমান সংস্করণটি MorphologicalComponentsঅ্যারেতে এমন অঞ্চলগুলির ক্লাস্টারগুলি সন্ধান এবং সংখ্যাটি ব্যবহার করতে ব্যবহার করে - যেসব অঞ্চলে 1শারীরিকভাবে সুসংগত। গ্রাফিকিং অপ্রয়োজনীয়, এর ফলে কোডের বিশাল অর্থনীতি দেখা যায়।


কোড

Max@MorphologicalComponents[#/.{"."->0,"*"->1}]&

উদাহরণ

Max@MorphologicalComponents[#/.{"."->0,"*"->1}]&[{{".", ".", ".", ".", ".", ".", ".", ".", ".", "*", "*"}, {"*", "*", ".", ".", ".", ".", ".", ".", "*", "*", "*"}, {".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "."}, {".", ".", ".", "*", ".", ".", ".", ".", ".", ".", "."}, {"*", ".", ".", ".", ".", ".", ".", ".", ".", "*", "."}, {"*", ".", ".", ".", ".", ".", ".", ".", ".", ".", "*"}}]

5


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

ডেটা একটি অ্যারের হিসাবে ইনপুট হয়; ম্যাথমেটিকাতে, এটি তালিকার একটি তালিকা।

ইনপুট অ্যারেতে, ডেটা প্রতিস্থাপনের মাধ্যমে 1'গুলি এবং এর'তে রূপান্তরিত হয়0

/.{"."->0,"*"->1}

যেখানে /.একজন পোতা ফর্ম ReplaceAllপ্রতিস্থাপন বিধি দ্বারা অনুসরণ করে। এটি মূলত অ্যারেটিকে একটি কালো এবং সাদা চিত্রে রূপান্তরিত করে। আমাদের যা করতে হবে তা হ'ল ফাংশনটি প্রয়োগ করা Image,।

Image[{{".", ".", ".", ".", ".", ".", ".", ".", ".", "*", "*"}, {"*", "*", ".", ".", ".", ".", ".", ".", "*", "*", "*"}, {".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "."}, {".", ".", ".", "*", ".", ".", ".", ".", ".", ".", "."}, {"*", ".", ".", ".", ".", ".", ".", ".", ".", "*", "."}, {"*", ".", ".", ".", ".", ".", ".", ".", ".", ".", "*"}} /. {"." -> 0, "*" -> 1}]

দ্বীপ

সাদা স্কোয়ারগুলি মানটির সাথে মিল রয়েছে, 1

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

MorphologicalComponents1প্রতিটি কক্ষের ক্লাস্টার সংখ্যার সাথে সম্পর্কিত একটি পূর্ণসংখ্যার সাথে এর প্রতিস্থাপন করে ।

প্রক্রিয়াকরণ

Max বৃহত্তম ক্লাস্টার নম্বর প্রদান করে।


দ্বীপপুঞ্জ প্রদর্শন করা হচ্ছে

Colorize প্রতিটি দ্বীপ অনন্যভাবে রঙ করবে।

রঙ


এটি ভি 7 তে লিখিত হিসাবে কাজ করছে না কারণ MorphologicalComponentsএকটি চায় Image, তবে ভি 9-তেও এটি হওয়া উচিত নয় Max@MorphologicalComponents[d/.{"."->0,"*"->1}]? অর্থাত্ প্রতিস্থাপনের কাজটি আগে হয়েছিল? Maxপ্রতিস্থাপনের আগে অদৃশ্য হয়ে যাবে, তাই না?
মিঃ উইজার্ড

আমার কাছে ভি 9 আছে, @ মিঃ উইজার্ড ঠিক আছে। 46 টি অক্ষর সঠিক সংখ্যা।
মুর্তা

@ মিঃ উইজার্ড প্রতিস্থাপনটি মরফোলজিকাল উপাদানগুলির প্রয়োগের আগে সম্পন্ন করা হয়। একটি অগ্রাধিকার জিনিস হতে হবে।
ডেভিডসি

হাই @ ডেভিডকার্যাহার, আমার বক্তব্য "->" সম্পর্কে নয় তবে অভিব্যক্তিটি Max@MorphologicalComponents@d/.{"."->0,"*"->1}কাজ করে না, যা বোঝায় তা হল Max@MorphologicalComponents[d /. {"." -> 0, "*" -> 1}], সুতরাং আপনার আরও একটি চরিত্র রয়েছে।
মুর্তা

9

রুবি ১.৯ (134 121 113 110)

স্ট্যান্ডিনে মানচিত্রটি বা মানচিত্রের ফাইলের নামটিকে প্রথম কমান্ড-লাইন আর্গুমেন্ট হিসাবে নিয়ে যায় এবং stdout এ দ্বীপের সংখ্যা মুদ্রণ করে। একটি মৌলিক পুনরাবৃত্তি বন্যা-পূরণ ব্যবহার করে Using উন্নতি সর্বদা হিসাবে স্বাগত!

c=0
gets$!
c+=1while(f=->i{9.times{|o|$_[i]=?.;f[o]if$_[o=i+(o/3-1)*(~/$/+1)+o%3-1]==?*&&o>0}if i})[~/\*/]
p c

ডেভিড এর রঙ অনুরূপ, আপনিও এটা পরিবর্তন করে বিভিন্ন দ্বীপ প্রদর্শন করে পেতে পারেন $_[i]=?.করতে $_[i]=c.to_sএবং p cকরতে puts$_, যা আপনি ভালো কিছু দিতে হবে:

.........00
11......000
...........
...2.......
3........4.
3.........4

(কমপক্ষে আপনার সংখ্যা শেষ না হওয়া পর্যন্ত!)

কিছু পরীক্ষার কেস:

.........**
**......***
...........
...*.......
*........*.
*.........*

5

......*..**....*
**...*..***....*
....*..........*
...*.*.........*
*........***....
*.....*...***...
*.....*...*....*
****..........**
*.........*.....

9

*

1

****
****
....
****

2

**********
*........*
*.******.*
*.*....*.*
*.*.**.*.*
*.*.**.*.*
*.*....*.*
*.******.*
*........*
**********

3


8
আমি শেষ পরীক্ষা পছন্দ। বাক্সের ভিতরে ভাবছি!
মিস্টার লিস্টার

1

সি, 169 অক্ষর

স্টিডিনের কাছ থেকে মানচিত্র পড়ে। পুনরাবৃত্ত বন্যা-পূরণের ক্রিয়াকলাপটির উন্নতি করার ভাগ্য নেই r(j)যদিও এটি দেখে মনে হচ্ছে।

c,g,x,w;char m[9999];r(j){if(m[j]==42)m[j]=c,r(j+1),r(j+w-1),r(j+w),r(j+w+1),c+=j==g;}main(){while((m[x++]=g=getchar())+1)w=g<11*!w?x:w;for(;g++<x;)r(g);printf("%i",c);}

1

পাইথন 2, 223 203 বাইট

আপনাকে ধন্যবাদ ধাপ মুরগি এবং আর্নল্ড পামার স্পেস এবং অপ্রয়োজনীয় প্রথম বন্ধনী 20 অক্ষর বন্ধ খেউরি জন্য!

s=input()
c=[(s.index(l),i)for l in s for i,v in enumerate(l)if'*'==v]
n=[set([d for d in c if-2<d[0]-v[0]<2and-2<d[1]-v[1]<2])for v in c]
f=lambda x,p=0:p if x&n[p]else f(x,p+1)
print len(set(map(f,n)))

আমি ভেবেছিলাম তালিকার বোধগম্যতা ব্যবহার করা বাইটের সংখ্যা হ্রাস করতে পারে তবে এটি কোনও উল্লেখযোগ্য উন্নতি দেয় নি।

এখানে চেষ্টা করুন।

আমি এটিকে এন (প্রতিবেশী) তালিকার চারপাশে ছাঁটাই করার চেষ্টা চালিয়ে যাচ্ছি, তবে আমি সফল হইনি। এই বিভাগটির জন্য অন্য কারও কিছু ধারণা থাকতে পারে।


পিপিসিজিতে আপনাকে স্বাগতম! এখানে কিছু স্থান সরিয়ে 217 বাইট রয়েছে। পাইথন পার্সারটি সত্যিই নিখুঁত: পি
স্টিফেন

আপনার প্রয়োজনের চেয়ে আরও সাদা অংশ রয়েছে। (s.index(l),i)এবং for, enumerate(l)এবং if, -v[0])<2এবং and, p=0:এবং p, এবং bool(x&n[p])এবং এর মধ্যে ফাঁকা স্থানগুলি সরান else। আপনার প্রিন্ট স্টেটমেন্টে প্রয়োজনের চেয়ে আরও বেশি বন্ধনী রয়েছে, যেহেতু আপনার চারপাশে দুটি গ্রুপ রয়েছে set। সম্পাদনা করুন: স্টেপহেন দ্বারা প্রহার করুন মোবাইলে স্টাফ করানো আদর্শ নয়।
আর্নল্ড পামার

203 বাইটস @ স্টেপহেন এবং আমার পরামর্শগুলিকে একত্রিত করে, শর্তাবলী কিছুটা পরিবর্তন করেছে।
আর্নল্ড পামার

সাহায্যের জন্য আপনাকে উভয় ধন্যবাদ! পাইথনের
লেন্সটি

0

পার্ল 5 , 100 বাইট

-p0পতাকাগুলির জন্য 98 বাইট কোড + 2 বাইট

/.*/;$@="@+"-1;$~="(.?.?.{$@})?";(s/X$~\*/X$1X/s||s/\*$~X/X$1X/s)&&redo;s/\*/X/&&++$\&&redo}{$\|=0

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

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


0

পাইথন 2, 233 বাইট

অন্যান্য উত্তরের তুলনায় খুব দীর্ঘ। এই প্রশ্নের উত্তর আমার পোর্ট ।
এটি অনলাইনে চেষ্টা করুন

A=input()
c=0
X=len(A[0])-1
Y=len(A)-1
def C(T):
 x,y=T
 if A[y][x]<'.':A[y][x]='.';map(C,zip([x]*3+[min(x+1,X)]*3+[max(x-1,0)]*3,[y,min(y+1,Y),max(y-1,0)]*3))
while'*'in sum(A,[]):i=sum(A,[]).index('*');c+=1;C((i%-~X,i/-~X))
print c

0

জাভাস্ক্রিপ্ট, 158 বাইট

function f(s){w=s.search('\n');t=s.replace(RegExp('([*@])([^]{'+w+','+(w+2)+'})?(?!\\1)[*@]'),'@$2@');return t!=s?f(t):/\*/.test(s)?f(s.replace('*','@'))+1:0}

132 বাইটের জন্য নন-কেপটিং ES6 উত্তর (ভাষা পোস্টডেটস চ্যালেঞ্জ):

f=s=>s!=(s=s.replace(RegExp(`([*@])([^]{${w=s.search`
`},${w+2}})?(?!\\1)[*@]`),`@$2@`))?f(s):/\*/.test(s)?f(s.replace(`*`,`@`))+1:0

আমার উত্তর বন্দর কত ছিদ্র? (হ্যাঁ আমি ব্যান্ডওয়াগনে ঝাঁপিয়েছি, এখন দেখলাম যে আরও দুটি লোক তাদের উত্তরগুলি পোর্ট করেছে)।


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