ত্রিভুজাকার যুদ্ধযুদ্ধ (একটি গণনার জ্যামিতির সমস্যা)


18

আপনি যুদ্ধের অধিনায়ক। ইঞ্জিনিয়ারিং বিভাগ এই বছর ডিজাইনের সাহায্যে কোণগুলি কাটছে, সুতরাং আপনি যে জাহাজটি করছেন সেটিকে একটি সাধারণ ত্রিভুজ আকারে নিয়ে যায়।

আপনি ডেকের উপর দিয়ে বাইরে বেরোন এবং সমুদ্রের বাতাস উপভোগ করুন ... যদিও বেশি দিন নয়। একজন শত্রু আপনাকে লক্ষ্য করে গুলি চালিয়েছে! - তবে শটটি কি আঘাত করবে?

ইনপুট

আপনি এই চ্যালেঞ্জের জন্য কোনও ফাংশন বা একটি সম্পূর্ণ প্রোগ্রাম লিখতে পারেন।

আপনার প্রোগ্রামটি 11 টি পূর্ণসংখ্যার মধ্যে নেবে, যার মধ্যে দশটি যুক্ত রয়েছে:

  • প্রথম তিনটি জোড় সংখ্যার (x 1 , y 1 ), (x 2 , y 2 ), (x 3 , y 3 ) আপনার জাহাজের শীর্ষকোষ নির্দিষ্ট করবে। গঠিত ত্রিভুজটির ননজারো অঞ্চল থাকবে।

  • পরবর্তী জোড়াটি পূর্ণসংখ্যা (e x , e y ) শত্রুদের কামানের অবস্থান নির্দিষ্ট করে। শত্রু কামান কখনই বা আপনার জাহাজের সীমানার মধ্যে পড়ে থাকবে না *

  • এর পরে জুটি (একটি x , y ) শত্রু কোথায় লক্ষ্য করে তা নির্দিষ্ট করে। এটি (ই x , ই y ) থেকে পৃথক হবে ।

  • চূড়ান্ত ধনাত্মক পূর্ণসংখ্যার আর শত্রুর শটের পরিসর নির্দিষ্ট করে

* আপনি যদি ভয়ঙ্কর অধিনায়ক হয়ে থাকেন তবে তা যদি আপনি নাও দেখে থাকেন তবে!

আউটপুট

যুদ্ধক্ষেত্রটি আঘাত হানলে আপনাকে অবশ্যই সত্যবাদী মান (যেমন সত্য, 1) প্রিন্ট করতে হবে / ফেরত পাঠাতে হবে, অন্যথায় একটি মিথ্যা মান (যেমন মিথ্যা, 0)।

হিট কী?

শত্রু শটটি (ই x , ই y ) থেকে দৈর্ঘ্যের একটি সরল রেখাংশ (একটি x , একটি y ) এর দিকের দিক is যদি এই রেখাংশটি আপনার ত্রিভুজাকার যুদ্ধের অভ্যন্তরের কোনও অংশকে ওভারল্যাপ করে , তবে এইটিকে হিট হিসাবে গণনা করা হবে। অন্যথায় এটি হিট নয়।

যে শটগুলি বরাবর চরে বা কেবল ত্রিভুজের সীমানা পর্যন্ত পৌঁছায় সেগুলি হিট হিসাবে গণ্য হয় না।

উদাহরণ

0 0 0 1 1 0
1 1
0 0
2

বর্তমানে test1 ফাইল

হিট: শত্রু ঠিক আপনার জাহাজের মাঝখান দিয়ে গুলি করেছে!


2 0 0 2 4 4
0 0
1 1
1

test2 |

কোনও আঘাত নয়: শত্রুর পরিসর খুব কম, সুতরাং আপনি নিরাপদ।


0 0 1 2 3 0
-4 0
0 0
8

test3 নামক

কোনও আঘাত নয়: শত্রু আপনার জাহাজের পাশ ঘিরে রেখেছে, সুতরাং এটি হিট হিসাবে গণ্য হবে না। লাকি!


0 0 -1 3 4 -1
-3 -4
3 4
5

test4

কোনও আঘাত নয়: শত্রু শটটি জাহাজের কিছুটা থামে, তাই আপনি নিরাপদ হন। শত্রুর কামানটি যদি আরও খানিকটা ভাল পরিসীমা থাকে তবে আপনি আঘাত হানে! রাম রাম!


-2 -3 -3 6 7 -2
-6 2
1 -4
7

test5

হিট: শটটি অন্যদিকে প্রবেশ করতে না পারলেও এটি এখনও হিট।


-3 2 2 -4 7 -3
-3 -4
-3 0
10

test6

কোনও হিট নয়: রেকর্ডটির জন্য, এটি আরেকটি কাছাকাছি মিস।


