পাইথন 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 than এর চেয়ে বেশি হয় তবে আমরা উপসংহারে পৌঁছে যে আমরা বহুভুজের এক অন্য পাশ দিয়ে হাঁটছি, শীর্ষবিন্দু গণনা বৃদ্ধি করব এবং v
বর্তমান ভার্টেক্সটি সেট করব p
। প্রতিটি চেকপয়েন্টে, আমরা একটি শীর্ষবিন্দু সনাক্ত করেছি কিনা তা নির্বিশেষে, আমরা q
শেষ চেকপয়েন্টে আপডেট করেছিp
। আমরা o
প্রারম্ভিক বিন্দুতে ফিরে না আসা পর্যন্ত এই ফ্যাশনে চালিয়ে যাচ্ছি , এবং পাওয়া উল্লম্বের সংখ্যাটি ফিরে না আসা পর্যন্ত (লক্ষ্য করুন যে শীর্ষবিন্দু গণনাটি প্রথম দিক থেকে 1 o
, এটি নিজেই একটি শীর্ষবিন্দু।)
নীচের চিত্রগুলি সনাক্ত করা শীর্ষকোষগুলি দেখায়। লক্ষ্য করুন গ্রহণ p
প্রতিটি চেকপয়েন্ট এ বর্তমান অবস্থান নতুন প্রান্তবিন্দু অবস্থান যেমন, বাস্তব প্রান্তবিন্দু সম্ভবত গত চেকপয়েন্ট মধ্যে কোথাও, যেহেতু, অনুকূল নয় q
, এবং p
, ঘের করেন। আপনি দেখতে পাচ্ছেন, প্রথমটি (সাধারণত নীচে-ডানদিকের ভার্টেক্স) ব্যতীত অন্য সমস্ত শীর্ষবিন্দু কিছুটা বন্ধ। এটি ঠিক করার জন্য আরও বাইট খরচ পড়বে, তবে এটি এটি ঠিক মতো কাজ করছে বলে মনে হচ্ছে। যা বলা হচ্ছে, কেবলমাত্র চারটি পরীক্ষার কেসই বেশি মানিয়ে নেওয়া সামান্য কঠিন।