পথ-বিভাগের মতো; প্রথমবারের জন্য স্পর্শ


14

2 বা ততোধিক 2 ডি কার্টেসিয়ান পয়েন্টের একটি আদেশযুক্ত তালিকা দেওয়া, যদি পথটি নিজেকে স্পর্শ করে বা স্ব-ছেদ করে তবে সত্যবাদী মান নির্ধারণ করুন; অন্যথায় একটি মিথ্যা মান আউটপুট যদি এটি নিজের বা নিজেকে ছেদ না করে।

আপনি ধরে নিতে পারেন তালিকার একটানা পয়েন্টগুলি আলাদা।

উদাহরণ:

(0,0), (1,0) -> falsey
(0,0), (1,0), (0,0) -> truthy
(0,0), (1,0), (1,1), (0,0) -> truthy
(0,0), (2,0), (1,1), (1,-1) -> truthy
(0,0), (10,0), (0,1), (10,1), (0,2), (10,2) -> falsey

আমি এখানে যে সমস্ত সমন্বয়গুলি দিয়েছি তা পূর্ণসংখ্যা হিসাবে নোট করুন। আপনি {পূর্ণসংখ্যা, দশমিক, যুক্তিবাদী, ভাসমান পয়েন্ট, ... of এর বাইরে যা পছন্দ করেন তার সমন্বয়মূলক ইনপুটগুলিকে সমর্থন করতে পারেন} তবে আপনার বাস্তবায়ন গণনার অবশ্যই প্রদত্ত যে কোনও ইনপুটগুলির সঠিক উত্তর দিতে হবে।


4
কী ভাল শিরোনাম এ +
আন্ডারগ্রাউন্ডোমোনরাইল

প্রাথমিক দৃশ্য এর জলাধার কুকুর , কেউ কি আছেন?
লুইস মেন্ডো

আমি ভুল বুঝে থাকলে আমাকে ক্ষমা করুন তবে শেষ পরীক্ষার কেসটি একে অপরকে ছেদ করার পদ্ধতিটি কেমন? i.imgur.com/wiNMByd.png
4hu17

2
@ আইক্রিওয়ারিটিম এটি কোনও বদ্ধ পদচারণ নয়। শেষ পয়েন্টটি প্রথমটির সাথে সংযুক্ত হয় না।
হাইপারনিউট্রিনো

উত্তর:


5

পাইথন 2 , 315 309 298 382 380 372 বাইট

s=sorted
w=lambda(x,y),(X,Y),(z,w):(X-x)*(w-y)-(z-x)*(Y-y)
def I(a,b):p,q=s(a);P,Q=s(b);n,N,m,M=w(p,q,P),w(p,q,Q),w(P,Q,p),w(P,Q,q);return(q>=P)*(Q>=p)if{n,N,m,M}=={0}else(b[1]!=a[0])*(n*N<=0>=m*M)
def f(l):
 i=0
 while i<len(l)-2:
	x=l[i:i+3];i+=1
	if w(*x)==0and s(x)==x:l.pop(i);i-=1
 L=zip(l,l[1:]);return any(I(*l)for l in[(k,x)for i,k in enumerate(L)for x in L[:i]])

এটি অনলাইন চেষ্টা করুন!

কলিনারি বিভাগগুলির জন্য এই এসও উত্তরের সাথে মিলিত হয়ে এখান থেকে অ্যালগরিদম ব্যবহার করে ।

সম্পাদনা করুন: একই বিন্দুতে অবিরত রেখাংশগুলির জন্য স্থির (যেমন (0,0),(1,0),(2,0)) মাঝের পয়েন্টটি সরিয়ে, (ফলে (0,0),(2,0))।


দুটি স্পেসের দুটি উপস্থিতিকে একক ট্যাবে প্রতিস্থাপন করে আপনি দুটি বাইট সংরক্ষণ করতে পারেন।
জোনাথন ফ্রেচ 15

*((n*N>0)+(m*M>0)<1)-> *(n*N<=0>=m*M)
জোনাথন ফ্রেচ

3

ইউক্লিডস , 154 148 বাইট

number i (set p)
g=card(p);h=g;n=0;e=p[0];q=e.e
for d in p
if h<g-1 
q=q.e
n=card(intersection(d.e,q))>1or d on q?1|n
end
e=d;h=h-1
end;return n;end

ফাংশনটির নাম i, পয়েন্টের একটি সেট পাস হয়ে 0 বা 1 প্রদান করে যাইহোক এখানে প্রায় কোড।

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

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

সম্পাদনা করুন : এর orআগে কোনও স্থান অপসারণের জন্য স্টেটমেন্টটি পুনরায় অর্ডার করে 1 বাইট কেটে দিন or; সেই ifব্লকটিকে টেরিনারি অপারেশনে পরিবর্তন করে আরও 5 টি বাইট ।

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

ta=point(0,0).point(1,0)
tb=point(0,0).point(1,0).point(0,0)
tc=point(0,0).point(1,0).point(1,1).point(0,0)
td=point(0,0).point(2,0).point(1,1).point(1,-1)
te=point(0,0).point(10,0).point(0,1).point(10,1).point(0,2).point(10,2)
print i(ta);print i(tb);print i(tc);print i(td);print i(te)

0
1
1
1
0
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.