বহুভুজের পক্ষের সংখ্যা গণনা করুন


18

বহুভুজের পক্ষের সংখ্যা গণনা করুন

বহুভুজ পার্শ্ব-গণনা রোবট এর আগে কাউকে কিছু না বলে বিশ্ব ভ্রমণ করার সিদ্ধান্ত নিয়েছে, তবে এটি অত্যন্ত গুরুত্বপূর্ণ যে বহুভুজ গণনার প্রক্রিয়া খুব বেশি সময়ের জন্য বন্ধ করা হয়নি। সুতরাং আপনার নিম্নলিখিত কাজটি রয়েছে: বহুভুজটির একটি কালো এবং সাদা চিত্র দেওয়া, আপনার প্রোগ্রাম / ফান্টকইনটির পক্ষের সংখ্যাটি ফিরিয়ে দেওয়া উচিত।

প্রোগ্রামটি কোনও পুরানো পাঞ্চ কার্ড কম্পিউটারকে খাওয়ানো হবে এবং আজকাল পঞ্চকার্ডগুলি যেহেতু খুব ব্যয়বহুল, আপনি নিজের প্রোগ্রামটিকে যতটা সম্ভব সংক্ষিপ্ত করে তোলার চেষ্টা করুন।

প্রান্তগুলি কমপক্ষে 10 পিক্সেল দীর্ঘ এবং দুটি অ্যাডজেন্ট প্রান্ত দ্বারা গঠিত কোণগুলি কমপক্ষে 10 ° তবে 170 than (বা আবার 190 than এর বেশি নয়) এর বেশি নয়। বহুভুজ পুরোপুরি চিত্রের মধ্যে রয়েছে এবং বহুভুজের পাশাপাশি এটি পরিপূরকটি সংযুক্ত রয়েছে (কোনও বিচ্ছিন্ন দ্বীপ নেই) সুতরাং এই ইনপুটটি বৈধ হবে না :

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

স্কোরিং

এটি কোডগল্ফ, এর অর্থ বাইট জেতে সংক্ষিপ্ততম জমা, আপনার জমাতে প্রতিটি পরীক্ষার ক্ষেত্রে সঠিক সংখ্যার সন্ধান করতে হবে। (এবং জমা দেওয়ার ক্ষেত্রে অন্যান্য ক্ষেত্রেও কাজ করা উচিত, কেবলমাত্র সেই পরীক্ষার ক্ষেত্রে অপ্টিমাইজেশন অনুমোদিত নয় allowed)

আপনি যদি এমন একটি সমাধান জমা দিতে চান যা প্রতিবারের মতো সঠিক নম্বরটি খুঁজে না পায়, আপনি এটিও জমা দিতে পারেন, তবে এটি আরও ভাল সম্পাদনকারী সমস্ত জমা দেওয়ার পিছনে স্থান পাবে।

দয়া করে আপনার জমা দেওয়ার শিরোনামে মোট সংখ্যা অন্তর্ভুক্ত করুন। (মোট ত্রুটি পার্শ্বের আসল সংখ্যা এবং প্রতিটি আউটপুটের মধ্যে পরম পার্থক্যগুলির যোগফল)।

পরীক্ষার মামলা

এন = 10

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

এন = 36

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

n = 7

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

এন = 5

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

এটি কৌতূহলের বাইরে, এটি কোনও পরীক্ষার কেস নয়: এই ইনপুটটির জন্য আপনি কতগুলি কিনারা পান?

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


আমি আপনার পরীক্ষার ক্ষেত্রে অনেকগুলি কোণ দেখতে পাই যা 170 ° এর চেয়ে বেশি ° উদাহরণস্বরূপ, আপনার নক্ষত্রের সমস্ত "অ-পয়েন্ট" কোণ (কেন্দ্রের নিকটবর্তী)
ডুরকনব

@ ডুরকনব এটি ছোট কোণ যা 170 than এর চেয়ে কম হওয়া উচিত °
lirtosiast

হ্যাঁ, তবে সেগুলি আবার 190 than এর চেয়ে বড় ° এই বিধিনিষেধের বিষয়টি হ'ল উদাহরণগুলি মুছে ফেলা যেখানে দুটি অ্যাডজেন্ট পক্ষ পৃথকভাবে বলা শক্ত।
flawr

2
বহুভুজের অভ্যন্তর কোন রঙ?
শুক্রবার

1
প্রোগ্রামটি একটি পুরানো পাঞ্চ কার্ড কম্পিউটারকে খাওয়ানো হবে, এবং আজকাল পঞ্চকার্ডগুলি খুব ব্যয়বহুল হওয়ায় আপনি নিজের প্রোগ্রামটি যতটা সম্ভব সংক্ষিপ্ত করে তোলার চেষ্টা করুন :-)
লুইস মেন্ডো

উত্তর:


12

পাইথন 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, ঘের করেন। আপনি দেখতে পাচ্ছেন, প্রথমটি (সাধারণত নীচে-ডানদিকের ভার্টেক্স) ব্যতীত অন্য সমস্ত শীর্ষবিন্দু কিছুটা বন্ধ। এটি ঠিক করার জন্য আরও বাইট খরচ পড়বে, তবে এটি এটি ঠিক মতো কাজ করছে বলে মনে হচ্ছে। যা বলা হচ্ছে, কেবলমাত্র চারটি পরীক্ষার কেসই বেশি মানিয়ে নেওয়া সামান্য কঠিন।

n = 10 n = 36 n = 7 n = 5 বৃত্ত


এই বিস্তারিত ব্যাখ্যার জন্য আপনাকে ধন্যবাদ! আমি আপনার চিত্র ভালোবাসি!
flawr

এর পূর্বদিকে যদি কিনারা থাকে তবে অন্য প্রান্তটি oকি উত্স থেকে আরও দূরে থাকবে না?
অ্যাডিটসু

1
@ অ্যাডিটসু আমি মনে করি পরিভাষাটি এখানে কিছুটা বিভ্রান্তিকর হতে পারে। আমরা বহুভুজের দিকগুলি , জ্যামিতিক অর্থে এবং একটি বহুগুণের গ্রাফিক হিসাবে বহুভুজটির (পিক্সেলের সমষ্টি) সেটগুলির প্রান্তগুলি সম্পর্কে কথা বলি । oউত্স থেকে পূর্বতম পিক্সেল হ'ল, সুতরাং এর পূর্বের পিক্সেলটি অবশ্যই একটি পটভূমি পিক্সেল হতে হবে, তাই আমরা বলি যে এর পূর্ব দিকে একটি প্রান্ত রয়েছে o
Ell
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.