ত্রিভুজের ভিতরে বিন্দু রয়েছে কিনা তা পরীক্ষা করুন


40

আপনার লক্ষ্যটি নির্ধারিত যে প্রদত্ত 2 ডি পয়েন্ট এক্সটি প্রদত্ত উল্লম্ব A, B, C এর সাথে ত্রিভুজের ক্ষেত্রের মধ্যে রয়েছে কিনা determine

এক্স পয়েন্ট এক্স এবং তিনটি ত্রিভুজ কোণকে স্থিতিশীল করে এমন একটি ফাংশন লিখুন (সুতরাং এটি মোট 8 টি স্থানাঙ্ক) এবং বিন্দু সেই ত্রিভুজের অভ্যন্তরে অবস্থিত হলে সত্যটি প্রত্যাবর্তন করে, এবং মিথ্যা যদি বাইরে থাকে।

প্রান্ত মামলা সম্পর্কে চিন্তা করবেন না। যদি বিন্দুটি ত্রিভুজের (প্রান্ত বা প্রান্তিকের) সীমানায় থাকে বা ত্রিভুজটি আসলে একটি রেখাংশ হয়, আপনার কোড ক্রাশ সহ যা কিছু করতে পারে। সংখ্যাগত স্থায়িত্ব বা ভাসমান-পয়েন্ট যথার্থতা সম্পর্কেও চিন্তা করবেন না।

আপনার কোড অবশ্যই একটি নামকৃত ফাংশন হতে হবে। কোড স্নিপেট গ্রহণ করা হবে না।

খুব কম চরিত্রের জয়।

ইনপুট:

স্থানাঙ্কের প্রতিনিধিত্বকারী আটটি আসল সংখ্যা। সংখ্যাগুলি ব্যাপ্তিতে থাকবে (-1,1)

সঠিক ইনপুট ফর্ম্যাটটি নমনীয়। আপনি উদাহরণস্বরূপ, আটটি সংখ্যা, আটটি সংখ্যার একটি তালিকা, একটি টিপল দ্বারা প্রদত্ত চারটি পয়েন্টের একটি তালিকা, একটি 2 * 4 ম্যাট্রিক্স, চারটি জটিল সংখ্যা, এক্স-স্থানাঙ্কের দুটি তালিকা এবং y- স্থানাঙ্কগুলি নিতে পারেন, ইত্যাদি।

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

দয়া করে আপনার ইনপুট ফর্ম্যাটটি লিখুন।

আউটপুট:

হয় সম্পর্কিত বুলিয়ান True/ False, সংশ্লিষ্ট নম্বর 1/ 0, বা আপনার ভাষার এনালগগুলি।

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

ইনপুটগুলিকে [X,A,B,C]প্রথমে পরীক্ষার পয়েন্ট এবং তারপরে তিনটি ত্রিভুজ শীর্ষকে চারটি টিপলগুলির একটি তালিকা দেওয়া হয় । যাদের আউটপুট হওয়া উচিত Trueএবং যা হওয়া উচিত তাদের আমি তাদের গোষ্ঠীভুক্ত করেছি False

True দৃষ্টান্ত:

[(-0.31961, -0.12646), (0.38478, 0.37419), (-0.30613, -0.59754), (-0.85548, 0.6633)]
[(-0.87427, -0.00831), (0.78829, 0.60409), (-0.90904, -0.13856), (-0.80685, 0.48468)]
[(0.28997, -0.03668), (-0.28362, 0.42831), (0.39332, -0.07474), (-0.48694, -0.10497)]
[(-0.07783, 0.04415), (-0.34355, -0.07161), (0.59105, -0.93145), (0.29402, 0.90334)]
[(0.36107, 0.05389), (0.27103, 0.47754), (-0.00341, -0.79472), (0.82549, -0.29028)]
[(-0.01655, -0.20437), (-0.36194, -0.90281), (-0.26515, -0.4172), (0.36181, 0.51683)]
[(-0.12198, -0.45897), (-0.35128, -0.85405), (0.84566, 0.99364), (0.13767, 0.78618)]
[(-0.03847, -0.81531), (-0.18704, -0.33282), (-0.95717, -0.6337), (0.10976, -0.88374)]
[(0.07904, -0.06245), (0.95181, -0.84223), (-0.75583, -0.34406), (0.16785, 0.87519)]
[(-0.33485, 0.53875), (-0.25173, 0.51317), (-0.62441, -0.90698), (-0.47925, 0.74832)]

False দৃষ্টান্ত:

[(-0.99103, 0.43842), (0.78128, -0.10985), (-0.84714, -0.20558), (-0.08925, -0.78608)]
[(0.15087, -0.56212), (-0.87374, -0.3787), (0.86403, 0.60374), (0.01392, 0.84362)]
[(0.1114, 0.66496), (-0.92633, 0.27408), (0.92439, 0.43692), (0.8298, -0.29647)]
[(0.87786, -0.8594), (-0.42283, -0.97999), (0.58659, -0.327), (-0.22656, 0.80896)]
[(0.43525, -0.8923), (0.86119, 0.78278), (-0.01348, 0.98093), (-0.56244, -0.75129)]
[(-0.73365, 0.28332), (0.63263, 0.17177), (-0.38398, -0.43497), (-0.31123, 0.73168)]
[(-0.57694, -0.87713), (-0.93622, 0.89397), (0.93117, 0.40775), (0.2323, -0.30718)]
[(0.91059, 0.75966), (0.60118, 0.73186), (0.32178, 0.88296), (-0.90087, -0.26367)]
[(0.3463, -0.89397), (0.99108, 0.13557), (0.50122, -0.8724), (0.43385, 0.00167)]
[(0.88121, 0.36469), (-0.29829, 0.21429), (0.31395, 0.2734), (0.43267, -0.78192)]

একটি চরিত্র আপনার সংজ্ঞা কি? ASCII? 7 বিটে এনকোডেবল? বাইটে? কোন ইউনিকোড?
isaacg

আপনি কি পরামর্শ দিচ্ছেন? ইতিমধ্যে এমন সমাধান রয়েছে যা সংক্ষেপিত কোড ব্যবহার করে।
xnor

সাধারণত, আমি বিশ্বাস করি বাইটগুলি অ-এস্কি অক্ষরের জন্য ব্যবহৃত হয়, কারণ অন্যথায় উত্ফ -32 সুবিধা অনির্বচনীয়।
isaacg

ঠিক আছে, আমি এখন আর ফিরে যেতে পারি না; যে কোনও ইউনিকোড অক্ষর একটি চরিত্র। আপনি চাইলে সংক্ষেপ করুন।
xnor

উত্তর:


19

জাভাস্ক্রিপ্ট / ECMAScript 6, 161 159 158/152

javascript:

function $(t,r,i,a,n,g,l,e){b=(-g*l+a*(-n+l)+i*(g-e)+n*e)/2;c=b<0?-1:1;d=(a*l-i*e+(e-a)*t+(i-l)*r)*c;f=(i*g-a*n+(a-g)*t+(n-i)*r)*c;return d>0&&f>0&&d+f<2*b*c}

ECMAScript 6 সংস্করণ (ধন্যবাদ m.buettner, 6 টি অক্ষর সংরক্ষণ করে)

$=(t,r,i,a,n,g,l,e)=>{b=(-g*l+a*(-n+l)+i*(g-e)+n*e)/2;c=b<0?-1:1;d=(a*l-i*e+(e-a)*t+(i-l)*r)*c;f=(i*g-a*n+(a-g)*t+(n-i)*r)*c;return d>0&&f>0&&d+f<2*b*c}

এটিকে (রিটার্ন trueবা false) হিসাবে কল করুন :

$(pointX, pointY, v1X, v1Y, v2X, v2Y, v3X, v3Y);

এই উত্তর থেকে কোডের উপর ভিত্তি করে কিছু অভিনব বারিসেন্ট্রিক সমন্বিত গণিত ব্যবহার করে । আপনার পড়া উপভোগের জন্য একটি নিরবচ্ছিন্ন সংস্করণ নিম্নলিখিত:

function $ (pointX, pointY, v1X, v1Y, v2X, v2Y, v3X, v3Y) {
  var A =  (-v2Y * v3X + v1Y * (-v2X + v3X) + v1X * (v2Y - v3Y) + v2X * v3Y) / 2;
  var sign = A < 0 ? -1 : 1;
  var s = (v1Y * v3X - v1X * v3Y + (v3Y - v1Y) * pointX + (v1X - v3X) * pointY) * sign;
  var t = (v1X * v2Y - v1Y * v2X + (v1Y - v2Y) * pointX + (v2X - v1X) * pointY) * sign;
  return s > 0 && t > 0 && s + t < 2 * A * sign;
}

12
+1, যদি কেবলমাত্র প্যারামিটারের নামেই থাকে!
ম্যাট

আমার চরিত্র-গণনা ইউজারস্ক্রিপ্টটি কেন ভাঙতে হবে ???
kitcar2000

@ কিটকার 2000 মানে কি?
আব্রাহাম

নিয়মগুলি বলে যে অক্ষরগুলি বাইট নয়, গণনা করা হয়। সুতরাং আপনি এটি ব্যবহার করতে পারেন: xem.github.io/obfuscatweet 122 অক্ষরে ফিট করতে
xem

1
আমি কি ভুল করছি, না আপনি কি এর (a*(l-n)+i*(g-e)+n*e-g*l)বদলে ব্যবহার করতে পারতেন (-g*l+a*(-n+l)+i*(g-e)+n*e)?
জাকারি

19

পাইথন 2.7 128 127 117 110 109 103 99 95 94 91 90

আমার প্রথম কোড-গল্ফ চেষ্টা!

কোড

f=lambda x,y,t:sum(a*y+c*b+d*x<d*a+c*y+b*x for i in(0,1,2)for a,b,c,d in[t[i-1]+t[i]])%3<1

ইনপুট (x, y, t) হিসাবে গ্রহণ করে যেখানে (x, y) হল আমরা যে বিন্দুটি পরীক্ষা করছি এবং টি একটি ত্রিভুজ টি = ((x1, y1), (x2, y2), (x3, y3))।

ব্যাখ্যা

আমি ম্যাট্রিকের নির্ধারক গণনা করছি

| 1 x1 y1 |      | 1 x2 y2 |      | 1 x3 y3 |
| 1 x2 y2 | ,    | 1 x3 y3 | ,    | 1 x1 y1 | .
| 1 x  y  |      | 1 x  y  |      | 1 x  y  |

এই নির্ধারকগুলি ত্রিভুজের দিক থেকে বিন্দু (x, y) এর স্বাক্ষরিত দূরত্বগুলি উপস্থাপন করে। যদি তাদের সবার একই চিহ্ন থাকে তবে বিন্দুটি প্রতিটি লাইনের একই দিকে থাকে এবং এভাবে ত্রিভুজটিতে অন্তর্ভুক্ত থাকে।