অতিরিক্ত পরীক্ষার মামলা

0 0 6 0 6 8
-6 -8
6 8
20

test7

কোনও হিট নয়: এটি অন্য চারণ, তবে একটি কোণে।


0 0 -2 -5 5 3
-3 4
0 0
6

test8

হিট: শটটি জাহাজের একটি শীর্ষে দিয়ে প্রবেশ করেছে।

স্কোরিং

এটি , তাই বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জয়ী। স্ট্যান্ডার্ড লুফোলস প্রযোজ্য।


কেবলমাত্র আমরা যা পারি না তা নিশ্চিত করার জন্য: আমরা কি ধরে নিতে পারি যে জাহাজটির কোনও তল নেই এবং উভয় পক্ষের মধ্যে একটি ছোট ফাঁক রয়েছে, যাতে শটটি যদি তার কোণার মাধ্যমে জাহাজে প্রবেশ করতে পারে তবে আমরা এটিকে মিস হিসাবে গণনা করব?
জন ডিভোরাক

টুইট সুতরাং চতুর্থ উদাহরণে, যদি পরিসীমাটি 5 এর বেশি হয় তবে এটি হিট হবে।
Sp3000

আমাদের কতটুকু যুক্তি দিয়ে খেলতে দেওয়া হয়? আমাদের কি তাদের গোষ্ঠীভুক্ত করতে, আদেশ পরিবর্তন করতে, বা তারা ভাসমান হতে হবে?
FryAmTheEggman

@ ফ্রাইএইমডিজম্যান আপনি প্রয়োজন হিসাবে যুক্তিগুলি দলবদ্ধ বা পুনর্বিন্যাস করতে পারেন। আপনি ভাসা ব্যবহার করতে পারেন, তবে প্রোগ্রামটির যথার্থতার বিষয়ে চিন্তা না করে ছোট গ্রিডগুলির জন্য (20x20 অবধি বলা) সঠিকভাবে কাজ করা দরকার।
Sp3000

আমি মনে করি উদাহরণগুলির মধ্যে একটি গুরুত্বপূর্ণ ঘটনা অনুপস্থিত যা আমার উদ্দেশ্যযুক্ত সমাধানটিকে ব্যর্থ করে তুলেছে: যখন জাহাজটি কোনও কোণে প্রবেশ করা হয়, উদাহরণস্বরূপ 0 0 -1 3 4 -1 -3 -4 3 4 6
নটকি

উত্তর:


3

পাইথন 3, 252 বাইট

আমি অবশ্যই কোড গল্ফটিতে এটি ব্যবহার করেছি সবচেয়ে বেশি পরিবর্তনশীল। : ^ পি

from math import*;A=atan2
def h(a,b,c,d,e,f,g,h,i,j,R):
 r=R;_=0
 while r>0:Q=A(j-h,i-g);k,l=g+r*cos(Q),h+r*sin(Q);D=A(d-b,c-a);E=A(f-b,e-a);F=A(l-b,k-a);G=A(b-d,a-c);H=A(f-d,e-c);I=A(l-d,k-c);_=_ or(D<F<E or E<F<D)and(G<I<H or H<I<G);r-=.001
 return _

মন্তব্যে কিছুটা নাড়িত

from math import*
# Parameters:
#  (a,b) (c,d) (e,f) - vertices of the triangle
#  (g,h) - location of cannon
#  (i,j) - aim of cannon
#  R - range of cannon
# Variables within function:
#  _ - was this shot a hit?
#  r - distance 0 < r <= R that we're testing
#  Q - angle between cannon source and destination
#  (k,l) - point that we're testing
#  D,E,F - angles between point 1 and 2,3,test
#  G,H,I - angles between point 2 and 1,3,test
def h(a,b,c,d,e,f,g,h,i,j,R):
    r=R;_=0
    while r>0:
        Q=atan2(j-h,i-g)
        k,l=g+r*cos(Q),h+r*sin(Q)
        D=atan2(d-b,c-a)
        E=atan2(f-b,e-a)
        F=atan2(l-b,k-a)
        G=atan2(b-d,a-c)
        H=atan2(f-d,e-c)
        I=atan2(l-d,k-c)
        _=_ or(D<F<E or E<F<D)and(G<I<H or H<I<G)
        r-=.001
    return _

