कोड-गोल्फ: काउंट आइलैंड्स


31

इस स्टैकओवरफ्लो प्रश्न से प्रेरित एक साधारण प्रतियोगिता :

आपको एक उपग्रह द्वारा खींची गई सतह की एक छवि दी गई है। छवि एक बिटमैप है जहां पानी को ' .' द्वारा चिह्नित किया जाता है और भूमि को ' *' द्वारा चिह्नित किया जाता है । समीप के समूह *एक द्वीप बनाते हैं। (दो ' *' निकटवर्ती हैं यदि वे क्षैतिज, लंबवत या विकर्ण पड़ोसी हैं)। आपका काम बिटमैप में द्वीपों की संख्या को प्रिंट करना है।

एक एकल *द्वीप के रूप में भी गिना जाता है।

नमूना इनपुट:

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

नमूना आउटपुट:

5

कोड में सबसे छोटी बाइट्स के साथ विनर की एंट्री होती है।


मैं तर्क नहीं समझता। एक द्वीप के रूप में माने जाने वाले शीर्ष दाएं कोने में 5 सितारे नहीं हैं? फिर आपके उदाहरण में 4 द्वीप हैं।
defhlt

स्क्रीन लपेटता नहीं है। कोनों + अकेला में से प्रत्येक में एक द्वीप *द्वीप
Claudiu

2
लेकिन आपकी परिभाषा के अनुसार, एक द्वीप '*' वर्णों का एक समूह है, जो एक से अधिक का अर्थ करता है।
अनुचर

ओह फेयर पॉइंट। स्टैंड-अलोन *s भी द्वीप हैं।
क्लाउडी

जवाबों:


30

गणितज्ञ 188 185 170 115 130 46 48 वर्ण

व्याख्या

पहले के संस्करणों में, मैंने एक दूसरे से 1 की दूरी की शतरंज की दूरी वाले पदों का एक ग्राफ बनाया। GraphComponentsतब द्वीपों की संख्या का पता चला, प्रति घटक एक।

वर्तमान संस्करण MorphologicalComponentsसरणी में उन लोगों के समूहों को खोजने और उनकी संख्या का उपयोग करता है - जिन क्षेत्रों 1में शारीरिक रूप से सन्निहित हैं। क्योंकि रेखांकन अनावश्यक है, इससे कोड की एक बड़ी अर्थव्यवस्था बन जाती है।


कोड

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

उदाहरण

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

5


यह काम किस प्रकार करता है

डेटा एक सरणी के रूप में इनपुट हैं; गणितज्ञों में, यह सूचियों की एक सूची है।

इनपुट ऐरे में, डेटा को प्रतिस्थापन द्वारा 's' 1और 0's ' में बदला जाता है

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

प्रतिस्थापन नियमों द्वारा पालन किया जाने /.वाला एक शिशु रूप कहां है ReplaceAll। यह अनिवार्य रूप से सरणी को एक काले और सफेद छवि में परिवर्तित करता है। सभी हम क्या करने की जरूरत है, समारोह लागू है Image

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

द्वीपों

सफेद वर्ग उन कोशिकाओं के अनुरूप होता है, जिनका मूल्य होता है, १।

नीचे दी गई तस्वीर कुछ चरणों को दिखाती है जो दृष्टिकोण का उपयोग करता है। इनपुट मैट्रिक्स में केवल 1's 0' और 's' शामिल हैं। आउटपुट मैट्रिक्स प्रत्येक आकृति विज्ञान क्लस्टर को एक संख्या के साथ लेबल करता है। (मैं MatrixFormउनके दो आयामी संरचना को उजागर करने के लिए इनपुट और आउटपुट मैट्रिसेस दोनों को लपेटता हूं ।)

MorphologicalComponentsजगह 1रों एक पूर्णांक प्रत्येक कोशिका के क्लस्टर नंबर करने के लिए इसी के साथ।

प्रसंस्करण

Max सबसे बड़ा क्लस्टर नंबर देता है।


द्वीपों का प्रदर्शन

Colorize प्रत्येक द्वीप को विशिष्ट रूप से रंग देगा।