উপরের কোডে, a*y+c*b+d*x-d*a-c*y-b*xএই ম্যাট্রিকগুলির মধ্যে একটির নির্ধারক।

আমি এই সত্যটি ব্যবহার করছি True+True+True==3এবং False+False+False==0এই নির্ধারকরা সবার একই চিহ্ন রয়েছে কিনা তা নির্ধারণ করতে।

আমি পাইথনের নেতিবাচক তালিকার সূচকগুলি t[-1]পরিবর্তে ব্যবহার করে ব্যবহার করি t[(i+1)%3]

পিটার 0 বা 3 হয় কিনা তা পরীক্ষা করে দেখার s%3<1পরিবর্তে ধারণাটি ব্যবহার করার জন্য ধন্যবাদ s in(0,3)!

সেজেম্যাথ সংস্করণ

আসলে কোনও আলাদা সমাধান নয় তাই আমি এই উত্তরে এটি অন্তর্ভুক্ত করছি, 80 টি অক্ষর ব্যবহার করে একটি সেজেমথ সমাধান :

f=lambda p,t,o=[1]:sum([det(Matrix([o+t[i-1],o+t[i],o+p]))<0for i in 0,1,2])%3<1

কোথায় p=[x,y], এবংt=[[x1,y1],[x2,y2],[x3,y3]]


1
s in (0,3)ছোট করা যেতে পারে s%3<1?
পিটার টেলর

1
আরও একটি বাঁচাতে নেতিবাচক সূচকগুলির ব্যবহারের জন্য টুইট করা যেতে পারে: -1,0,1 ... t[i]+t[i+1]এর সমতুল্য0,1,2 ... t[i-1]+t[i]
পিটার টেলর

নিখুঁতভাবে ঠিক আছে! খুব খারাপ আমি এটি in -1,0,1পড়ার আগে জায়গাটি সরিয়েছি । আসলে আপনার উপায়টি আরও পঠনযোগ্য তাই আমি এটি যেভাবেই ব্যবহার করব।
অ্যালেক্স এল

1
কোড গল্ফ স্বাগতম! আপনি যদি বন্ধনীকে sumআবদ্ধ করেন তবে এর ভিতরে তালিকা বোধের জন্য বর্গাকার বন্ধনীগুলি থেকে মুক্তি পেতে পারেন 0,1,2, যা কোনও স্থানকে প্রতিস্থাপন করে একটি অক্ষরকে চিহ্নিত করে। কারণটি হ'ল পাইথন অনিয়ন্ত্রিত বোধগম্যগুলিকে ফাংশনগুলিতে স্থান দেওয়ার অনুমতি দেয় তবে নগ্ন টিপলে কমাগুলি 1,2,3এটিকে বিভ্রান্ত করে কারণ এটি তাদের পৃথক যুক্তি হিসাবে পার্স করার চেষ্টা করে।
xnor

16

গণিত, 67 বাইট