কিভাবে এটা কাজ করে:

  • শটের শেষ পয়েন্ট গণনা করুন।
  • শেষ বিন্দু থেকে কামানের অবস্থান পর্যন্ত লাইন ধরে প্রচুর পয়েন্ট পরীক্ষা করুন:
    • শীর্ষস্থানীয় 1 থেকে অন্যান্য দুটি শীর্ষে এবং পরীক্ষার বিন্দুতে কোণ গণনা করুন;
    • কোণটি 2 থেকে অন্যান্য দুটি শীর্ষে এবং পরীক্ষার বিন্দুতে গণনা করুন;
    • যদি উভয় ক্ষেত্রেই পরীক্ষার পয়েন্ট কোণ অন্য দুটি কোণের মধ্যে থাকে তবে পরীক্ষার পয়েন্টটি ত্রিভুজের মধ্যে থাকে এবং জাহাজটি আঘাত পেয়েছে।

নমুনা রান:

>>> h(0,0,0,1,1,0,1,1,0,0,2)
True
>>> h(0,0,1,2,3,0,-4,0,0,0,8)
False
>>> h(0,0,-1,3,4,-1,-3,-4,3,4,5)
False
>>> h(-2,-3,-3,6,7,-2,-6,2,1,-4,7)
True

2

পাইথন 2.7, 235 বাইট tes

from numpy import*
X=cross
h=lambda q,w,a,s,y,x,c,v,d,f,r:max([(X([a-q,s-w],[c+k*(d-c)-q,v+k*(f-v)-w])>0)==(X([y-a,x-s],[c+k*(d-c)-a,v+k*(f-v)-s])>0)==(X([q-y,w-x],[c+k*(d-c)-y,v+k*(f-v)-x])>0)for k in arange(0,r/hypot(d-c,f-v),1e-4)])

AB x APকোণার A, B এবং পয়েন্ট P এর মধ্যে ক্রস পণ্যটি গণনা করে all

Ungolfed:

from numpy import *
def i(q,w,a,s,y,x,e,r): # helper-function, checks whether ER is inside the triangle QW-AS-YX
  t=cross([a-q,s-w],[e-q,r-w])>0
  g=cross([y-a,x-s],[e-a,r-s])>0
  b=cross([q-y,w-x],[e-y,r-x])>0
  return t==g==b

def h(q,w,a,s,y,x,c,v,d,f,r):
  R=arange(0,r/hypot(d-c,f-v),1e-3)
  return max([i(q,w,a,s,y,x,c+k*(d-c),v+k*(f-v)) for k in R])

পরীক্ষা:

In : h(0,0,0,1,1,0,1,1,0,0,2)
Out: True

In : h(-3,2,2,-4,7,-3,-3,-4,-3,0,10)
Out: False

In : h(0,0,1,2,3,0,-4,0,0,0,8)
Out: True
     Grazes may count as hits...
In : h(1,2,0,0,3,0,-4,0,0,0,8)
Out: False
     ...or not, depending on the order of edges

1

সি, 247 বাইট

অবশ্যই বেশ গল্ফ হয়নি।

#include<math.h>
int z(float*k){float s=1e-3,t=s,p=k[8]-k[6],q=k[9]-k[7],r=k[10]/hypot(p,q);int w=0;for(;t<1;t+=s){float x=k[6]-k[0]+p*r*t,y=k[7]-k[1]+q*r*t,b=k[2]*k[5]-k[3]*k[4],d=(x*k[5]-y*k[4])/b,e=(x*k[3]-y*k[2])/b;w|=d>0&e<0&d-e<1;}return w;}

বর্তমানে এটি ডিএলসকের সমাধানের অনুরূপ একটি পন্থা ব্যবহার করে, অর্থাৎ এটি ত্রিভুজটির সাথে ছেদ করে কিনা তা নির্ধারণের জন্য লাইন বিভাগের সমস্ত সম্ভাব্য স্থানাঙ্কের মাধ্যমে পুনরাবৃত্তি করে। (সুতরাং এটি পরিসীমাটি 1000 এর বেশি হলে এটি ব্যর্থ হবে) তবে এটি ত্রিভুজের ভিতরে কোনও বিন্দু রয়েছে কিনা তা নির্ধারণ করতে http://mathworld.wolfram.com/TriangleInterior.html থেকে সূত্রটি ব্যবহার করে । এটি ট্রিগনোমেট্রিক ফাংশনগুলির একটি গোছা এড়িয়ে চলে।


উদাহরণ চেক, মুদ্রণ করা উচিত 1 0 0 0 1 0

#include <stdio.h>
int main() {
    {
        float arr[] = {0,0,0,1,1,0,1,1,0,0,2};
        printf("%d\n", z(arr));
    }

    {
        float arr[] = {2,0,0,2,4,4,0,0,1,1,1};
        printf("%d\n", z(arr));
    }

    {
        float arr[] = {0,0,1,2,3,0,-4,0,0,0,8};
        printf("%d\n", z(arr));
    }

    {
        float arr[] = {0,0,-1,3,4,-1,-3,-4,3,4,5};
        printf("%d\n", z(arr));
    }

    {
        float arr[] = {-2,-3,-3,6,7,-2,-6,2,1,-4,7};
        printf("%d\n", z(arr));
    }

    {
        float arr[] = {-3,2,2,-4,7,-3,-3,-4,-3,0,10};
        printf("%d\n", z(arr));
    }
}

