সার্কেল মোড়গুলিতে একচেটিয়া অঞ্চল সন্ধান করা


17

এখানে আপনার জন্য একটি প্রতারণামূলক চ্যালেঞ্জিং জ্যামিতি ধাঁধা!

একটি বৃত্ত দেওয়া A, এবং nঅন্যান্য চেনাশোনা B[n], মোট আয়তন অন্তর্ভুক্ত এটি মধ্যে Aযে না কোন বৃত্তের মধ্যে B

আপনার কোডটি যতটা সম্ভব সংক্ষিপ্ত হওয়া উচিত।

ইনপুট

আপনার ইনপুটটিতে নিম্নলিখিত তথ্য থাকা উচিত:

  • বৃত্তের ব্যাসার্ধকে উপস্থাপন করার জন্য একটি ভাসমান-পয়েন্ট সংখ্যা A
  • চেনাশোনাগুলির রেডিয়িকে উপস্থাপন করতে ভাসমান-পয়েন্ট সংখ্যাগুলির একটি তালিকা B
  • চেনাশোনাগুলির কেন্দ্রগুলির একটি তালিকা B। আপনার প্রোগ্রামটি মেরু বা কার্টেসিয়ান স্থানাঙ্কগুলির মধ্যে কেন্দ্রগুলি আশা করতে পারে।
  • Allyচ্ছিকভাবে, আপনি nবি তে চেনাশোনা সংখ্যা পেতে পারেন এই ইনপুটটির প্রয়োজন নেই।

এটি অনুমান করা হবে যে বৃত্তের কেন্দ্রটি Aমূল, অর্থ, এটি (0, 0)

এটি গ্যারান্টিযুক্ত যে কোনও দুটি চেনাশোনা Bসদৃশ নয় তবে এটি গ্যারান্টিযুক্ত নয় যে: সমস্ত Bছেদ ছেদ করে A, সমস্ত কেন্দ্রগুলি Bবাইরে থাকে Aবা দুটি বৃত্ত Bএকে অপরকে ছেদ করে না। আপনার সমাধানটি বিভিন্ন প্রান্তের কেস পরিচালনা করতে পারে তা নিশ্চিত করুন।

আপনি কোনও ক্রমে এবং পাঠ্য ইনপুট আকারে (স্ট্ডিন বা আপনার ভাষার সমতুল্য), ফাংশন প্যারামিটার বা কমান্ড-লাইন আর্গুমেন্টের ইনপুট পেতে পারেন।

আপনি যদি পাঠ্য ইনপুট গ্রহণ করতে চান, তবে ইনপুটের টুকরোগুলির মধ্যে এক বা দুই-অক্ষরের মুদ্রণযোগ্য ASCII সীমানাঙ্ক থাকা উচিত।

আউটপুট

আপনার প্রোগ্রাম বা ফাংশনটির Aচেনাশোনাগুলির মধ্যে কোনওরকমের মোট ক্ষেত্রের প্রতিনিধিত্ব করে এমন একক ভাসমান-পয়েন্ট সংখ্যা আউটপুট করা উচিত B। আপনার উত্তরগুলি সমস্ত পরীক্ষার ক্ষেত্রে কমপক্ষে তিনটি গুরুত্বপূর্ণ ব্যক্তির কাছে নির্ভুল হওয়া উচিত।

সাধারণ বিধি প্রযোজ্য।

আপনার সমাধানটি কোনও অঞ্চল নির্ধারণের জন্য চেনাশোনাগুলির মধ্যে স্যাম্পলিং পয়েন্টগুলির উপর নির্ভর করবে না।

বিল্ট-ইনগুলি যা স্বয়ংক্রিয়ভাবে চেনাশোনাগুলির ছেদগুলি সনাক্ত করে, চেনাশোনাগুলির ছেদগুলির মধ্যে অঞ্চলগুলি সন্ধান করে বা অবিলম্বে এই সমস্যার সমাধান করে তা মঞ্জুরিপ্রাপ্ত নয়।

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

প্রতিটি চিত্রে চেনাশোনাটি Aনীল রঙে বর্ণিত হয়, চেনাশোনাগুলি Bসবুজ এবং ভরা কালোতে বর্ণিত হয়। যে অঞ্চলটি ফেরত দেওয়া উচিত সেগুলি পূর্ণ লাল।