colorize


यह v7 पर लिखे अनुसार काम नहीं कर रहा है क्योंकि a MorphologicalComponentsचाहता है Image, लेकिन v9 पर भी ऐसा नहीं होना चाहिए Max@MorphologicalComponents[d/.{"."->0,"*"->1}]? अर्थात्, पहले किया गया प्रतिस्थापन? Maxप्रतिस्थापन होने से पहले गायब हो जाएगा, यह नहीं होगा?
श्री। छिपकली

मेरे पास V9, @ Mr.Wizard सही है। 46 अक्षर सही संख्या है।
मुरा

@ Mr.Wizard प्रतिस्थापन को मॉर्फोलॉजिकल कॉमपर्सेंट्स के आवेदन से पहले किया जाता है। एक मिसाल होना चाहिए।
डेविड

हाय @DavidCarraher, मेरी बात "->" के बारे में नहीं है, लेकिन यह कि अभिव्यक्ति Max@MorphologicalComponents@d/.{"."->0,"*"->1}काम नहीं करती है, क्या मतलब है Max@MorphologicalComponents[d /. {"." -> 0, "*" -> 1}], इसलिए आपके पास एक और चरित्र है।
मुरा

9

रूबी 1.9 (134 121 113 110)

पहले कमांड-लाइन तर्क के रूप में मैप को स्टैडेन या मैप के फ़ाइल नाम पर ले जाता है, और टालने के लिए द्वीपों की संख्या को प्रिंट करता है। एक बुनियादी पुनरावर्ती बाढ़-भराव का उपयोग करना। सुधार हमेशा की तरह स्वागत है!

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

डेविड की colorize के समान, आप भी इसे बदल कर अलग द्वीपों प्रदर्शित करने के लिए प्राप्त कर सकते हैं $_[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)))

मैंने सोचा था कि लिस्ट कॉम्प्रिहेंशन का उपयोग करने से बाइट्स की संख्या कम हो सकती है, लेकिन यह कोई महत्वपूर्ण सुधार प्रदान नहीं करता है।

इसे यहाँ आज़माएँ।

मैं इसे n (पड़ोसियों) सूची के आसपास ट्रिम करने की कोशिश करता रहता हूं, लेकिन मैं सफल नहीं हुआ हूं। हो सकता है कि उस अनुभाग के लिए किसी और के पास कुछ विचार होंगे।


PPCG में आपका स्वागत है! यहाँ कुछ रिक्त स्थान को हटाकर 217 बाइट्स है। पायथन पार्सर वास्तव में उदार है: पी
स्टीफन

आपके पास जरूरत से ज्यादा व्हाट्सएप है। (s.index(l),i)और for, enumerate(l)और if, -v[0])<2और and, p=0:और p, और bool(x&n[p])और के बीच रिक्त स्थान निकालें else। आपके पास अपने प्रिंट स्टेटमेंट में आवश्यकता से अधिक कोष्ठक भी हैं, क्योंकि आपके पास 2 समूह हैं set। संपादित करें: मोबाइल पर सामान रखने के कारण स्टीफन द्वारा हराया गया आदर्श नहीं है।
अर्नोल्ड पामर

203 बाइट्स @ स्टेपहेन और मेरे सुझावों के संयोजन के साथ साथ, हालत को थोड़ा बदलकर।
अर्नोल्ड पामर

मदद के लिए आप दोनों को धन्यवाद! पायथन की उदारता मुझे आश्चर्यचकित करती है
:)

0

पर्ल 5 , 100 बाइट्स

-p0झंडे के लिए कोड + 2 बाइट्स के 98 बाइट्स ।

/.*/;$@="@+"-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 बाइट्स के लिए ईएस 6 जवाब (भाषा पोस्टडेट्स चैलेंज) को नॉनकंपेटिंग:

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

कितने छेदों के लिए मेरे जवाब का पोर्ट ? (हाँ, मैं बैंडवागन पर कूद रहा हूं, अब जब मैंने दो अन्य लोगों को उनके उत्तर दिखाते हुए देखा है)।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.