1

জাভাস্ক্রিপ্ট (ES6) 320 448 522 627

(এখনও আরও গল্ফ করা যেতে পারে?)

পদক্ষেপ:

  1. আসল হিট লক্ষ্যটি (শত্রু থেকে লক্ষ্য পর্যন্ত লাইনটিতে দূরত্বের বিন্দুতে পয়েন্ট)
  2. হিট করুন: শত্রু হতে যদি সেগমেন্টটি লক্ষ্যবস্তু করে জাহাজের যে কোনও দিককে ছেদ করে তবে শেষ প্রান্তে নয়
  3. খুব হিট করুন: যদি লক্ষ্যটি জাহাজের অভ্যন্তরে থাকে - এমনকি শটটি যদি একটি প্রান্তে প্রবেশ করেও - পরীক্ষার ক্ষেত্রে 8

সূত্র:
সেগমেন্ট ছেদ
পয়েন্ট ত্রিভুজ ভিতরে
পয়েন্ট একটি সেগমেন্ট একটি দূরত্ব দেওয়া

ফায়ারফক্সে পরীক্ষা

C=(i,j,k,l,m,n,g,h,a,b,r,
  d=a-g,e=b-h,f=r/Math.sqrt(d*d+e*e),
  p=g+f*d,q=h+f*e,
  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=(i,j,k,l,
     a=k-i,b=l-j,c=p-g,d=q-h,e=i-g,f=j-h,
     s=a*f-b*e,t=c*f-d*e,m=a*d-c*b)=>
     m&&((s/=m)>0&s<1&(t/=m)>0&t<1)
)=>s>0&t>0&s+t<1|S(i,j,k,l)|S(i,j,m,n)|S(m,n,k,l)

// Test
MyOutput.innerHTML = ['Test1', C(0,0, 0,1, 1,0, 1,1, 0,0, 2),
'<br>Test2', C(2,0, 0,2, 4,4, 0,0, 1,1, 1),
'<br>Test3', C(0,0, 1,2, 3,0, -4,0, 0,0, 8),
'<br>Test4', C(0,0, -1,3, 4,-1, -3,-4, 3,4, 5),
'<br>Test5', C(-2,-3, -3,6, 7,-2, -6,2, 1,-4, 7),
'<br>Test6', C(-3,2, 2,-4, 7,-3, -3,-4, -3,0 ,10),
'<br>Test7', C(0,0, 6,0, 6,8, -6,-8, 6,8, 20),
'<br>Test8', C(0,0,-2,-5, 5,3, -3,4, 0,0, 6)];
<div id="MyOutput"></div>

Ungolfed

function check(p0x, p0y, p1x, p1y, p2x, p2y, ex, ey, ax, xy, r)
{
  var sec = function(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y)
  {
      var s10x = p1x - p0x, s10y = p1y - p0y, 
          s32x = p3x - p2x, s32y = p3y - p2y,
          s02x = p0x - p2x, s02y = p0y - p2y,
          s = s10x * s02y - s10y * s02x, t = s32x * s02y - s32y * s02x,
          d = s10x * s32y - s32x * s10y;
      return d && (s/=d) > 0 && s<1 && (t/=d) > 0 && t < 1 && [p0x + (t * s10x), p0y + (t * s10y)];
  }
  var pr = function(p0x, p0y, p1x, p1y, r)
  {
      var dx = (p1x-p0x), dy = (p1y-p0y), f = r/Math.sqrt(dx*dx+dy*dy);
      return [p0x + f*dx, p0y+f*dy];
  }
  var inside = function(p0x, p0y, p1x, p1y, p2x, p2y, px, py)
  {
      var area2 = (-p1y*p2x + p0y*(-p1x + p2x) + p0x*(p1y - p2y) + p1x*p2y),
          s = (p0y*p2x - p0x*p2y + (p2y - p0y)*px + (p0x - p2x)*py)/area2,
          t = (p0x*p1y - p0y*p1x + (p0y - p1y)*px + (p1x - p0x)*py)/area2;
      return s > 0 && t > 0 && s+t < 1;
  }
  var tx, xy;
  [tx, ty] = pr(ex, ey, ax, ay, r);

  return inside(p0x, p0y, p1x, p1y, p2x, p2y, tx,ty)
  || sec(p0x, p0y, p1x, p1y, ex, ey, tx, ty)
  || sec(p0x, p0y, p2x, p2y, ex, ey, tx, ty)
  || sec(p2x, p2y, p1x, p1y, ex, ey, tx, ty);
}  
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.