( আমার সমাধানগুলি পরীক্ষা করার জন্য রাইনার পি। কে বিশেষ ধন্যবাদ )

পরীক্ষার কেস 1:

A = {x: 0, y: 0, rad: 50}
B[0] = {x: 0, y: 0, rad: 100}

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

Result: 0.00

পরীক্ষার কেস 2:

A = {x: 0, y: 0, rad: 100.000000}
B[0] = {x: 100.000000, y: 0.000000, rad: 50.000000}
B[1] = {x: 30.901699, y: -95.105652, rad: 50.000000}
B[2] = {x: -80.901699, y: -58.778525, rad: 50.000000}
B[3] = {x: -80.901699, y: 58.778525, rad: 50.000000}
B[4] = {x: 30.901699, y: 95.105652, rad: 50.000000}

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

Result: 1.3878e+04

পরীক্ষার কেস 3:

A = {x: 0, y: 0, rad: 138}
B[0] = {x: 100, y: 0, rad: 100}
B[1] = {x: -50, y: -86, rad: 100} 
B[2] = {x: -93, y: 135, rad: 50}

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

Result: 1.8969e+04

পরীক্ষার কেস 4:

A = {x: 0, y: 0, rad: 121.593585}
B[0] = {x: 81.000000, y: 107.000000, rad: 59.841457}
B[1] = {x: -152.000000, y: -147.000000, rad: 50.000000}
B[2] = {x: 43.000000, y: -127.000000, rad: 105.118980}
B[3] = {x: 0.000000, y: -72.000000, rad: 57.870545}
B[4] = {x: -97.000000, y: -81.000000, rad: 98.488578}
B[5] = {x: -72.000000, y: 116.000000, rad: 66.468037}
B[6] = {x: 2.000000, y: 51.000000, rad: 50.000000}

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

Result: 1.1264e+04

পরীক্ষার কেস 5:

A = {x: 0, y: 0, rad: 121.605921}
B[0] = {x: 0.000000, y: -293.000000, rad: 250.000000}
B[1] = {x: 0.000000, y: -56.000000, rad: 78.230429}
B[2] = {x: 0.000000, y: -102.000000, rad: 100.000000}

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

Result: 2.6742e+04

প্রস্তাবিত পড়া:

ফেওয়েল, এমপি "তিনটি চেনাশোনাগুলির সাধারণ ওভারল্যাপের অঞ্চল"। অক্টোবর 2006. ওয়েব। http://dspace.dsto.defence.gov.au/dspace/bitstream/1947/4551/4/DSTO-TN-0722.PR.pdf


দু'টি বৃত্তের জন্য সমস্যাটি কতটা সহজ on তার উপর ভিত্তি করে আমি এটির কাজ করার সময় দুই বছর আগে নিজেকে সমাধান করার চেষ্টা করেছি । আপনার লিঙ্ক করা কাগজটি পড়ে শেষ করে দিয়েছি ... এবং অঞ্চলটি মন্টি কার্লো'য়ের সাথে যাওয়ার সিদ্ধান্ত নিয়েছি। "আপনার সমাধানটি কোনও অঞ্চল নির্ধারণের জন্য চেনাশোনাগুলির মধ্যে স্যাম্পলিং পয়েন্টগুলির উপর নির্ভর করা উচিত নয়।" ডি:
মার্টিন এন্ডার

আপনার কাছে এমন কোনও পরীক্ষার মামলা বলে মনে হচ্ছে না যেখানে একটি বৃত্তে Bঅন্য একটি থাকে। যোগ করা উচিত হতে পারে।
মার্টিন ইন্ডার

আপনি কি তৃতীয় পরীক্ষার কেসটি পরীক্ষা করতে পারবেন? আমি পেয়ে করছি 1.8970e+04
LegionMammal978

@ মার্টিনবাটনার আমিও দুর্ঘটনার কারণে সমস্যার মুখোমুখি হয়েছি। আমি আমার সমাধানটিতে অত্যধিক সন্তুষ্ট নই, তবে এটি কার্যকর বলে মনে হচ্ছে। আমি সেই মামলার জন্য একটু পরীক্ষা করার চেষ্টা করব, ধন্যবাদ!
ব্রেইনস্টিল

