अजगर 2 + पीआईएल, कोई त्रुटि नहीं, 313 307 बाइट्स
from Image import*
I=open(sys.argv[1])
w,h=I.size;D=I.getdata()
B={i%w+i/w*1j for i in range(w*h)if D[i]!=D[0]}
n=d=1;o=v=q=p=max(B,key=abs)
while p-w:
p+=d*1j;e=2*({p}<B)+({p+d}<B)
if e!=2:e%=2;d*=1j-e*2j;p-=d/1j**e
if abs(p-q)>5:
t=(q-v)*(p-q).conjugate();q=p;w=o
if.98*abs(t)>t.real:n+=1;v=p
print n
कमांड लाइन पर एक छवि फ़ाइल नाम लेता है, और परिणाम को STDOUT में प्रिंट करता है।
सभी परीक्षणों के लिए सही परिणाम देता है, और सर्कल के लिए n = 28।
व्याख्या
एल्गोरिथ्म बहुभुज की परिधि के साथ चलने से काम करता है, और सामना किए गए कोने की संख्या (दिशा में परिवर्तन के रूप में पाया गया) की गिनती करता है। हम मूल से दूर पिक्सेल पर शुरू करते हैं, o
जो एक शीर्ष होने की गारंटी है, और इसलिए, एक किनारे (यानी, अग्रभूमि पिक्सेल और एक पृष्ठभूमि पिक्सेल के बीच की सीमा) से सटे होने के लिए। हम अपनी स्थिति पर नज़र रखते हैं p
, सबसे हालिया वर्टेक्स v
, और सबसे हालिया "चेकपॉइंट", q
जिनमें से सभी शुरू में बराबर हैं o
। हम d
वर्तमान पिक्सेल के सापेक्ष, किनारे की दिशा का भी ध्यान रखते हैं ; , या फिर यह मूल से दूर नहीं होगा। हम किनारे की ओर बढ़ते हैं, एक दिशा में , जैसे किd
प्रारंभ में पूर्व की ओर इंगित करता है, जो कि एक सुरक्षित दिशा है, क्योंकि हम जानते हैं कि पूर्व की ओर एक धार हैo
d
d
हमारे बाएं ओर, यानी एक दक्षिणावर्त दिशा में। जब भी हम "किनारे से गिरते हैं", अर्थात, किसी भी स्थिति में जहां p
बहुभुज के बाहर होता है, या जहां हमारे बाईं ओर पिक्सेल (यानी की दिशा में d
) बहुभुज के अंदर होता है, हम समायोजन करते हैं p
और d
तदनुसार फिर से शुरू होने से पहले।
हर बार के बीच की दूरी p
और पिछले चौकी, q
, 5 से भी बड़ा हो जाता है, हम यह निर्धारित करने कि क्या हम के बीच एक शीर्ष पर पारित करने की कोशिश q
और p
हम बीच के कोण की तुलना vq
(यानी, से वेक्टर v
के लिए q
) है, जो की सामान्य दिशा है बहुभुज की तरफ हम साथ चल रहे थे जब हम अंतिम चौकी पर पहुंचे थे, और qp
अंतिम चौकी और वर्तमान स्थिति के बीच विस्थापन। यदि कोण लगभग 10 ° से अधिक है, तो हम निष्कर्ष निकालते हैं कि हम बहुभुज के एक अलग पक्ष के साथ चल रहे हैं, वर्टिकल काउंट बढ़ाएं और सेट करें v
, वर्तमान वर्टेक्स, को p
। प्रत्येक चेकपॉइंट पर, भले ही हमने एक वर्टेक्स का पता लगाया हो या नहीं, हम अपडेट करते हैंq
, अंतिम चेकपॉइंट, कोp
। हम इस फैशन को तब तक जारी रखते हैं जब तक कि हम वापस नहीं आ जाते हैं o
, शुरुआती बिंदु, और पाए गए कोने की संख्या को वापस कर दें (ध्यान दें कि प्रारंभ में गिनती 1 है, चूंकि प्रारंभिक बिंदु, o
स्वयं एक शीर्ष बिंदु है।)
नीचे दी गई छवियां पता चला कोने दिखाती हैं। ध्यान दें p
, प्रत्येक चेकपॉइंट पर वर्तमान स्थिति, चूंकि नई शीर्ष की स्थिति इष्टतम नहीं है, क्योंकि असली शीर्ष शायद अंतिम चेकपॉइंट के बीच कहीं है q
, और p
, परिधि के साथ। जैसा कि आप देख सकते हैं, पहले वाले (आम तौर पर, नीचे-दाएं शीर्ष) के अलावा अन्य सभी कोने थोड़ा बंद हैं। इसे ठीक करने पर अधिक बाइट खर्च होंगे, लेकिन ऐसा लगता है कि यह पर्याप्त रूप से काम कर रहा है। यह कहा जा रहा है, केवल चार परीक्षण मामलों के साथ ओवरफिट नहीं करना थोड़ा कठिन है।