f=Equal@@({#2,-#}&@@(#-#2).(x-#)>0&@@@Partition[x=#;#2,2,1,{1,1}])&

ফাংশন দুটি আর্গুমেন্ট, পয়েন্ট লাগে Xএবং পয়েন্ট একটি তালিকা {A,B,C}, যা হিসেবে উল্লেখ করা হয় #এবং #2যথাক্রমে। যদি আপনি কল করেন

f[X,{A,B,C}]

তারপর আপনি #হিসাবে Xএবং #2হিসাবে পাবেন {A,B,C}। (দ্রষ্টব্য যে কোডের অভ্যন্তরে অন্য দু'জন বেনামে ফাংশন রয়েছে - #এবং #2সেগুলির মধ্যে আলাদা অর্থ রয়েছে))

এখানে নিজেই ফাংশনটির ব্যাখ্যা:

                                              x=#;#2            & (* Save X into a variable x, but evaluate to {A,B,C}. *)
                                    Partition[x=#;#2,2,1,{1,1}] & (* Get a cyclic list of pairs {{A,B},{B,C},{C,B}}. *)
       (                        &@@@Partition[x=#;#2,2,1,{1,1}])& (* Define an anonymous function and apply it to each 
                                                                     of the above pairs. The two elements are referred 
                                                                     to as # and #2. *)
       (          (#-#2)        &@@@Partition[x=#;#2,2,1,{1,1}])& (* Subtract the two points. For a pair of vertices 
                                                                     this yields a vector corresponding to the edge 
                                                                     between them. *)
        {#2,-#}&                                                  (* An anonymous function that takes two values, 
                                                                     reverses them, inverts the sign of one of them 
                                                                     and puts them into a list. *)
       ({#2,-#}&@@(#-#2)        &@@@Partition[x=#;#2,2,1,{1,1}])& (* Applied to the edge, this yields its normal. *)
       ({#2,-#}&@@(#-#2).(x-#)  &@@@Partition[x=#;#2,2,1,{1,1}])& (* Take the scalar product of that normal with a
                                                                     vector from a vertex to x. This is projection of 
                                                                     this vector onto that normal and hence the SIGNED
                                                                     distance of x from the edge. *)
       ({#2,-#}&@@(#-#2).(x-#)>0&@@@Partition[x=#;#2,2,1,{1,1}])& (* Check the sign of that distance, the exact mapping 
                                                                     between (left, right) and (True, False) is 
                                                                     irrelevant, as long as it's consistent. *)
Equal@@({#2,-#}&@@(#-#2).(x-#)>0&@@@Partition[x=#;#2,2,1,{1,1}])& (* Check if all signs are equal - that is, if point X 
                                                                     lies on the same side of all edges. This is 
                                                                     equivalent to check that the point is inside the 
                                                                     triangle. *)

মনে রাখবেন যে এই ফাংশনটি যতক্ষণ না কোনও উত্তরোত্তর এন-গনের পক্ষে কাজ করবে যতক্ষণ না এর প্রান্তগুলি ঘড়ির কাঁটা বা পাল্টা-ঘড়ির কাঁটার ক্রমে দেওয়া হয়।


সমস্ত লক্ষণগুলি সমান হয় কিনা তার চেয়ে দূরত্বগুলির পণ্যটি ইতিবাচক কিনা তা পরীক্ষা করা কি আরও দক্ষ হবে না? আমি ম্যাথমেটিকা ​​না, তবে মনে হয় এটি আরও সহজ হওয়া উচিত।
isaacg

@ আইসএইচজি তিনটি শর্ত রয়েছে, সুতরাং যদি সেগুলি সমস্ত নেতিবাচক হয় তবে তাদের পণ্যটি নেতিবাচক হয় এবং যদি তারা সমস্ত ইতিবাচক হয় তবে তাদের পণ্যটি ইতিবাচক হয়। আপনার দৃষ্টিভঙ্গি কেবল তখনই কার্যকর হয় যদি দুটি সংখ্যার চিহ্ন সমান হয়।
মার্টিন ইন্ডার 21

কেন ব্যবহার Detকরবেন না ?
আলেফাল্ফ

@ এলফাল্ফা ভাল, বেশিরভাগ কারণেই সম্ভবত আমি এটি ভেবে দেখিনি। : পি ... আমি এটি সন্ধান করব
মার্টিন ইন্ডার

@ এলফাল্ফা এইচএম না, কম অক্ষরে তিনটি প্রয়োজনীয় ম্যাট্রিক তৈরি করার জন্য এখনই উপায় খুঁজে পাচ্ছি না।
মার্টিন ইন্ডার

7

সিজেম, 66 63 59 52 46 34 32 31 30 28 টি অক্ষর

"Ă䒟损崙㩴ァ椟饃꿾藭鑭蘁"2G#b131b:c~

ইউনিকোড স্ট্রিংকে রূপান্তর করার পরে, নিম্নলিখিত কোডটি ( 33 বাইট ) মূল্যায়ন করে:

{2*2/\f{f{+~@-@@-}~@@*@@*>})-!}:T

X [A B C]ইনপুট হিসাবে প্রত্যাশা , যেখানে প্রতিটি পয়েন্ট ফর্ম হয় [double double]। আউটপুট 1 বা 0 হয়।

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

একটি বড় ধন্যবাদ আপনাকে ব্যবহারকারী 23013 এ 6 অক্ষর সংরক্ষণের জন্য (13 চাপবিহীন কোডের বাইট) ব্যবহার করে!

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

$ cat triangle.cjam
"Ă䒟损崙㩴ァ椟饃꿾藭鑭蘁"2G#b131b:c~

[
  [-0.31961 -0.12646] [ [0.38478 0.37419]   [-0.30613 -0.59754] [-0.85548 0.6633]   ] T
  [-0.87427 -0.00831] [ [0.78829 0.60409]   [-0.90904 -0.13856] [-0.80685 0.48468]  ] T
  [0.28997 -0.03668]  [ [-0.28362 0.42831]  [0.39332 -0.07474]  [-0.48694 -0.10497] ] T
  [-0.07783 0.04415]  [ [-0.34355 -0.07161] [0.59105 -0.93145]  [0.29402 0.90334]   ] T
  [0.36107 0.05389]   [ [0.27103 0.47754]   [-0.00341 -0.79472] [0.82549 -0.29028]  ] T
  [-0.01655 -0.20437] [ [-0.36194 -0.90281] [-0.26515 -0.4172]  [0.36181 0.51683]   ] T
  [-0.12198 -0.45897] [ [-0.35128 -0.85405] [0.84566 0.99364]   [0.13767 0.78618]   ] T
  [-0.03847 -0.81531] [ [-0.18704 -0.33282] [-0.95717 -0.6337]  [0.10976 -0.88374]  ] T
  [0.07904 -0.06245]  [ [0.95181 -0.84223]  [-0.75583 -0.34406] [0.16785 0.87519]   ] T
  [-0.33485 0.53875]  [ [-0.25173 0.51317]  [-0.62441 -0.90698] [-0.47925 0.74832]  ] T
  [-0.99103 0.43842]  [ [0.78128 -0.10985]  [-0.84714 -0.20558] [-0.08925 -0.78608] ] T
  [0.15087 -0.56212]  [ [-0.87374 -0.3787]  [0.86403 0.60374]   [0.01392 0.84362]   ] T
  [0.1114 0.66496]    [ [-0.92633 0.27408]  [0.92439 0.43692]   [0.8298 -0.29647]   ] T
  [0.87786 -0.8594]   [ [-0.42283 -0.97999] [0.58659 -0.327]    [-0.22656 0.80896]  ] T
  [0.43525 -0.8923]   [ [0.86119 0.78278]   [-0.01348 0.98093]  [-0.56244 -0.75129] ] T
  [-0.73365 0.28332]  [ [0.63263 0.17177]   [-0.38398 -0.43497] [-0.31123 0.73168]  ] T
  [-0.57694 -0.87713] [ [-0.93622 0.89397]  [0.93117 0.40775]   [0.2323 -0.30718]   ] T
  [0.91059 0.75966]   [ [0.60118 0.73186]   [0.32178 0.88296]   [-0.90087 -0.26367] ] T
  [0.3463 -0.89397]   [ [0.99108 0.13557]   [0.50122 -0.8724]   [0.43385 0.00167]   ] T
  [0.88121 0.36469]   [ [-0.29829 0.21429]  [0.31395 0.2734]    [0.43267 -0.78192]  ] T
]p;

$ cjam triangle.cjam
[1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0]

এটি কি একটি নামকৃত ফাংশন?
মার্টিন ইন্ডার

@ এম.বুয়েটনার: বাছাই করুন। সরকারী উইকি : নিম্নলিখিত বলেছেন - একটি প্রোগ্রাম অধ্যায় দ্বারা সীমায়িত ব্লক {এবং }এবং একটি একক হিসাবে গণ্য। সি / জাভাতে কোড ব্লকের অনুরূপ, ব্লকগুলি প্রথম-শ্রেণীর অবজেক্ট এবং ভেরিয়েবলগুলিতে বরাদ্দ করা যেতে পারে (সুতরাং কার্যকারিতা সংজ্ঞায়িত করা)।
ডেনিস

1
@xnor 1m<@m*এক্স এর তিনটি জোড়া এবং i+1ত্রিভুজের পরবর্তী ( ম) শীর্ষটি প্রস্তুত করে। @-@@-বর্তমান ( iতম) শীর্ষস্থানটি উত্সের দিকে সরায় (এবং এটি যদি না হয় তবে মিরর করা যায় তবে তাতে @-\@-কিছু আসে যায় না)। @@*@@*>ক্রস প্রোডাক্টের জেড-অ্যাক্সেস, অরফ নির্ধারক এবং গণনা করে 1যদি এটি নেতিবাচক হয়। :+3%!তারা সমস্ত একই হয় কিনা, অর্থাৎ সমস্ত 3 নেতিবাচক বা অ-নেতিবাচক, যা প্রান্তের কেস বাদে ইতিবাচক অর্থ প্রদান করে returns আমি মনে করি গল্ফিংয়ের চেয়ে সিজেএম পড়া আরও চ্যালেঞ্জিং।
জিমি 23013

1
37 বাইট: {[_1m<\]z\f{f{+~@-@@-}~@@*@@*>})-!}:T। ইউনিকোড সুরক্ষার জন্য 2m>বা Wm<ব্যবহার করুন ।
জিমি 23013

1
33 বাইট:{2*2/\f{f{+~@-@@-}~@@*@@*>})-!}:T
জিমি 23013

5

সি - 156 বাইট

ইনপুটটি এক্সে 3 টি ফ্লোটের অ্যারে হয়, 3 টি ওয়াইডে ভাসমান এবং পরীক্ষার পয়েন্টের জন্য পৃথক x এবং y হয়। বোনাস: সমস্ত প্রান্তের কেসগুলি পরিচালনা করে!

int f(float*X,float*Y,float x,float y){int i,j,c=0;for(i=0,j=2;i<3;j=i++)if(((Y[i]>y)!=(Y[j]>y))&&(x<(X[j]-X[i])*(y-Y[i])/(Y[j]-Y[i])+X[i]))c=!c;return c;}

পিএনপোলি থেকে অভিযোজিত।


i;j;c;f(float*X,float*Y,float x,float y){for(c=i=0,j=2;i<3;)c^=(Y[i]>y)-(Y[j]>y)&(x<(X[j]-X[i])*(y-Y[i])/(Y[j]-Y[i])+X[j=i++]);return c;}137 - জাভাস্ক্রিপ্ট পরীক্ষিত
Bebe

@bebe - এর ফলে সিনট্যাক্স ত্রুটি হয়।
ডেরেক 朕 會 功夫

এটি একটি সিনট্যাক্স ত্রুটি সৃষ্টি করে না
বেবি

4

পাইথ 1.0.5 , 57 54 51

DgYb=Z0J'bWbK;bDiHNR*-'H'K-@N1@K1~Z>iYJiJY=JK)R!%Z3

ফাংশন জি সংজ্ঞায়িত করে, যা দুটি ইনপুট নেয়: পরীক্ষার পয়েন্ট এবং তারপরে ত্রিভুজের শীর্ষাংশের তালিকা। আউটপুট Trueএবং False। দ্রষ্টব্য: ইনপুটটি ধ্বংস করে, বিশেষত খ, ত্রিভুজের শীর্ষাংশের তালিকা।

এখানে চেষ্টা করুন । শেষের কয়েকটি অক্ষর, gvwvwপরের দুটি লাইনে একটি টেস্ট কেস সহ ফাংশনটি কল করুন।

এই অ্যালগরিদমের উপর ভিত্তি করে

ব্যাখ্যা:

DgYb                  Define g(Y,b):
=Z0                     Z=0
J'b                     J=b[0]              (No = is needed because j is special).
Wb                      While len(b)>0:     (While b:)
K;b                       K=b.pop()
DiHN                      Define i(H,N):    
R*-'H'K-@N1@K1              Return half of the linked equation.
~ZiYJiJY                  Z+=i(Y,J)>i(J,Y)
=JK                       J=K
)                       Wend
R!%Z3                   return not Z%3==0   (True iff Z == 0 or 3)

সিজেম - পাইথ যুদ্ধ চলছে!


এটি একটি নামযুক্ত ফাংশন হওয়া উচিত। হয় wstdin ইনপুট নিচ্ছে?
xnor

@ এক্সনর ওফস, আমি বর্ণনাটির সেই অংশটি মিস করেছি। সম্পাদনা করবে।
isaacg

@ xnor ফাংশনগুলি কি উত্তর প্রিন্ট করার অনুমতি দেয়, বা তাদের অবশ্যই উত্তর ফেরত দিতে হবে? বর্তমানে, এটি উত্তরটি মুদ্রণ করে তবে আমি এটি আরও একটি চরিত্রের জন্য ফিরে আসতে পারি।
isaacg

উত্তর ফিরিয়ে দিন।
xnor

আপনি Zযে খালি সেটটি জমা করেন Z|=তার সাথে পাল্টা প্রতিস্থাপন করে আপনি অক্ষরগুলি সংরক্ষণ করতে পারবেন , তার দৈর্ঘ্যটি কেবলমাত্র এটির 0বা 1দেখা হয়েছে কিনা তা পরীক্ষা করে দেখুন ? পাইথনটিতে কৌশলটি দীর্ঘায়িত হয়েছিল তবে পাইথ আদিম ব্যবহারগুলি সম্ভবত এটির পক্ষে উপযুক্ত।
xnor

4

জে 64 45 (অ্যাসাইনমেন্ট ছাড়া 42)

c=:*./@(>:&0)@({.(,(1-+/))@%.|:@}.)@(}:-"1{:)

জিনিসটি কোনও ফাংশন হওয়ার জন্য অ্যাসাইনমেন্টটি প্রয়োজনীয় নয়, সুতরাং এটি গণনা করা হবে কিনা তা সম্পর্কে অনিশ্চিত। নমনীয় ইনপুটটির সুযোগ নিয়ে: আমি (1 + সংখ্যাগুলির সংখ্যা) x (স্থানটির মাত্রা) এর অ্যারে রাখতে চাই।

এখানে কিছু অতিরিক্ত পয়েন্ট স্কোর করার প্রত্যাশা ...: এই জিনিসটি কেবল একটি বিমানের ত্রিভুজ নয়, 3 ডি স্পেসে 3 পার্শ্বযুক্ত পিরামিড ইত্যাদির সিমপ্লেক্সের কোনও মাত্রার জন্য কাজ করে। এটি যখন সিমপ্লেক্সের উল্লম্বগুলির সংখ্যা (এন + 1) এর চেয়ে ছোট হয় তখনও এটি কাজ করে, তারপরে এটি সিমপ্লেক্সে বিন্দুর অভিক্ষেপ ভিতরে রয়েছে কিনা তা গণনা করে।

এটি ব্যারিসেনট্রিক স্থানাঙ্কে রূপান্তরিত হয় , তারপরে negative ণাত্মকগুলির জন্য পরীক্ষা করে, বিন্দুটি বাইরে রয়েছে তা নির্দেশ করে। মনে মনে জে নেগেটিভ জন্য _ ব্যবহার করে

NB. example in triangle
D =: 4 2 $ 1 1 0 0 3 0 0 2 NB. 4 rows , x first, then the vertices of the triangle

NB. subtract last vertex coordinates from the rest and drop reference node
n=: (}:-"1{:)

NB. preprocessed to barycentric coordinates
bar=: {. (, 1 - +/)@%. |:@}.

NB. all positive
ap =: *./@(>:&0)

insided =: ap@bar@n

inside D
1

প্রদত্ত উদাহরণগুলিতে রান:

   true =: 0 : 0
[(-0.31961, -0.12646), (0.38478, 0.37419), (-0.30613, -0.59754), (-0.85548, 0.6633)]
[(-0.87427, -0.00831), (0.78829, 0.60409), (-0.90904, -0.13856), (-0.80685, 0.48468)]
[(0.28997, -0.03668), (-0.28362, 0.42831), (0.39332, -0.07474), (-0.48694, -0.10497)]
[(-0.07783, 0.04415), (-0.34355, -0.07161), (0.59105, -0.93145), (0.29402, 0.90334)]
[(0.36107, 0.05389), (0.27103, 0.47754), (-0.00341, -0.79472), (0.82549, -0.29028)]
[(-0.01655, -0.20437), (-0.36194, -0.90281), (-0.26515, -0.4172), (0.36181, 0.51683)]
[(-0.12198, -0.45897), (-0.35128, -0.85405), (0.84566, 0.99364), (0.13767, 0.78618)]
[(-0.03847, -0.81531), (-0.18704, -0.33282), (-0.95717, -0.6337), (0.10976, -0.88374)]
[(0.07904, -0.06245), (0.95181, -0.84223), (-0.75583, -0.34406), (0.16785, 0.87519)]
[(-0.33485, 0.53875), (-0.25173, 0.51317), (-0.62441, -0.90698), (-0.47925, 0.74832)]
)

   false =: 0 : 0
[(-0.99103, 0.43842), (0.78128, -0.10985), (-0.84714, -0.20558), (-0.08925, -0.78608)]
[(0.15087, -0.56212), (-0.87374, -0.3787), (0.86403, 0.60374), (0.01392, 0.84362)]
[(0.1114, 0.66496), (-0.92633, 0.27408), (0.92439, 0.43692), (0.8298, -0.29647)]
[(0.87786, -0.8594), (-0.42283, -0.97999), (0.58659, -0.327), (-0.22656, 0.80896)]
[(0.43525, -0.8923), (0.86119, 0.78278), (-0.01348, 0.98093), (-0.56244, -0.75129)]
[(-0.73365, 0.28332), (0.63263, 0.17177), (-0.38398, -0.43497), (-0.31123, 0.73168)]
[(-0.57694, -0.87713), (-0.93622, 0.89397), (0.93117, 0.40775), (0.2323, -0.30718)]
[(0.91059, 0.75966), (0.60118, 0.73186), (0.32178, 0.88296), (-0.90087, -0.26367)]
[(0.3463, -0.89397), (0.99108, 0.13557), (0.50122, -0.8724), (0.43385, 0.00167)]
[(0.88121, 0.36469), (-0.29829, 0.21429), (0.31395, 0.2734), (0.43267, -0.78192)]
)
   NB. replace - by _ to avoid problems
   NB. cut up per row, drop the [ ] and convert to numbers
   $dat_t =: ((4 2 $ ".)@}:@}.;._2) (true='-')} true ,: '_'
10 4 2
   $dat_f =: ((4 2 $ ".)@}:@}.;._2) (false='-')}false,: '_'
10 4 2
   NB. this results in arrays with shape 10 4 2

   NB. for each 4 x 2 array (rank 2), do c for all true instances
   c=:*./@(>:&0)@({.(,(1-+/))@%.|:@}.)@(}:-"1{:)
   c"2 dat_t
1 1 1 1 1 1 1 1 1 1
   NB. the same for the false ones, demonstrating anonymous usage
   NB. still a function though (or verb in J parlance)
   *./@(>:&0)@({.(,(1-+/))@%.|:@}.)@(}:-"1{:)"2 dat_f
0 0 0 0 0 0 0 0 0 0

আমি একটি নামকৃত ফাংশন চেয়েছি, সুতরাং অ্যাসাইনমেন্টের অক্ষরগুলি গণনা করুন। বহুভুজকে সাধারণীকরণের জন্য এখানে কিছু বিষয় রয়েছে! ······
xnor

ওয়েল, আসলে, আমি বহুভুজগুলিতে বেশ সাধারণীকরণ করি না, তবে এন-ডাইমেনশনাল সিম্পলিক্সে, সর্বাধিক N+1উল্লম্ব সহ। উদাহরণস্বরূপ 3-ডি স্পেসে 4 টি ভার্টেক্স পিরামিড বা 4-ডি স্পেসে 5 ভার্টেক্স সিমপ্লেক্স। উল্লম্বের সংখ্যা কম হতে পারে N+1, এক্ষেত্রে অ্যালগরিদম দেখায় হাইপারপ্লেনের উপর অর্থগোনাল প্রজেকশন সিমপ্লেক্সের ভিতরে মিথ্যা থাকে বা না (যেমন 2-ডি-তে 2 পয়েন্টের সরলিক্সটি রেখার উপরে প্রজেক্ট করে পরীক্ষা করা হবে) এই প্রস্তাবটি শেষ পয়েন্টগুলির মধ্যে রয়েছে কিনা)
jpjacobs

4

এইচটিএমএল 5 + জেএস, 13 বি + 146 বি / 141 বি / 114 অক্ষর

এইচটিএমএল:

<canvas id=C>

জেএস (146 বি):

// @params: t1x, t1y, t2x, t2y, t3x, t3y, pointx, pointy
function T(a,b,c,d,e,f,g,h){with(C.getContext("2d"))return beginPath(),moveTo(a,b),lineTo(c,d),lineTo(e,f),fill(),!!getImageData(g,h,1,1).data[3]}

বা ES6 (141 বি):

T=(a,b,c,d,e,f,g,h)=>{with(C.getContext("2d"))return beginPath(),moveTo(a,b),lineTo(c,d),lineTo(e,f),fill(),!!getImageData(g,h,1,1).data[3]}

বা ES6 ইউনিকোড-অবরুদ্ধ (114 অক্ষর):

eval(unescape(escape('𥀽𚁡𛁢𛁣𛁤𛁥𛁦𛁧𛁨𚐽🡻𭱩𭁨𚁃𛡧𩑴𠱯𫡴𩑸𭀨𘠲𩀢𚐩𬡥𭁵𬡮𘁢𩑧𪑮𤁡𭁨𚀩𛁭𫱶𩑔𫰨𨐬𨠩𛁬𪑮𩑔𫰨𨰬𩀩𛁬𪑮𩑔𫰨𩐬𩠩𛁦𪑬𫀨𚐬𘐡𩱥𭁉𫑡𩱥𡁡𭁡𚁧𛁨𛀱𛀱𚐮𩁡𭁡𦰳𧑽').replace(/uD./g,'')))

ডেমো: http://jsfiddle.net/xH8mV/

ইউনিকোড আবদ্ধকরণ : http://xem.github.io/obfuscatweet/ এর সাথে তৈরি


বিন্দুটি পাশের কাছাকাছি থাকলে এটি সঠিক ফলাফল বলে মনে হয় না: jsfiddle.net/L2B2A আমি বিশ্বাস করি এটি এর কারণ সমস্ত ইনপুট (-1,1) এর মধ্যে রয়েছে এবং আপনার কোডটি কেবল চারপাশে 4 পিক্সেল পরীক্ষা করছে উত্স।
ডেরেক 朕 會 功夫

এটি ঠিক, উদাহরণগুলির জন্য ফিট করার জন্য, আমার ভিতরে থাকা ত্রিভুজগুলি পরিচালনা করার জন্য আমার ক্যানভাসের উত্স এবং স্কেল পরিবর্তন করা উচিত [-1,1]। তবে কেন ত্রিভুজ এত ছোট?
xem

সমস্যাটি বলে যে সমস্ত xy -1 এবং 1 এর মধ্যে রয়েছে really তবে কেন সত্য তা জানেন না তবে আমি বিশ্বাস করি আপনি কেবল প্রতিটি ইনপুটকে 1e7 দিয়ে গুণতে পারেন (যথার্থতা বজায় রাখতে) সঠিক ফলাফল পেতে পারে: ডি
ডেরেক 朕 會 功夫

একটি গ্রাফিকাল সমাধান, খুব চালাক!
xnor

3

পাইথন (65)

লোকেরা জমা দেওয়ার কাজ শেষ বলে মনে হচ্ছে, তাই আমি আমার প্রশ্নের নিজস্ব সমাধান পোস্ট করব।

f=lambda X,L:sum(((L[i-1]-X)/(L[i]-X)).imag>0for i in(0,1,2))%3<1

Xপরীক্ষার পয়েন্টগুলি উপস্থাপনকারী জটিল সংখ্যা, এবং Lতিনটি পয়েন্টের তালিকা, প্রতিটি জটিল সংখ্যা।

প্রথমে, আমি কোডটির একটি কম গল্ফযুক্ত সংস্করণ ব্যাখ্যা করব;

def f(X,A,B,C):A-=X;B-=X;C-=X;return((A/B).imag>0)==((B/C).imag>0)==((C/A).imag>0)

আমরা পয়েন্ট নামান A,B,C,Xযাতে Xমূল হয়, পাইথন এর বিল্ট-ইন জটিল গাণিতিক সুবিধার সুযোগ গ্রহণ। আমাদের উত্সটি উত্তল হলের মধ্যে রয়েছে কিনা তা আমাদের খতিয়ে দেখা উচিত A,B,C। এটি সর্বদা লাইন AB, BC এবং AC এর লাইনের একই দিকে (বাম বা ডানদিকে) থাকা উত্সের সমান।

A ABথেকে বিতে 180 ডিগ্রির চেয়ে কম ঘড়ির কাঁটার বিপরীতে যদি ভ্রমণ হয় তবে কোনও বিভাগের বামদিকে মূল রয়েছে। যদি আমরা কোণগুলি a, bএবং cএই পয়েন্টগুলির সাথে মিল রেখে বিবেচনা করি তবে এর অর্থ b-a < 180 degrees(0 থেকে 360 ডিগ্রি সীমার মধ্যে নেওয়া কোণ)। জটিল সংখ্যা হিসাবে angle(B/A)=angle(B)/angle(A),। এছাড়াও, angle(x) < 180 degreesতিনি ঠিক উপরের হাফ প্লেন পয়েন্টের জন্য, যা আমরা পরীক্ষা করে দেখি imag(x)>0

সুতরাং মূলটি AB এর বামে রয়েছে কিনা তা প্রকাশ করা হয় (A/B).imag>0। এগুলি প্রতিটি চক্রযুক্ত জোড়ার জন্য সমস্ত সমান কিনা তা পরীক্ষা করে A,B,Cআমাদের জানান যে ত্রিভুজের ABCউত্স রয়েছে কিনা whether

এখন, পুরো গল্ফ কোডটিতে ফিরে আসি

f=lambda X,L:sum(((L[i-1]-X)/(L[i]-X)).imag>0for i in(0,1,2))%3<1

আমরা (A-X,B-X,C-X)=(L[0]-X,L[1]-X,L[2]-X)চারপাশে ( L[-1]= L[2]) মোড়ানো নেতিবাচক পাইথন তালিকার সূচকগুলির সুযোগ নিয়ে প্রতিটি চক্রীয় জুড়ি তৈরি করি । বুলগুলি সমস্ত True( 1) বা সমস্ত False( 0) রয়েছে কিনা তা পরীক্ষা করতে , আমরা এগুলি যুক্ত করি এবং 3 টি দ্বারা বিভাজ্যতা পরীক্ষা করি, যতগুলি সমাধান রয়েছে solutions


2

ফরট্রান - 232 218 195 174

রক্তাক্ত ভয়ঙ্কর। ফাংশনটি ভয়াবহ কারণ এটি প্রয়োজনীয়ভাবে ডেটা প্রেরণ করা হয় এবং আমরা এটি প্রাক প্রসেস করতে পারি না।

logical function L(x);real::x(8);p=x(1)-x(3);q=x(2)-x(4);r=x(5)-x(3);s=x(6)-x(4);t=x(7)-x(3);u=x(8)-x(4);L=ALL([p*(s-u)+q*(t-r)+r*u-t*s,p*u-q*t,q*r-p*s]>=r*u-t*s);endfunction

14 টি চরিত্রের হ্রাস হ'ল কারণ আমি আমার পরীক্ষার রানগুলি থেকে ফাংশনের নামটি গল্ফ করতে ভুলে গিয়েছিলাম। আরও হ্রাস হ'ল অন্তর্নিহিত টাইপিং এবং ফাংশনের নাম পরিবর্তন করতে ভুলে যাওয়ার কারণে। পরবর্তী 20 টি অক্ষর একক অ্যারে হিসাবে পয়েন্টগুলিতে পড়ার কারণে এসেছিল। পুরো প্রোগ্রামটি হ'ল

program inTriagle
   real, dimension(2) :: a,b,c,x
   do 
      print*,"Enter coordinates as x,a,b,c"
      read*,x,a,b,c
      if(all(x==0.0).and.all(a==0.0).and.all(b==0.0).and.all(c==0.0)) exit
      print*,"Is point in triangle: ",T(x,a,b,c)
   enddo
 contains!                       
   logical function L(x)
     real::x(8)
     p=x(1)-x(3);q=x(2)-x(4);r=x(5)-x(3)
     s=x(6)-x(4);t=x(7)-x(3);u=x(8)-x(4)
     L=ALL([p*(s-u)+q*(t-r)+r*u-t*s,p*u-q*t,q*r-p*s]>=r*u-t*s)
   endfunction
end program inTriagle

1
ফোর্টরানের অন্তর্নিহিত টাইপিংয়ের উপর ভরসা করে এবং 8 টি সংখ্যার সমন্বিত একক ইনপুট অ্যারে ব্যবহার করে আপনি এটিকে কিছুটা ছোট করে তুলতে পারেন: logical function T(x);real x(8);p=x(1)-x(3);q=x(2)-x(4);r=x(5)-x(3);s=x(6)-x(4);u=x(7)-x(3);v=x(8)-x(4);o=r*v-u*s;T=ALL([p*(s-v)+q*(u-r)+o,p*v-q*u,q*r-p*s]>=o);endআমি তালিকা অপারেশনগুলি ব্যবহার করে এটি আরও ছোট করার চেষ্টা করেছি, তবে দুর্ভাগ্যক্রমে এটি খুব ভাল কার্যকর হয়নি work
ভেন্টোরো

1
আরও সাধারণ সাফল্যগুলি মুছে ফেলে এমনকি আরও খাটো: logical function T(x);real x(8);p=x(1)-x(3);q=x(2)-x(4);r=x(5)-x(3);s=x(6)-x(4);u=x(7)-x(3);v=x(8)-x(4);a=r*v-u*s;b=p*v-q*u;d=q*r-p*s;T=ALL([a-b-d,b,d]>=a);endআমি আশা করি রূপান্তরগুলিতে আমি কোনও ভুল করিনি! যদিও দেখে মনে হচ্ছে আপনার মূল কোডটি সমস্ত টেস্টকেসগুলি পাস করে না।
ভেন্টোরো

@ ভেন্তোরো: আমি বিশ্বাস করতে পারি না যে আমি অন্তর্নিহিত টাইপিংয়ের অপব্যবহার করতে ভুলে গেছি :( আপনার সাহায্যের জন্য ধন্যবাদ!
কাইল কানোস

@ ভেন্টোরো: এছাড়াও, মনে হচ্ছে আমার উত্তরটি ত্রিভুজটির অবস্থানের উপর নির্ভর করে। Trueওপিতে প্রথম উদাহরণটি দেয় Falseযদি আমি মূল অরিয়েন্টেশনের জন্য দেওয়ার সময় অদলবদল করে Bএবং Cমানগুলি দেয় True
কাইল কানোজ

আহ, প্রকৃতপক্ষে, সমস্যাটি যখন ঘটেছিল (আমার পূর্ববর্তী মন্তব্য থেকে স্বরলিপিটি পুনরায় ব্যবহার করা হয়) a < 0, যা আপনাকে পরীক্ষার জন্য শর্তটিকে কার্যকরভাবে উল্টে দেয়। দুর্ভাগ্যবশত, এই মাত্র একটি ইন মোড়ানো সবকিছু দ্বারা নির্ধারিত করা যাবে না absতাহলে উহ্য শর্ত হিসাবে, bএবং dহিসাবে একই চিহ্ন থাকার aহারিয়ে যায়। এটি (যেমন, আমার শেষ মন্তব্য থেকে e=a-b-d;T=ALL([a*a-b*b,a*a-d*d,a*a-e*e,a*b,a*d,a*e]>=0)স্বীকৃতি এবং পূর্বনির্ধারিত ভেরিয়েবলগুলি পুনরায় ব্যবহার করে) এর মতো কিছু ব্যবহার করে স্থির করা যেতে পারে - যা সম্ভবত আরও গল্ফ করা যেতে পারে।
ভেন্টোরো

2

ম্যাটল্যাব: 9!

আমার পুরোটা এখানে লেখার মতো নয়

inpolygon

এর মতো বলা যেতে পারে:

inpolygon(2/3, 2/3, [0 1 1], [0 0 1])

আউটপুট নামের একটি ভেরিয়েবলকে বরাদ্দ করা হয় ans


যদি আমাকে আসলে কোনও ফাংশন লিখতে হত তবে এটি এমন কিছু হতে পারে, সম্ভবত অনুকূলিত করা যেতে পারে:

function y=f(a,b,c,d)
inpolygon(a,b,c,d)

2
একটি ফাংশন হ্যান্ডেল ব্যবহার করে ছোট হতে পারে:f=@(a,b,c,d)inpolygon(a,b,c,d)
jpjacobs

2

সি # 218 (149?)

using P=System.Drawing.PointF;
bool F(P[]p){for(int i=0;i<4;i++){p[i].X*=1e7f;p[i].Y*=1e7f;}P[]a=new P[3];Array.Copy(p,1,a,0,3);var g=new System.Drawing.Drawing2D.GraphicsPath();g.AddLines(a);return g.IsVisible(p[0]);}

সম্ভবত গাণিতিক পদ্ধতির মতো চরিত্র-দক্ষ নয়, তবে এটি লাইব্রেরির মজাদার ব্যবহার। ঘটনাচক্রে, বরং ধীর।

এছাড়াও "সংখ্যাগত স্থিতিশীলতা বা ভাসমান-পয়েন্ট যথার্থতা সম্পর্কেও চিন্তা করবেন না।" - দুর্ভাগ্যক্রমে, অভ্যন্তরীণভাবে এটি GraphicsPathব্যবহার করে int, সুতরাং -1 <f <1 ব্যাপ্তির মানটির মধ্যে তিনটি সম্ভাব্য মান থাকতে পারে। যেহেতু ভাসমানগুলির কাছে কেবল 7 ডিজিটের যথার্থতা থাকে তাই আমি তাদের পুরো সংখ্যায় পরিণত করতে কেবল 1e7 দিয়ে গুণ করি। এইচএম, আমি অনুমান করি এটি সত্যিই কোনও নির্ভুলতা হারাচ্ছে না । এটি অন্য কোনও উপায়েও শোষণীয়: আমি সম্ভবত নির্ভুলতা উপেক্ষা করার সুযোগ নিতে পারলাম এবং কেবল "ভুল" উত্তর দিয়েছি।

যদি আমাকে লাইব্রেরিগুলি আমদানি করার চরিত্রের ব্যয়টি উপেক্ষা করার অনুমতি দেওয়া হয়, 149 (খুব কমপক্ষে System.Linqএবং System.Drawingবেশিরভাগ উইনফর্মস প্রকল্পগুলিতে বেশ মানসম্পন্ন তবে এটি System.Drawing.Drawing2Dকিছুটা প্রসারিত হতে পারে):

bool G(PointF[]p){for(int i=0;i<4;i++){p[i].X*=1e7f;p[i].Y*=1e7f;}var g=new GraphicsPath();g.AddLines(p.Skip(1).ToArray());return g.IsVisible(p[0]);}

পরীক্ষা প্রোগ্রাম (হ্যাঁ, এটি কুৎসিত):

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using P=System.Drawing.PointF;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        Program prog = new Program();
        foreach (string test in
@"[(-0.31961, -0.12646), (0.38478, 0.37419), (-0.30613, -0.59754), (-0.85548, 0.6633)]
[(-0.87427, -0.00831), (0.78829, 0.60409), (-0.90904, -0.13856), (-0.80685, 0.48468)]
[(0.28997, -0.03668), (-0.28362, 0.42831), (0.39332, -0.07474), (-0.48694, -0.10497)]
[(-0.07783, 0.04415), (-0.34355, -0.07161), (0.59105, -0.93145), (0.29402, 0.90334)]
[(0.36107, 0.05389), (0.27103, 0.47754), (-0.00341, -0.79472), (0.82549, -0.29028)]
[(-0.01655, -0.20437), (-0.36194, -0.90281), (-0.26515, -0.4172), (0.36181, 0.51683)]
[(-0.12198, -0.45897), (-0.35128, -0.85405), (0.84566, 0.99364), (0.13767, 0.78618)]
[(-0.03847, -0.81531), (-0.18704, -0.33282), (-0.95717, -0.6337), (0.10976, -0.88374)]
[(0.07904, -0.06245), (0.95181, -0.84223), (-0.75583, -0.34406), (0.16785, 0.87519)]
[(-0.33485, 0.53875), (-0.25173, 0.51317), (-0.62441, -0.90698), (-0.47925, 0.74832)]
[(-0.99103, 0.43842), (0.78128, -0.10985), (-0.84714, -0.20558), (-0.08925, -0.78608)]
[(0.15087, -0.56212), (-0.87374, -0.3787), (0.86403, 0.60374), (0.01392, 0.84362)]
[(0.1114, 0.66496), (-0.92633, 0.27408), (0.92439, 0.43692), (0.8298, -0.29647)]
[(0.87786, -0.8594), (-0.42283, -0.97999), (0.58659, -0.327), (-0.22656, 0.80896)]
[(0.43525, -0.8923), (0.86119, 0.78278), (-0.01348, 0.98093), (-0.56244, -0.75129)]
[(-0.73365, 0.28332), (0.63263, 0.17177), (-0.38398, -0.43497), (-0.31123, 0.73168)]
[(-0.57694, -0.87713), (-0.93622, 0.89397), (0.93117, 0.40775), (0.2323, -0.30718)]
[(0.91059, 0.75966), (0.60118, 0.73186), (0.32178, 0.88296), (-0.90087, -0.26367)]
[(0.3463, -0.89397), (0.99108, 0.13557), (0.50122, -0.8724), (0.43385, 0.00167)]
[(0.88121, 0.36469), (-0.29829, 0.21429), (0.31395, 0.2734), (0.43267, -0.78192)]".Split('\n'))
        {
            string t = test.Replace("[(", "").Replace(")]", "");
            string[] points = t.Split(new string[] { "), (" }, StringSplitOptions.None);

            string[] p = points[0].Split(',');
            P[] xabc = new P[4];

            for (int i = 0; i < 4; i++)
            {
                p = points[i].Split(',');
                xabc[i] = new F(float.Parse(p[0]), float.Parse(p[1]));
            }

            Console.WriteLine(test + "=>" + prog.F(xabc));
        }

        Console.ReadKey();
    }

    bool G(PointF[]p)
    {
        for(int i=0;i<4;i++){p[i].X*=1e7f;p[i].Y*=1e7f;}
        var g=new GraphicsPath();
        g.AddLines(p.Skip(1).ToArray());
        return g.IsVisible(p[0]);
    }

    bool F(P[]p)
    {
        for(int i=0;i<4;i++){p[i].X*=1e7f;p[i].Y*=1e7f;}
        var g=new System.Drawing.Drawing2D.GraphicsPath();
        g.AddLines(p.Skip(1).ToArray());
        return g.IsVisible(p[0]);
    }
}

সুন্দর, কাজটি করার জন্য অঙ্কন ইঞ্জিন পাচ্ছি।
xnor

2

হাস্কেল - 233 127

এখানে বর্ণিত হিসাবে ক্রস পণ্য ব্যবহার :

h(a,b)(p,q)(r,s)(t,u)=z a b p q r s==z a b r s t u&&z a b r s t u==z a b t u p q where z j k l m n o =(o-m)*(j-l)+(l-n)*(k-m)>0

পূর্ববর্তী সমাধানটি এই স্ট্যাক এক্সচেঞ্জের উত্তরে বর্ণিত ব্যারেন্সেন্ট্রিক স্থানাঙ্ক এবং সূত্রগুলি ব্যবহার করে প্রয়োগ করা হয়েছে :

g(p,q)(r,s)(t,u)(v,w)=
 let (j,k)=(p+(-r),q+(-s))
     (l,m)=(t+(-r),u+(-s))
     (n,o)=(v+(-r),w+(-s))
     d=l*o-n*m
     a=(j*(m-o)+k*(n-l)+l*o-n*m)/d
     b=(j*o-k*n)/d
     c=(k*l-j*m)/d
 in (0<=a&&a<1)&&(0<=b&&b<1)&&(0<=c&&c<1)

উভয় ফাংশন gএবং hচারটি জোড় নেয়, যার মধ্যে প্রথমটি অন্তর্ভুক্তির জন্য পরীক্ষা করা পয়েন্ট এবং বাকীটি ত্রিভুজের শীর্ষাংশের স্থানাঙ্ক হয়।

নমুনা ইনপুট দিয়ে পরীক্ষা করতে:

let trueTestCases =
  [((-0.31961, -0.12646), (0.38478, 0.37419), (-0.30613, -0.59754), (-0.85548, 0.6633)),
   ((-0.87427, -0.00831), (0.78829, 0.60409), (-0.90904, -0.13856), (-0.80685, 0.48468)),
   ((0.28997, -0.03668), (-0.28362, 0.42831), (0.39332, -0.07474), (-0.48694, -0.10497)),
   ((-0.07783, 0.04415), (-0.34355, -0.07161), (0.59105, -0.93145), (0.29402, 0.90334)),
   ((0.36107, 0.05389), (0.27103, 0.47754), (-0.00341, -0.79472), (0.82549, -0.29028)),
   ((-0.01655, -0.20437), (-0.36194, -0.90281), (-0.26515, -0.4172), (0.36181, 0.51683)),
   ((-0.12198, -0.45897), (-0.35128, -0.85405), (0.84566, 0.99364), (0.13767, 0.78618)),
   ((-0.03847, -0.81531), (-0.18704, -0.33282), (-0.95717, -0.6337), (0.10976, -0.88374)),
   ((0.07904, -0.06245), (0.95181, -0.84223), (-0.75583, -0.34406), (0.16785, 0.87519)),
   ((-0.33485, 0.53875), (-0.25173, 0.51317), (-0.62441, -0.90698), (-0.47925, 0.74832))]

let falseTestCases =
  [((-0.99103, 0.43842), (0.78128, -0.10985), (-0.84714, -0.20558), (-0.08925, -0.78608)),
   ((0.15087, -0.56212), (-0.87374, -0.3787), (0.86403, 0.60374), (0.01392, 0.84362)),
   ((0.1114, 0.66496), (-0.92633, 0.27408), (0.92439, 0.43692), (0.8298, -0.29647)),
   ((0.87786, -0.8594), (-0.42283, -0.97999), (0.58659, -0.327), (-0.22656, 0.80896)),
   ((0.43525, -0.8923), (0.86119, 0.78278), (-0.01348, 0.98093), (-0.56244, -0.75129)),
   ((-0.73365, 0.28332), (0.63263, 0.17177), (-0.38398, -0.43497), (-0.31123, 0.73168)),
   ((-0.57694, -0.87713), (-0.93622, 0.89397), (0.93117, 0.40775), (0.2323, -0.30718)),
   ((0.91059, 0.75966), (0.60118, 0.73186), (0.32178, 0.88296), (-0.90087, -0.26367)),
   ((0.3463, -0.89397), (0.99108, 0.13557), (0.50122, -0.8724), (0.43385, 0.00167)),
   ((0.88121, 0.36469), (-0.29829, 0.21429), (0.31395, 0.2734), (0.43267, -0.78192))]

type Point = (Double, Double)

test :: [(Point, Point, Point, Point)] -> [Bool]
test testCases =
  map (\((px,py),(ax,ay),(bx,by),(cx,cy)) -> h (px,py) (ax,ay) (bx,by) (cx,cy)) testCases

test trueTestCases --> [True,True,True,True,True,True,True,True,True,True]
test falseTestCases --> [False,False,False,False,False,False,False,False,False,False]

অব্যক্ত সমাধান:

type Point = (Double, Double)

-- using cross products

triangulate' (a, b) (p, q) (r, s) (t, u) =
  (side a b p q r s == side a b r s t u) && (side a b r s t u == side a b t u p q)
  where side j k l m n o = (o - m) * (j - l) + (-n + l) * (k - m) >= 0

-- using barycentric coordinates

triangulate :: (Point, Point, Point, Point) -> Bool
triangulate ((px, py), (ax, ay), (bx, by), (cx, cy)) = 
  let (p'x, p'y) = (px + (-ax), py + (-ay))
      (b'x, b'y) = (bx + (-ax), by + (-ay))
      (c'x, c'y) = (cx + (-ax), cy + (-ay))
      d = b'x * c'y - c'x * b'y
      a = (p'x * (b'y - c'y) + p'y * (c'x - b'x) + b'x * c'y - c'x * b'y) / d
      b = (p'x * c'y - p'y * c'x) / d
      c = (p'y * b'x - p'x * b'y) / d
  in
      (0 <= a && a < 1) && (0 <= b && b < 1) && (0 <= c && c < 1)

2

জাভাস্ক্রিপ্ট (ES6) 120

C=(p,q,i,j,k,l,m,n,
 z=j*(m-k)+i*(l-n)+k*n-l*m,
 s=(j*m-i*n+(n-j)*p+(i-m)*q)/z,
 t=(i*l-j*k+(j-l)*p+(k-i)*q)/z
)=>s>0&t>0&s+t<1

এই অন্যান্য প্রশ্নের আমার উত্তর থেকে সরাসরি অনুলিপি করেছেন

টেস্ট ফায়ারফক্স / ফায়ারবাগ কনসোলটি

সমস্ত 1 এস আউটপুট

;[
C(-0.31961, -0.12646, 0.38478, 0.37419, -0.30613, -0.59754, -0.85548, 0.6633),
C(-0.87427, -0.00831, 0.78829, 0.60409, -0.90904, -0.13856, -0.80685, 0.48468),
C(0.28997, -0.03668, -0.28362, 0.42831, 0.39332, -0.07474, -0.48694, -0.10497),
C(-0.07783, 0.04415, -0.34355, -0.07161, 0.59105, -0.93145, 0.29402, 0.90334),
C(0.36107, 0.05389, 0.27103, 0.47754, -0.00341, -0.79472, 0.82549, -0.29028),
C(-0.01655, -0.20437, -0.36194, -0.90281, -0.26515, -0.4172, 0.36181, 0.51683),
C(-0.12198, -0.45897, -0.35128, -0.85405, 0.84566, 0.99364, 0.13767, 0.78618),
C(-0.03847, -0.81531, -0.18704, -0.33282, -0.95717, -0.6337, 0.10976, -0.88374),
C(0.07904, -0.06245, 0.95181, -0.84223, -0.75583, -0.34406, 0.16785, 0.87519),
C(-0.33485, 0.53875, -0.25173, 0.51317, -0.62441, -0.90698, -0.47925, 0.74832)
]

সমস্ত 0 গুলি আউটপুট

;[
C(-0.99103, 0.43842,0.78128, -0.10985,-0.84714, -0.20558,-0.08925, -0.78608),
C(0.15087, -0.56212,-0.87374, -0.3787,0.86403, 0.60374,0.01392, 0.84362),
C(0.1114, 0.66496,-0.92633, 0.27408,0.92439, 0.43692,0.8298, -0.29647),
C(0.87786, -0.8594,-0.42283, -0.97999,0.58659, -0.327,-0.22656, 0.80896),
C(0.43525, -0.8923,0.86119, 0.78278,-0.01348, 0.98093,-0.56244, -0.75129),
C(-0.73365, 0.28332,0.63263, 0.17177,-0.38398, -0.43497,-0.31123, 0.73168),
C(-0.57694, -0.87713,-0.93622, 0.89397,0.93117, 0.40775,0.2323, -0.30718),
C(0.91059, 0.75966,0.60118, 0.73186,0.32178, 0.88296,-0.90087, -0.26367),
C(0.3463, -0.89397,0.99108, 0.13557,0.50122, -0.8724,0.43385, 0.00167),
C(0.88121, 0.36469,-0.29829, 0.21429,0.31395, 0.2734,0.43267, -0.78192)
]

2

স্মাইলব্যাসিক, 111 100 টি অক্ষর

DEF T X,Y,A,B,C,D,E,F
Q=9e5GCLS
GTRI(A-X)*Q,Q*(B-Y),Q*(C-X),Q*(D-Y),Q*(E-X),Q*(F-Y)?!!GSPOIT(0,0)END

একটি ত্রিভুজ আঁকে এবং বিন্দুতে পিক্সেলের রঙ পরীক্ষা করে। ত্রিভুজটি 99999x আপকে ছোট করে এনে স্থানান্তরিত করা হয়েছে যাতে যথাযথ ক্ষতি হ্রাস করার জন্য, চেক করার পয়েন্টটি অঙ্কনের আগে (0,0) এ হবে।


2

ইন্টেল 8087 এফপিইউ সমাবেশ, 222 220 বাইট

গণনা করতে শুধুমাত্র 8087 এফপিইউ হার্ডওয়্যার ব্যবহার করে। এখানে ম্যাক্রো হিসাবে আনসেম্বলড (এই ক্ষেত্রেও অমীমাংসিত) সংস্করণ রয়েছে (আপনাকে 220 হেক্স বাইট কোডগুলি ছাড়িয়ে দেবে):

; calculate the area of of a triangle ABC using determinate
; input: coordinates (float), Ax,Ay,Bx,By,Cx,Cy
; output: area in ST
TAREA   MACRO   A1,A2,B1,B2,C1,C2
    FLD  A1
    FLD  B2
    FLD  C2
    FSUB        ; ST = By - Cy
    FMUL        ; ST = Ax * ( By - Cy )
    FLD  B1 
    FLD  C2
    FLD  A2
    FSUB        ; ST = Cy - Ay
    FMUL        ; ST = Bx * ( Cy - Ay )
    FLD  C1
    FLD  A2
    FLD  B2
    FSUB        ; Ay - By
    FMUL        ; Cx * ( Ay - By )
    FADD        ; Cx * ( Ay - By ) + Bx * ( Cy - Ay )
    FADD        ; Cx * ( Ay - By ) + Bx * ( Cy - Ay ) + Ax * ( By - Cy )
    FLD1        ; make a value of 2
    FADD ST,ST  ; ST = 2
    FDIV        ; divide by 2
    FABS        ; take abs value
        ENDM

; determine if point X is in triangle ABC
; input: points X, A, B, C
; output: ZF=1 if X in triangle, ZF=0 if X not in triangle
TXINABC     MACRO X1,X2,A1,A2,B1,B2,C1,C2

    TAREA  A1,A2,B1,B2,C1,C2    ; ST(3) = area of triangle ABC
    TAREA  X1,X2,B1,B2,C1,C2    ; ST(2) = area of triangle XBC
    TAREA  A1,A2,X1,X2,C1,C2    ; ST(1) = area of triangle AXC
    TAREA  A1,A2,B1,B2,X1,X2    ; ST(0) = area of triangle ABX

    FADD        ; add areas of triangles with point
    FADD        ; ST = ST + ST(1) + ST(2)
    FCOMPP      ; compare ST to ST(1) and pop results
    FWAIT       ; sync CPU/FPU
    FSTSW R     ; store result flags to R
    MOV  AX, R  ; move result to AX
    SAHF        ; store result into CPU flags for conditional check
        ENDM

ব্যাখ্যা

ABC ত্রিভুজের ক্ষেত্রফল গণনা করতে নির্ধারক ব্যবহার করে এবং তারপরে এক্স পয়েন্ট এবং ABC ত্রিভুজের আরও দুটি পয়েন্ট নিয়ে ত্রিভুজ গঠিত। যদি ত্রিভুজের ABC এর ক্ষেত্রফল XBC + AXC + ABX এর ত্রিভুজগুলির ক্ষেত্রগুলির সমান হয়, তবে বিন্দুটি ত্রিভুজের মধ্যে। ফলাফলটি জেডএফ হিসাবে ফিরে আসে।

এ সম্পর্কে কি ঝরঝরে

গণিত এবং ভাসমান পয়েন্টের সমস্ত অপারেশন 80-বিট বর্ধিত নির্ভুলতার সাথে হার্ডওয়্যারে করা হয়। চূড়ান্ত ভাসমান পয়েন্ট তুলনাটি হার্ডওয়ারেও করা হয় তাই খুব নির্ভুল হবে।

এটি 8087 এর স্ট্যাক রেজিস্টারগুলির সমস্ত আটকে একবারে ব্যবহার করে।

এই সম্পর্কে পুরোপুরি ঝরঝরে কি না

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

টেস্ট

এখানে আইবিএম ডস আউটপুট দেখিয়ে ব্যবহার করে একটি পরীক্ষা প্রোগ্রাম রয়েছে:

TTEST   MACRO T
        LOCAL IS_IN_TRI

    TXINABC T,T+4*1,T+4*2,T+4*3,T+4*4,T+4*5,T+4*6,T+4*7
    MOV  DX, OFFSET TEQ     ; load true string by default 
    JZ   IS_IN_TRI          ; if ZF=1, it is in triangle, skip to display
    MOV  DX, OFFSET FEQ     ; otherwise ZF=0 means not in triangle, so load false string
IS_IN_TRI:
    MOV  AH, 9              ; DOS write string function
    INT  21H 
        ENDM

START:
    FINIT                   ; reset 8087

    TTEST   T0              ; true tests
    TTEST   T1
    TTEST   T2
    TTEST   T3
    TTEST   T4
    TTEST   T5
    TTEST   T6
    TTEST   T7
    TTEST   T8
    TTEST   T9

    TTEST   F0              ; false tests
    TTEST   F1
    TTEST   F2
    TTEST   F3
    TTEST   F4
    TTEST   F5
    TTEST   F6  
    TTEST   F7
    TTEST   F8  
    TTEST   F9

    RET         ; return to DOS

T0  DD  -0.31961, -0.12646, 0.38478, 0.37419, -0.30613, -0.59754, -0.85548, 0.6633
T1  DD  -0.87427, -0.00831, 0.78829, 0.60409, -0.90904, -0.13856, -0.80685, 0.48468
T2  DD  0.28997, -0.03668, -0.28362, 0.42831, 0.39332, -0.07474, -0.48694, -0.10497
T3  DD  -0.07783, 0.04415, -0.34355, -0.07161, 0.59105, -0.93145, 0.29402, 0.90334
T4  DD  0.36107, 0.05389, 0.27103, 0.47754, -0.00341, -0.79472, 0.82549, -0.29028
T5  DD  -0.01655, -0.20437, -0.36194, -0.90281, -0.26515, -0.4172, 0.36181, 0.51683
T6  DD  -0.12198, -0.45897, -0.35128, -0.85405, 0.84566, 0.99364, 0.13767, 0.78618
T7  DD  -0.03847, -0.81531, -0.18704, -0.33282, -0.95717, -0.6337, 0.10976, -0.88374
T8  DD  0.07904, -0.06245, 0.95181, -0.84223, -0.75583, -0.34406, 0.16785, 0.87519
T9  DD  -0.33485, 0.53875, -0.25173, 0.51317, -0.62441, -0.90698, -0.47925, 0.74832

F0  DD  -0.99103, 0.43842, 0.78128, -0.10985, -0.84714, -0.20558, -0.08925, -0.78608
F1  DD  0.15087, -0.56212, -0.87374, -0.3787, 0.86403, 0.60374, 0.01392, 0.84362
F2  DD  0.1114, 0.66496, -0.92633, 0.27408, 0.92439, 0.43692, 0.8298, -0.29647
F3  DD  0.87786, -0.8594, -0.42283, -0.97999, 0.58659, -0.327, -0.22656, 0.80896
F4  DD  0.43525, -0.8923, 0.86119, 0.78278, -0.01348, 0.98093, -0.56244, -0.75129
F5  DD  -0.73365, 0.28332, 0.63263, 0.17177, -0.38398, -0.43497, -0.31123, 0.73168
F6  DD  -0.57694, -0.87713, -0.93622, 0.89397, 0.93117, 0.40775, 0.2323, -0.30718
F7  DD  0.91059, 0.75966, 0.60118, 0.73186, 0.32178, 0.88296, -0.90087, -0.26367
F8  DD  0.3463, -0.89397, 0.99108, 0.13557, 0.50122, -0.8724, 0.43385, 0.00167
F9  DD  0.88121, 0.36469, -0.29829, 0.21429, 0.31395, 0.2734, 0.43267, -0.78192

TEQ DB 'In Triangle',0DH,0AH,'$'
FEQ DB 'Not In Triangle',0DH,0AH,'$'

আউটপুট

In Triangle
In Triangle
In Triangle
In Triangle
In Triangle
In Triangle
In Triangle
In Triangle
In Triangle
In Triangle
Not In Triangle
Not In Triangle
Not In Triangle
Not In Triangle
Not In Triangle
Not In Triangle
Not In Triangle
Not In Triangle
Not In Triangle
Not In Triangle

1

সি 414 (ছিল 465)

Golfed

#define D double 
int F(D ax,D ay,D bx,D by,D cx,D cy,D px,D py){int y=0;double J,K;D m=(ax-bx<0.001)?(by-ay)/(ax-bx):1000;D b=m*ax+ay;J=m*cx-cy+b;K=m*px-py+b;if(J*K>=0)y=1;return y;}D T[8],k;int i,n;void G(){while(i<8){scanf("%lf",&k);T[i++]=k;}n+=F(T[2],T[3],T[4],T[5],T[6],T[7],T[0],T[1]);n+=F(T[4],T[5],T[6],T[7],T[2],T[3],T[0],T[1]);n+=F(T[2],T[3],T[6],T[7],T[4],T[5],T[0],T[1]);printf(n==3?"True":"False");}

মূল ফাংশন ঘোষণা ব্যাখ্যার জন্য যুক্ত করা হয়েছে

/**
* determine if points C & P are on same side of line AB
* return 1 if true, 0 otherwise
*/
int PointsSameSide(D ax,D ay,D bx,D by,D cx, D cy, D px, D py);

একটি নামকৃত ফাংশন হিসাবে পুনরায় লিখিত: স্ট্ডিনের মাধ্যমে ইনপুট প্রতিটি লাইন একটি করে বা সমস্ত এক লাইনে স্থান দ্বারা পৃথক।

#define D double
int F(D ax,D ay,D bx,D by,D cx, D cy, D px, D py)
{
int y=0;
double J,K;
D m = (ax-bx<0.001)?(by-ay)/(ax-bx):1000;
D b = m*ax+ay;
J=m*cx-cy+b;
K=m*px-py+b;
if(J*K>=0)y=1;
return y;
}
double T[8],k;
int i,n;
void G()
{
while(i<8){scanf("%lf",&k);T[i++]=k;}
n+=F(T[2],T[3],T[4],T[5],T[6],T[7],T[0],T[1]);
n+=F(T[4],T[5],T[6],T[7],T[2],T[3],T[0],T[1]);
n+=F(T[2],T[3],T[6],T[7],T[4],T[5],T[0],T[1]);
printf(n==3?"True":"False");
}

3
আপনি নতুন লাইন এবং অপ্রয়োজনীয় স্থান থেকে মুক্তি পেয়ে কিছু বাইট সংরক্ষণ করতে পারেন। এছাড়াও, আপনি doubleনতুন হিসাবে সংজ্ঞা দিয়েছেন Dকিন্তু আপনি এখনও কোডটিতে ব্যবহার doubleকরেন।
গ্রোনস্টাজ

1

জাভা, 149 টি অক্ষর

g=Math.atan2(100*(d-y),(a-x));h=Math.atan2(100*(e-y),(b-x));i=Math.atan2(100*(f-y),(c-x));k=Math.round(Math.abs(g-h)+Math.abs(h-i)+Math.abs(i-g))==6;

ভয়াবহ বিবেচনা করে আমাকে "ম্যাথ" লিখতে হবে। প্রত্যেকবার. এটিই আসল প্রোগ্রাম:

package mathPackage;
public class InTriangle {
public static void main(String[] args) {
    boolean k;
    double a=-1,b=0,c=1,d=0,e=1,f=0,x=0,y=0.4;
    double g,h,i;
    g=Math.atan2(100*(d-y),(a-x));
    h=Math.atan2(100*(e-y),(b-x));
    i=Math.atan2(100*(f-y),(c-x));
    k=Math.round(Math.abs(g-h)+Math.abs(h-i)+Math.abs(i-g))==6;
    System.out.println(k);
    System.out.println(g);
    System.out.println(h);
    System.out.println(i);
    System.out.print(Math.abs(g-h)+Math.abs(h-i)+Math.abs(i-g));
}
}

যেখানে a বিন্দুটির x, b বিন্দু x এর x, c এর x এর জন্য x, a এর y হয়, b এর y হয়, এবং x এবং y হয় x এবং বিন্দু y বুলিয়ান কে নির্ধারণ করে যে এটি সত্য কিনা।


1
কিসের 100*জন্য?
xnor

1

জাভাস্ক্রিপ্ট 125/198

যদি 8 টি আর্গুমেন্টে পয়েন্টগুলি সরবরাহ করা হয়:

function d(x,y,a,b,c,d,e,f){function z(a,b,c,d){return(y-b)*(c-a)-(x-a)*(d-b)>0}return(z(a,b,c,d)+z(c,d,e,f)+z(e,f,a,b))%3<1}

যদি পয়েন্টগুলি 2-মাত্রিক অ্যারেতে সরবরাহ করা হয়:

function c(s){return (z(s[1][0],s[1][1],s[2][0],s[2][1])+z(s[2][0],s[2][1],s[3][0],s[3][1])+z(s[3][0],s[3][1],s[1][0],s[1][1]))%3<1;function z(a,b,c,d){return (s[0][1]-b)*(c-a)-(s[0][0]-a)*(d-b)>0}}

এই কোডটি সেই অভিনব ভেক্টর গণিতের কোনও ব্যবহার করে না। পরিবর্তে এটি বিন্দুটি ত্রিভুজের ভিতরে রয়েছে কিনা তা নির্ধারণ করতে কেবল একটি সাধারণ বীজগণিত কৌশল ব্যবহার করে। সূত্রটি:

(y-b)(c-a) - (x-a)(d-b)

যা বিন্দুটি বলবে যে একটি রেখার কোন দিকে, opeালের সংজ্ঞাটি পুনরায় সাজানো থেকে উদ্ভূত:

            m = (y2-y1)/(x2-x1)
      (y2-y1) = m(x2-x1)
       (y-y1) = m(x-x1)     ,substituting point we are testing (x,y) to be the 2nd point
       (y-y1) = (x-x1)(y2-y1)/(x2-x1)  ,substitute back the original definition of m
(y-y1)(x2-x1) = (x-x1)(y2-y1)    <-- left side will be greater than the right side, if
                                     the point is on the left; otherwise, it's on the right
            0 = (y-b)(c-a)-(x-a)(d-b) ,where (a,b)=(x1,y1), (c,d)=(x2,y2)

আমরা যদি সমস্ত 3 টি দিক পরীক্ষা করি তবে সমস্ত 3 টি একই সংকেত সহ কিছু সংখ্যার ফলস্বরূপ তখনই পয়েন্টটি ত্রিভুজের অভ্যন্তরে থাকে কারণ আমরা এটি ত্রিভুজের চারপাশে পরীক্ষা করে যাচ্ছি। যদি বিন্দুটি একদিকে থাকে তবে পরীক্ষার একটিতে 0টি ফিরে আসা উচিত।

জেএসফিডাল পরীক্ষার কোড: http://jsfiddle.net/DerekL/zEzZU/

var l = [[-0.31961, -0.12646, 0.38478, 0.37419, -0.30613, -0.59754, -0.85548, 0.6633],[-0.87427, -0.00831, 0.78829, 0.60409, -0.90904, -0.13856, -0.80685, 0.48468],[0.28997, -0.03668, -0.28362, 0.42831, 0.39332, -0.07474, -0.48694, -0.10497],[-0.07783, 0.04415, -0.34355, -0.07161, 0.59105, -0.93145, 0.29402, 0.90334],[0.36107, 0.05389, 0.27103, 0.47754, -0.00341, -0.79472, 0.82549, -0.29028],[-0.01655, -0.20437, -0.36194, -0.90281, -0.26515, -0.4172, 0.36181, 0.51683],[-0.12198, -0.45897, -0.35128, -0.85405, 0.84566, 0.99364, 0.13767, 0.78618],[-0.03847, -0.81531, -0.18704, -0.33282, -0.95717, -0.6337, 0.10976, -0.88374],[0.07904, -0.06245, 0.95181, -0.84223, -0.75583, -0.34406, 0.16785, 0.87519],[-0.33485, 0.53875, -0.25173, 0.51317, -0.62441, -0.90698, -0.47925, 0.74832],
         [-0.99103, 0.43842, 0.78128, -0.10985, -0.84714, -0.20558, -0.08925, -0.78608],[0.15087, -0.56212, -0.87374, -0.3787, 0.86403, 0.60374, 0.01392, 0.84362],[0.1114, 0.66496, -0.92633, 0.27408, 0.92439, 0.43692, 0.8298, -0.29647],[0.87786, -0.8594, -0.42283, -0.97999, 0.58659, -0.327, -0.22656, 0.80896],[0.43525, -0.8923, 0.86119, 0.78278, -0.01348, 0.98093, -0.56244, -0.75129],[-0.73365, 0.28332, 0.63263, 0.17177, -0.38398, -0.43497, -0.31123, 0.73168],[-0.57694, -0.87713, -0.93622, 0.89397, 0.93117, 0.40775, 0.2323, -0.30718],[0.91059, 0.75966, 0.60118, 0.73186, 0.32178, 0.88296, -0.90087, -0.26367],[0.3463, -0.89397, 0.99108, 0.13557, 0.50122, -0.8724, 0.43385, 0.00167],[0.88121, 0.36469, -0.29829, 0.21429, 0.31395, 0.2734, 0.43267, -0.78192]];

function d(x,y,a,b,c,d,e,f){function z(a,b,c,d){return(y-b)*(c-a)-(x-a)*(d-b)>0}return(z(a,b,c,d)+z(c,d,e,f)+z(e,f,a,b))%3<1}

for(var i = 0; i < l.length; i++){
    console.log(d.apply(undefined,l[i]));    //10 true, 10 false
}

কফিস্ক্রিপ্টে রূপান্তরিত হলে 97 টি অক্ষর (স্পেস বা ট্যাব গণনা করছে না) গণনা করুন:

d=(x,y,a,b,c,d,e,f)->
    z=(a,b,c,d)->
        (y-b)*(c-a)-(x-a)*(d-b)>0
    (z(a,b,c,d)+z(c,d,e,f)+z(e,f,a,b))%3<1

115 অক্ষরগুলি যদি ES6 তে রূপান্তরিত হয়:

d=(x,y,a,b,c,d,e,f)=>{z=(a,b,c,d)=>{return (y-b)*(c-a)-(x-a)*(d-b)>0};return(z(a,b,c,d)+z(c,d,e,f)+z(e,f,a,b))%3<1}

এটি হ'ল "অভিনব ভেক্টর গণিত": আমি ব্যবহার করছি: ডি (যদিও অভিনব ব্যারেন্সেন্ট্রিক সমন্বয় পদ্ধতির কেউ কেউ গ্রহণ করেছেন)। শীর্ষ-ভোট প্রাপ্ত উত্তরের মতো, আপনি ES6 ব্যবহার করে এবং এর মতো ফাংশনগুলি সংজ্ঞায়িত করে কয়েকটি বাইট সংরক্ষণ করতে পারেন d=(x,y,...)=>{...}। আপনার ক্ষেত্রে, আপনি কফি স্ক্রিপ্ট ব্যবহার করে আরও বেশি সঞ্চয় করতে পারবেন, যার প্রয়োজন নেই return: পেস্টবিন . com / আরভিএফকি 1 ডি 5 কে ... এবং যে কোনও ক্ষেত্রে আপনি <1পরিবর্তে ব্যবহার করে একটি বাইট সংরক্ষণ করতে পারেন ==0
মার্টিন ইন্ডার

@ এম.বুয়েটনার: ও আমি ভেবেছিলাম যে আমি যে সমীকরণটি ব্যবহার করেছি সেগুলি ভেক্টরগুলির সাথে (সাধারণ বীজগণিত থেকে প্রাপ্ত) কোনও সম্পর্ক নেই তবে স্পষ্টতই তারা উভয়ই একই সমীকরণ লাভ করে। ম্যাথ দুর্দান্ত।
ডেরেক 朕 會 功夫

1

আর, 23

ম্যাটল্যাব দ্বারা অনুপ্রাণিত ,

SDMTools::pnt.in.poly()

SDMTools::pnt.in.poly(point,triangle)যেখানে pointদৈর্ঘ্য -২ ভেক্টর এবং triangleএর মতো একটি শীর্ষস্থানীয় 3x2 ম্যাট্রিক্স called এসডিএমটিউলস সিআরএএন-তে উপলব্ধ।


1

গণিত, 38 টি অক্ষর

RegionMember[Polygon[#[[1]]],#[[2]]] &

উদাহরণ:

d = {{{0, 0}, {1, 0}, {.5, .7}}, {.5, .6}};

RegionMember[Polygon[#[[1]]], #[[2]]] & @ d

(* সত্য *)


অক্ষর হিসাবে স্থানগুলি গণনা করা মানসম্মত, তবে সম্ভবত এখানে আপনি কিছু না ভাঙ্গিয়ে এগুলি সরাতে পারবেন।
xnor

1
এছাড়াও, আপনাকে পূর্বনির্ধারিত ভেরিয়েবলগুলি ব্যবহার না করে ইনপুট নিতে এবং আউটপুট উত্পাদন করতে হবে। তারা কিছু কী করে তা দেখতে আপনি কিছু গণিতের উত্তর অনুসন্ধান করতে পারেন।
xnor

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