@ LegionMammal978 হ্যাঁ, মনে হচ্ছে কেসটি ভুল। আমি চেনাশোনা মধ্যে ছেদ জন্য নিম্নলিখিত তথ্য আছে: B[0] - A intersection: 20653.659515, B[1] - A intersection: 20757.824115, B[1] - B[0] intersection: 1841.847766, B[2] - A intersection: 1289.164541, যা উৎপাদ 18969.69009উত্তর হিসাবে।
ব্রেইনস্টিল

উত্তর:


14

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

from cmath import*
C=input()
O,R=C[0]
def I(p,r,q,s):
 try:q-=p;d=abs(q*q);x=(r*r-s*s+d)/d/2;return[p+q*(x+z*(r*r/d-x*x)**.5)for z in-1j,1j]
 except:return[]
S=sorted
V=S(i.real for p,r in C for c in C for i in[p-r,p+r]+I(p,r,*c)if-R<=(i-O).real<=R)
A=pi*R*R
for l,r in zip(V,V[1:]):
 H=[]
 for p,t in C:
    try:
     for s in-1,1:a,b=[p.imag+s*(t*t-(p.real-x)**2)**.5for x in l,r];H+=[a+b,a,b,s,t,p],
    except:0
 a,b=H[:2];H=S(H[2:]);n=0;c=a
 for d in H:
    s=d[3];z=.5;H*=d<b
    for q,w,e,_,t,y in(c,min(d,b))*(n-s<(a<d)or[0]*n>H):\
g=phase((l+w*1j-y)/(r+e*1j-y));A-=abs(g-sin(g)).real*t*t/2-z*q*(r-l);z=-z
    n-=s
    if(a<d)*s*n==-1:c=d
print A

এর আগে লাইন ব্রেকগুলি \সহজ পড়ার জন্য, এবং স্কোর হিসাবে গণনা করা হয় না।

জোড়ের তালিকা হিসাবে STDIN এর মাধ্যমে ইনপুট পড়ুন (center, radius), যেখানে centerফর্মটিতে একটি জটিল সংখ্যা X+Yj। তালিকার প্রথম বৃত্তটি হ'ল A (যার কেন্দ্রটি মূল হতে হবে না), এবং তালিকার বাকি অংশটি বি । ফলাফলটি STDOUT এ মুদ্রণ করে।

উদাহরণ

Input:  (0+0j, 138),  (100+0j, 100), (-50+-86j, 100), (-93+135j, 50)
Output: 18969.6900901

ব্যাখ্যা

এটি মার্টিন বাটনার এর একটি স্ব-আন্তঃস্কেটিং বহুভুজ চ্যালেঞ্জের অঞ্চল সম্পর্কে আমার সমাধানের ক্ষেত্রে একটি (দীর্ঘতর এবং আরও কৃপণকর: পি) প্রকরণ । এটি সমস্যাটিকে ছোট ছোট পর্যায়ে বিভক্ত করার একই কৌশল ব্যবহার করে, যার জন্য এটি আরও পরিচালিত হয়।

আমরা সমস্ত জোড়ার চেনাশোনাগুলির মধ্যে ছেদ বিন্দুগুলি খুঁজে পাই (উভয় এবং বি এর চেনাশোনা বিবেচনা করে ) এবং এর প্রতিটি মধ্য দিয়ে একটি উল্লম্ব রেখাটি পাস করি। অতিরিক্তভাবে, আমরা সমস্ত উল্লম্ব রেখাগুলি স্পর্শ করে যেকোন চেনাশোনাতে। আমরা দূরে সব লাইন যে ছেদ না নিক্ষেপ একটি , যাতে সমস্ত অবশিষ্ট লাইনের বাম এবং ডান tangents মধ্যে হয় একজন

চিত্র 1

আমরা উপরের চিত্রের -এর গা red় লাল অঞ্চলের A এর ছেদটি এবং বৃত্তগুলির মিলনের ক্ষেত্রের সন্ধান করছি। ফলাফলটি পেতে আমাদের থেকে বিয়োগ করতে হবে।

