জে, 40 39 34 বাইট
3 :'(o.1)<(>./-<./)12 o.y*+{.y'@:-
একটি অনামী ডায়াডিক ফাংশন, তার একটি আর্গুমেন্ট হিসাবে একটি পয়েন্ট, পি গ্রহণ করে এবং পয়েন্টগুলির একটি তালিকা, পি , অন্য যুক্তি হিসাবে (এটি কোন যুক্তি কোন বিষয় তা বিবেচনা করে না), এবং ফিরে 0
বা 1
, যদি পি বাইরে থাকে বা পি এর উত্তল হাল এর ভিতরে যথাক্রমে। বিন্দু পি , এবং পয়েন্ট পি , জটিল সংখ্যা হিসেবে নেয়া হয়।
উদাহরণ
is_inside =: 3 :'(o.1)<(>./-<./)12 o.y*+{.y'@:-
0.5j0.5 is_inside 0j0 0j1 1j0 1j1
1
1.5j0.5 is_inside 0j0 0j1 1j0 1j1
0
বা ...
পাইথন 2, ফাংশন, 121 103, সম্পূর্ণ প্রোগ্রাম, 162
পাইথন 3, 149 বাইট
import sys,cmath as C
p,q,*P=[complex(*eval(l.replace(*";,")))for l in sys.stdin]
A=[C.phase((r-p)/(q-p+(q==p)))for r in P]
print(max(A)-min(A)>C.pi)
এসটিডিআইএন এর মাধ্যমে মূল পোস্টের মতো একই ফর্ম্যাটে ইনপুট নেয় এবং একটি বুলিয়ান মান মুদ্রণ করে যা পি এর উত্তল হলের মধ্যে রয়েছে কিনা তা নির্দেশ করে
ব্যাখ্যা
প্রোগ্রাম পরীক্ষা সর্বোচ্চ এবং সর্বনিম্ন (স্বাক্ষরিত) মধ্যে পার্থক্য যে কোনো স্থানে মধ্যে angles কিনা R মধ্যে পি , পি , এবং একটি নির্দিষ্ট অবাধ বিন্দু কুই মধ্যে পি (আমরা শুধু প্রথম বিন্দু ব্যবহার পি ), 180 কম °। অন্য কথায়, এটা টেস্টে সব পয়েন্ট কিনা পি 180 এর একটি কোণের অন্তর্ভুক্ত করা হয় ° বা কম প্রায় পি ।
পি এর উত্তল হালতে পি থাকে এবং যদি কেবল এই শর্তটি মিথ্যা থাকে।
মনে রাখবেন, উপরে শর্ত এই বলে যে সমতূল্য: আরো কয়েকটি বাইট খরচ এ, আমরা একটি অনুরূপ পদ্ধতি যা আমাদের কাছে স্পষ্টভাবে ক্যালকুলেট কোণ প্রয়োজন হয় না ব্যবহার করতে পারেন পি এর উত্তল জাহাজের কাঠাম বাইরে পি যদি এবং কেবল যদি অস্তিত্ব আছে একটি লাইন ঠ মাধ্যমে পি , এ সব পয়েন্ট যেমন যে পি একই দিকে হয় ঠ । যেমন একটি লাইন অস্তিত্ব থাকে, তাহলে এর রয়েছে যেমন একটি লাইন যে এক (বা তার বেশি) পয়েন্ট এর ঘটনা পি (আমরা যা করতে পারেন ঘোরান ঠ পর্যন্ত এটি পয়েন্ট এক স্পর্শ পি ।)
করার জন্য (সম্ভবত) এই লাইন খুঁজে, আমরা লেট করে শুরু ঠ মাধ্যমে লাইন হতে পি এবং প্রথম বিন্দু পি । এরপরে আমরা পি এর বাকি পয়েন্টগুলি নিয়ে পুনরাবৃত্তি করি ; পয়েন্ট এক বাঁদিকে হলে ঠ (আমরা, সর্বত্র কিছু অভিমুখ অনুমান বাম বা ডান, সত্যিই কোন ব্যাপার না) আমরা প্রতিস্থাপন ঠ লাইন মাধ্যমে ক্ষণস্থায়ী সঙ্গে পি এবং যে পয়েন্ট, এবং অবিরত। পরে আমরা সর্বাঙ্গে iterated পি , যদি (এবং কেবল যদি) পি উত্তল জাহাজের কাঠাম বাহিরে হয়, তাহলে সব পয়েন্ট পি (অথবা দিকে) ডানদিকে হওয়া উচিত ঠ । আমরা পরীক্ষা করে দেখি যে পি তে পয়েন্টগুলির উপর একটি দ্বিতীয় পাস ব্যবহার করে।
পাইথন 2, 172 বাইট
import sys
P=[eval(l.replace(*";,"))for l in sys.stdin]
x,y=P.pop(0)
C=lambda(a,b),(c,d):(a-x)*(d-y)-(b-y)*(c-x)>0
l=reduce(lambda*x:x[C(*x)],P)
print any(C(l,q)for q in P)
অন্যথা, একটি একক পাস একই জিনিস করতে হবে, দিন টু--বাম-অফ কোনো দুই পয়েন্ট মধ্যে একটি realtion হতে কুই এবং দ , এ পি , যেমন যে কুই -এর বাঁদিক থেকে দ যদি কুই বাঁদিক থেকে লাইন মাধ্যমে ক্ষণস্থায়ী পি এবং দ । নোট যে-বাম-এর উপর একটি আদেশ সম্পর্ক নেই পি যদি এবং কেবল যদি এ সব পয়েন্ট পি কিছু লাইন মাধ্যমে ক্ষণস্থায়ী একই দিকে হয় পি যে, যদি, পি এর উত্তল জাহাজের কাঠাম বাইরে পি । উপরে বর্ণিত পদ্ধতিটি পি এর সর্বনিম্ন পয়েন্টটি সন্ধান করেএই অর্ডারটি ਆਰ্ট করুন, অর্থাত্ পি এর "বামতমতম" পয়েন্ট । দুটি পাস করার পরিবর্তে, আমরা সর্বাধিক (যেমন, "ডানদিকের" পয়েন্ট) পাশাপাশি সর্বনিম্ন, পি আর্টে একই পাসে একই পয়েন্টে পয়েন্ট পেতে পারি এবং যাচাই করি যে সর্বনিম্নের বাম দিকে রয়েছে সর্বাধিক, অর্থাত্ কার্যকরভাবে, যে-থেকে-বাম-এর ট্রানজিটিভ হয়।
এই ভাল কাজ করবে যদি পি এর উত্তল জাহাজের কাঠাম বাইরে পি , যে ক্ষেত্রে টু--বাম-অফ আসলে একটা অর্ডার সম্পর্ক নেই, কিন্তু ভঙ্গ করতে পারে পি (উদাহরণস্বরূপ উত্তল জাহাজের কাঠাম ভিতরে হয়, জিনিসটা কি হবে চেষ্টা যদি আমরা এই অ্যালগরিদম যেখানে পয়েন্ট দৌড়ে ঘটতে পি একটি নিয়মিত পঞ্চভূজ ছেদচিহ্ন হয়, ঘড়ির কাঁটার বিপরীতে দৌড়োনো এবং পি । কেন্দ্রবিন্দুর সাহায্যে নির্দেশিত হয়) মিটমাট করার জন্য, আমরা সামান্য অ্যালগরিদম পরিবর্তন: আমরা একটি বিন্দু নির্বাচন কুই মধ্যে পি , আর দ্বিখণ্ডিত করা P এবং q এর মধ্য দিয়ে অতিক্রমকারী রেখাটির সাথে পি (অর্থাত্, আমরা পি প্রায় Q এর কাছাকাছি ভাগ করে নিইটু-বাম-এর।) এখন আমাদের কাছে একটি "বাম অংশ" এবং পি এর একটি "ডান অংশ" রয়েছে , প্রতিটি অর্ধেক প্লেনের মধ্যে রয়েছে, যাতে বাম থেকে বামে প্রতিটিটির সাথে একটি ক্রমের সম্পর্ক থাকে; আমরা বাম অংশের সর্বনিম্ন এবং ডান অংশের সর্বাধিক সন্ধান করি এবং উপরে বর্ণিত হিসাবে সেগুলি তুলনা করি। অবশ্য, আমরা শারীরিকভাবে দ্বিখণ্ডিত করা হবে না পি , আমরা কেবল প্রতিটি বিন্দুতে শ্রেণীভুক্ত করতে পারেন পি হিসাবে আমরা একটি একক পাস, সর্বনিম্ন এবং সর্বোচ্চ জন্য, দেখুন।
পাইথন 2, 194 বাইট
import sys
P=[eval(l.replace(*";,"))for l in sys.stdin]
x,y=P.pop(0)
C=lambda(a,b),(c,d):(a-x)*(d-y)-(b-y)*(c-x)>0
l=r=P[0]
for q in P:
if C(P[0],q):l=q*C(l,q)or l
elif C(q,r):r=q
print C(l,r)