একটানা প্রতিটি উল্লম্ব রেখার জোড়ার মধ্যে এই অঞ্চলটি প্রতিটি পায়ের পাশে একটি "অতিরিক্ত" চাপের খণ্ডের সাহায্যে ভাঙ্গা ট্র্যাপিজয়েডগুলির একটি সেট (বা ত্রিভুজ, বা লাইন বিভাগগুলি, ট্র্যাপিজয়েডগুলির বিশেষ ক্ষেত্রে হিসাবে) ভাঙা যায়। আমরা যতটা উল্লম্ব রেখাগুলি পাস করি তা গ্যারান্টি দেয় যে সীমাবদ্ধ অঞ্চলটি এর চেয়ে সত্যই আর জটিল নয়, যেহেতু অন্য দুটি চৌকো রেখার মাঝে একটি অতিরিক্ত উল্লম্ব রেখা থাকতে হবে এবং তাই একটি অতিরিক্ত উল্লম্ব রেখা থাকতে হবে প্রশ্ন।

চিত্র ২

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

এই আরকগুলির সমস্ত প্রাসঙ্গিক নয়; আমরা কেবল সেইগুলিতে আগ্রহী যা এবং বি এর ইউনিয়নের মধ্যে ছেদ করার সীমানায় রয়েছে । এগুলি সন্ধান করার জন্য, আমরা আরকসকে উপরের থেকে নীচে বাছাই করি (নোট করুন যে চাপগুলি একে অপরকে যথাযথভাবে ছেদ করতে পারে না, যেহেতু এটি দুটি আমরা বিবেচনা করছি এর মধ্যে অন্য উল্লম্ব রেখার অস্তিত্বকে বোঝায়, এবং তাই এটি কথা বলার অর্থবোধ করে একটি স্বেচ্ছাকর্মী তোরণ উপরে বা অন্য যে কোনওটির নীচে রয়েছে about

চিত্র 3

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

এর অঞ্চল এবং ট্র্যাপিজয়েডগুলির ক্ষেত্রগুলি গণনা করা মোটামুটি সোজা এগিয়ে forward প্রতিটি চাপের ক্ষেত্রের ক্ষেত্রফলটি সংশ্লিষ্ট বৃত্তাকার ক্ষেত্রের ক্ষেত্রফল, ত্রিভুজের ক্ষেত্রফল বিয়োগফল যার কোণগুলি খিল খণ্ডের দুটি প্রান্ত এবং একই বৃত্তের কেন্দ্রস্থল।

চিত্র 4


1
এটি আমি যে ধরণের সমাধানের জন্য বিবেচনা করছিলাম তা বাদ দিয়ে আমি এয়ার বিতে নয় তবে ট্র্যাকারস এবং ট্র্যাপারিকগুলি খুঁজে পেয়ে সরাসরি লক্ষ্য অঞ্চলটি খুঁজে পেতাম (যার অঞ্চলগুলি অবশ্যই একটি ত্রিভুজ বা ট্র্যাপিজয়েড থেকে একটি আর্ক সেগমেন্ট বিয়োগ করে সন্ধান করতে হবে)।
কুইন্টোপিয়া

@ কুইন্টোপিয়া এটি এমনকি একটি ছোট্ট বিট আরও সংক্ষিপ্ত হতে পারে, যেহেতু এটি আমাদের A এর ক্ষেত্র গণনা করার প্রয়োজনীয়তা সংরক্ষণ করে এবং এটির জন্য প্রয়োজনীয় সমস্ত কিছুই সম্ভবত এন এর শর্তটি নিয়ে কিছুটা খেলে ।
Ell

@quintopia OTOH, আপনি একটি ইতিবাচক চাপ পায়ে এক পাশে থাকার সম্ভাবনা জন্য অ্যাকাউন্ট করতে হবে যদি এটি একটি বৃত্তচাপের অংশ রয়েছে একটি , তাই কে জানে ...
Ell

দুর্দান্ত সমাধান। এর প্রায় অনুরূপ একটি সমস্যাটি গত রাতে আমার মাথায় আটকে গিয়েছিল এবং আমি সত্যিই চাইছিলাম যে কেউ এটির সমাধান করুন। আপনার সমাধানটি আরও ভাল যে আমি যে ধারণাগুলি নিয়ে কাজ করেছিলাম।
লজিক নাইট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.