ত্রিভুজগুলি চিহ্নিত করা


11

কোনও ছবিতে ত্রিভুজগুলির পরিমাণ গণনা করা মস্তিষ্কের পরীক্ষায় সাধারণত ব্যবহৃত একটি কাজ। আপনি একটি ছবি দেওয়া আছে যা ত্রিভুজ সমন্বিত আকার ধারণ করে। তারপরে আপনাকে অবশ্যই ছবিতে সমস্ত সম্ভাব্য ত্রিভুজ খুঁজে পাবেন।

কার্য

আপনার পছন্দের বিন্যাসে আপনাকে লাইনের একটি তালিকা দেওয়া হবে। তারপরে আপনাকে অবশ্যই এটিতে পাওয়া ত্রিভুজগুলির একটি তালিকা আউটপুট করতে হবে

ইনপুট

আপনাকে লাইনগুলির একটি তালিকা দেওয়া হবে, প্রত্যেকটি চারটি সংখ্যার স্থানাঙ্ক (যেমন। x1 y1 x2 y2) দ্বারা প্রদত্ত । আপনি ইনপুট ফর্ম্যাটটি চয়ন করতে পারেন, যতক্ষণ না এটি স্পষ্টভাবে নথিভুক্ত থাকে। উদাহরণ:

0 4 8 1
0 4 9 5
8 1 9 5
2 8 0 4
9 5 2 8

[[0, 4, 8, 1], [0, 4, 9, 5], [8, 1, 9, 5], [2, 8, 0, 4], [9, 5, 2, 8]]

এখানে একটি চিত্র হিসাবে একই ইনপুট:

ত্রিভুজ অঙ্কন

ছেদগুলি সহ অন্য একটি (স্থান সংরক্ষণের জন্য কেবলমাত্র এক ফর্ম্যাটে):

[[2, 1, 5, 0], [2, 1, 2, 7], [5, 0, 6, 6], [5, 0, 2, 7], [6, 6, 2, 1], [2, 7, 6, 6]]

ত্রিভুজ অঙ্কন

আউটপুট

আপনাকে অবশ্যই সমস্ত ত্রিভুজগুলির একটি তালিকা আউটপুট করতে হবে, প্রতিটি x1 y1 x2 y2 x3 y3ইনপুট দ্বারা নির্দিষ্ট ছবিতে ছয়টি ভাসমান-পয়েন্ট স্থানাঙ্ক (উদাহরণস্বরূপ ) দ্বারা প্রদত্ত। এগুলি পূর্ণসংখ্যার নাও হতে পারে, যেহেতু লাইনগুলি যে কোনও সময়ে অতিক্রম করতে পারে। আপনি আউটপুট ফর্ম্যাটটি চয়ন করতে পারেন, যতক্ষণ না এটি স্পষ্টভাবে ডকুমেন্টেড থাকে। উপরে উদাহরণস্বরূপ ইনপুটগুলির জন্য ফলাফল আউটপুট:

0 4 8 1 9 5
0 4 9 5 2 8

[[0, 4, 8, 3, 9, 5], [0, 4, 9, 5, 2, 8]]
[[2, 1, 5, 0, 2, 7], [2, 1, 5, 0, 6, 6], [5, 0, 6, 6, 2, 7], [2, 1, 6, 6, 2, 7], [2, 1, 5, 0, 3.674, 3.093], [5, 0, 6, 6, 3.674, 3.093], [6, 6, 2, 7, 3.674, 3.093], [2, 7, 2, 1, 3.674, 3.093]]

আপনি এটা ধরে নিতে পারেন

  • এমন কোনও প্রান্তের ঘটনা নেই যেখানে কোনও লাইন একটি ছেদকে পার করে তবে কোনও লাইনের মতো নয়

    [[0, 9, 1, 8], [1, 8, 2, 9], [2, 9, 3, 8], [3, 8, 4, 9], [4, 9, 0, 9]]
    
  • মত 179 ডিগ্রি এর বেশি কোন কোণ নেই

    [[0, 0, 0, 1], [0, 1, 0, 2], [0, 2, 0, 0]]
    

বিধি

  • আপনি যে কোনও ভাষা ব্যবহার করতে পারেন।
  • কোনও বাহ্যিক সংস্থান ব্যবহার করা উচিত নয়।
  • স্ট্যান্ডার্ড লুফোলস প্রযোজ্য।

স্কোরিং

এই , তাই সংক্ষিপ্ত উত্তর বাইট ধিক্কার জানাই।


3-চক্র চিহ্নিত করা কি যথেষ্ট বা আমাদের আরও জটিল প্রান্তের মামলাগুলি পরিচালনা করতে হবে? উদাহরণস্বরূপ "পেন্টাগন" দ্বারা সংজ্ঞায়িত করা [0,9],[1,8],[2,9],[3,8],[4,9]আসলে একটি ডাব্লু যা উপরের রেখাটি আঁকা। এটি কি কোনও ত্রিভুজ বা 2 ত্রিভুজ নয়?
স্তর নদী সেন্ট

@steveverrill বলুন যে প্রান্তের মামলাগুলি উপেক্ষা করা যেতে পারে।
পূর্কাকাডারী

ঠিক আছে. এবং [0,0],[1,0],[2,0],[1,2]180 ডিগ্রির একটি কোণ সহ একটি "চতুর্ভুজ"। ত্রিভুজ বা 1 ত্রিভুজ নেই?
লেভেল নদী সেন্ট

এটি একটি ত্রিভুজ নয়, তবে আপনি ধরে নিতে পারেন যেটি আসে না।
পূর্বকোদাডারি

উত্তর:


1

পোস্টজিআইএস, 162

আমি মনে করি এটি নিয়ম মেনে চলে, এটি পোস্টজিআইএস-এর একটি ক্যোয়ারী, যা পোস্টগ্রিজ এসকিউএল-র একটি এক্সটেনশন। ইনপুটটি প্রতিটি লাইনের জন্য স্থানাঙ্কের একটি টেবিল বলে ধরে নেওয়া হয় এল আউটপুট গঠিত ত্রিভুজগুলির বহুভুজ সংজ্ঞা সহ সারিগুলির একটি সেট।

SELECT ST_AsText(D)FROM(SELECT(ST_Dump(ST_Polygonize(B))).geom D FROM(SELECT ST_Union(ST_MakeLine(ST_Point(A,B),ST_Point(C,D)))B FROM L)A)B WHERE ST_NPoints(D)=4;

ব্যবহারে এটি নীচের মত দেখাচ্ছে

-- Create a table for the input
CREATE TABLE L (A INT, B INT, C INT,D INT);
INSERT INTO L VALUES(2, 1, 5, 0), (2, 1, 2, 7), (5, 0, 6, 6), (5, 0, 2, 7), (6, 6, 2, 1), (2, 7, 6, 6);

SELECT ST_AsText(D)FROM(SELECT(ST_Dump(ST_Polygonize(B))).geom D FROM(SELECT ST_Union(ST_MakeLine(ST_Point(A,B),ST_Point(C,D)))B FROM L)A)B WHERE ST_NPoints(D)=4;

-- Cleanup
DROP TABLE L;

আউটপুট নিম্নরূপ:

POLYGON((5 0,2 1,3.67441860465116 3.09302325581395,5 0))
POLYGON((6 6,5 0,3.67441860465116 3.09302325581395,6 6))
POLYGON((3.67441860465116 3.09302325581395,2 7,6 6,3.67441860465116 3.09302325581395))
POLYGON((2 7,3.67441860465116 3.09302325581395,2 1,2 7))

7

গণিত 915 395 401 405

হালনাগাদ

এই প্রোগ্রামিং চ্যালেঞ্জটি প্রথম প্রদর্শিত হওয়ার চেয়ে অনেক বেশি কঠিন।

বর্তমান পদ্ধতির সরল কেসগুলির সাথে কাজ করে, যেখানে কোনও রেখাংশের দৈর্ঘ্যের সাথে একক ছেদ রয়েছে। এক বিভাগে একাধিক ক্রসিংয়ের সাথে প্রতিটি লাইন বরাবর সমস্ত ছেদ পয়েন্টের ট্র্যাক রাখা এবং লক্ষ্য রেখার সাথে সমস্ত ছেদ পয়েন্টের সাথে নতুন ছেদ সংযোগকারী নতুন উপ-বিভাগগুলি (সুতরাং অতিরিক্ত গ্রাফ প্রান্ত) তৈরি করা প্রয়োজন is

এই সীমাবদ্ধতা সত্ত্বেও, বর্তমান পদ্ধতির অন্তর্নিহিত যুক্তিটি ভাগ করে নেওয়া উপযুক্ত।


ইনপুট লাইন বিভাগগুলিকে অঞ্চল হিসাবে বিবেচনা করা হয়। যদি তারা ছেদ করে তবে সেন্ট্রয়েড ছেদটির স্থানাঙ্ক হবে। আমাদের সেই ছেদগুলি দূর করতে হবে যা লাইন বিভাগগুলির শীর্ষে অবস্থিত। যে রেখাগুলি ছেদ করে না তাদের একটি অনির্দিষ্ট সেন্ট্রয়েড থাকবে roid

প্রতিটি ছেদ পয়েন্টের জন্য চারটি নতুন প্রান্ত তৈরি করা হয়। তারা ছেদ বিন্দুটিকে দুটি ছেদকৃত রেখার চারটি উল্লম্বের সাথে সংযুক্ত করে।

ডানদিকে নীচের মত একটি গ্রাফ পুরানো এবং নতুন উভয় প্রান্ত ব্যবহার করে তৈরি করা হয়।

শিখরগুলি সংশ্লিষ্ট পয়েন্টগুলির স্থানাঙ্ক হয়। চক্র, অর্থাত্, তিনটি উল্লম্বের বন্ধ লুপগুলি ত্রিভুজ হবে তবে শর্ত থাকে যে তিনটি উল্লম্ব কোলাইনারি নয়।

বর্তমানে আমরা কোনও "ত্রিভুজ" এর একটি সীমিত অঞ্চল আছে কিনা তা পরীক্ষা করে দেখছি। (কোনও কারণে এটি তিনটি কোলাইনারি পয়েন্টের জন্য 0 এর ক্ষেত্রটি ফেরায় না))


একটি সহজ উদাহরণ

নীচে (ক) স্থানাঙ্ক প্লেনে প্লট করা চিত্র এবং (খ) প্রদত্ত নোডগুলি পাশাপাশি ছেদ নোডকে দেখায় এমন চিত্র {114/23, 314/69},। পরবর্তীকালে, উল্লম্বগুলি সংশ্লিষ্ট কার্টেসিয়ান স্থানাঙ্কগুলিতে অবস্থিত না।

এটি প্রদর্শিত হতে পারে যে তাদের বাম দিকের চেয়ে ডান চিত্রে আরও প্রান্ত রয়েছে। তবে মনে রাখবেন যে বামদিকে ওভারল্যাপিং গ্রাফ প্রান্ত রয়েছে। প্রতিটি তির্যকটি আসলে 3 টি গ্রাফ প্রান্তের সাথে মিলে যায়!


গ্রাফ

    f@w_ :=(h@{a_, b_, c_, d_} := (r = RegionCentroid@RegionIntersection[Line@{a, b}, Line@{c, d}];
     {r <-> a, r <-> b, r <-> c, r <-> d});
      Cases[FindCycle[Graph[Union@Join[w /. {{a_, b_Integer}, {c_, d_}} :> {a, b} <-> {c, d},
      Cases[Flatten[h /@ Cases[{Length[Union@#] < 4, #} & /@ (FlattenAt[#, {{1}, {2}}] & /@ 
      Subsets[w, {2}]),{False, c_} :> c]], Except[{Indeterminate, _} <-> _]]]], {3}, 50],
      x_ /; NumericQ[RegionMeasure@Triangle[x[[All, 1]]]]][[All, All, 1]]//N//Grid)

নীচে প্রতিটি সারি একটি ত্রিভুজ।

f[{{{2,8},{8,1}},{{0,4},{8,1}},{{0,4},{9,5}},{{8,1},{9,5}},{{2,8},{0,4}},{{9,5},{2,8}}}]

coords


আরও জটিল উদাহরণ

f@{{{9, 5}, {0, -10}}, {{9, 5}, {0, 2}},  {{9, 5}, {2, -1}}, {{0, -10}, {2, -1}}, {{0, -10}, {-2, -1}}, {{-9, 5}, {0, -10}}, {{-9, 5}, {0, 2}}, {{-9, 5}, {-2, -1}}, {{0, 2}, {0, -10}}, {{-9, 5}, {2, -1}}, {{9, 5}, {-2, -1}}, {{-9, 5}, {9, 5}}}

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

graph2


এখানে প্রাপ্ত গ্রাফ।
এটি ছেদ করার উত্সযুক্ত পয়েন্ট অন্তর্ভুক্ত করে (0,1/11), যেখানে কিছু ইনপুট লাইন ক্রস করে।

উনিশ

কোডটি 19 টি ত্রিভুজ খুঁজে পেয়েছে। (0,1/11)এর মধ্যে নয়টির একটি বিন্দু হিসাবে বিন্দু রয়েছে।

nineteen2


ঠিক আছে. এটি এখন একটি ফাংশন আকারে।
ডেভিডসি

4

জাভা, 1051 1004

(পুরোপুরি কর্মক্ষম প্রোগ্রাম)

আমি ভেবেছিলাম এটি কেবল কয়েকটি কোড গল্ফ করা নয়, তবে মূলত গাণিতিক ফাংশনগুলি লেখার অনুশীলন করা একটি দুর্দান্ত চ্যালেঞ্জ।

এবং একটি "বেসলাইন" আঁকার জন্য আমি জাভাতে এটি তৈরি করেছি * সবাই হাসতে শুরু করার জন্য অপেক্ষা করে *

কোড

import java.util.*;class P{double x,y;static P l(double... i){double a=i[0],b=i[1],c=i[2],d=i[3],e=i[4],f=i[5],k,l,x=(k=i[7]-f)*(c-a)-(l=i[6]-e)*(d-b),n=(l*(b-f)-k*(a-e))/x,m=((c-a)*(b-f)-(d-b)*(a-e))/x;P p=new P();p.x=a+n*(c-a);p.y=b+n*(d-b);return(n>=0&n<=1&m>=0&m<=1&x!=0)?p:null;}public static void main(String[]p){Set<String>v=new HashSet();P q,w,e;Integer a,b,c,d,k,f,g,h,i,j,m,l,r,t,y,z;int[][]x=new int[l=p.length/4][4];for(c=0;c<l;c++){for(d=0;d<4;){x[c][d]=l.parseInt(p[c*4+d++]);}}z=x.length;for(r=0;r<z;r++){a=x[r][0];b=x[r][1];c=x[r][2];d=x[r][3];for(t=0;t<z;t++){if(t!=r){k=x[t][0];f=x[t][1];g=x[t][2];h=x[t][3];q=l(a,b,c,d,k,f,g,h);if(q!=null){for(y=0;y<z;y++){if(y!=r&y!=t){i=x[y][0];j=x[y][1];m=x[y][2];l=x[y][3];w=l(a,b,c,d,i,j,m,l);e=l(k,f,g,h,i,j,m,l);if(w!=null&&e!=null&&q.x!=e.x&q.y!=e.y&!v.contains(""+r+y+t)){v.add(""+r+t+y);v.add(""+r+y+t);v.add(""+t+r+y);v.add(""+t+y+r);v.add(""+y+r+t);v.add(""+y+t+r);System.out.printf("%s %s %s %s %s %s\n",q.x,q.y,w.x,w.y,e.x,e.y);}}}}}}}}}

ইনপুট

স্থান পৃথক পূর্ণসংখ্যার। 4 (x1, y1, x2, y2) এর জোড়ায়

2 1 5 0 2 1 2 7 5 0 6 6 5 0 2 7 6 6 2 1 2 7 6 6

আউটপুট (আসল আউটপুট 3 দশমিকের চেয়ে বেশি হয় না)

প্রতিটি লাইনে একটি ত্রিভুজ থাকে প্রতিটি লাইনে 2 (x1, y1, x2, y2, x3, y3) এর জোড়ায় স্থান বিচ্ছিন্ন ভাসমান পয়েন্ট থাকে। (দ্রষ্টব্য: ত্রিভুজ গঠন করে এমন তিনটি পয়েন্টের ক্রমটি অপরিবর্তিত)

5.0 0.0 2.0 1.0 6.0 6.0
5.0 0.0 2.0 1.0 2.0 7.0
5.0 0.0 2.0 1.0 3.674 3.093
2.0 7.0 2.0 1.0 3.674 3.093
2.0 1.0 2.0 7.0 6.0 6.0
5.0 0.0 6.0 6.0 3.674 3.093
5.0 0.0 6.0 6.0 2.0 7.0
3.674 3.093 2.0 7.0 6.0 6.0

ব্যাখ্যা

দুটি নয়-অনন্ত লাইনের মধ্যবর্তী ছেদটি খুঁজে পেতে আমি একটি পদ্ধতি লিখতে শুরু করি। ফলস্বরূপ পদ্ধতিটি জাভা স্টাইলের জন্য খুব ছোট একটি (246)। পদ্ধতির ইনপুটটি 8 টি ডাবল বা দুটি পয়েন্ট (পি) এর মধ্যে অন্তর্ভুক্ত করার পরিবর্তে আমি প্রচুর পরিমাণে অক্ষর নিরাপদে নিরাপদে রাখতে প্যারামিটার ব্যবহার করতে পছন্দ করি choose অ্যারে অপারেটর ব্যবহার হ্রাস করতে প্রতিটি প্যারামিটার 2 বারের বেশি ব্যবহৃত হয় এটি নিজস্ব ভেরিয়েবলে স্থাপন করা হয়।

static P l(double... i){double a=i[0],b=i[1],c=i[2],d=i[3],e=i[4],f=i[5],k,l,x=(k=i[7]-f)*(c-a)-(l=i[6]-e)*(d-b),n=(l*(b-f)-k*(a-e))/x,m=((c-a)*(b-f)-(d-b)*(a-e))/x;P p=new P();p.x=a+n*(c-a);p.y=b+n*(d-b);return(n>=0&n<=1&m>=0&m<=1&x!=0)?p:null;}

আরও ব্যাখ্যা যুক্ত করতে হবে ... (এই উত্তরটি সম্ভবত আরও আরও গল্ফ করা যেতে পারে)


0

বিবিসি বেসিক

এমুলেটর http://www.bbcbasic.co.uk/bbcwin/bbcwin.html এ

আমি এটি 400 এর মধ্যে গল্ফ হবে আশা করছি।

ইনপুট আউটপুট

প্রতিবার ব্যবহারকারী কোনও নতুন লাইনে প্রবেশ করার পরে প্রোগ্রামটি কোনও নতুন ত্রিভুজ তৈরি হয়েছে কিনা তা পরীক্ষা করে তা তত্ক্ষণাত্ আউটপুট দেয়, নীচে দেখুন।

নতুন লাইন দুটি পূর্ব-বিদ্যমান রেখার সাথে ছেদ করে যেখানেই দুটি পারস্পরিকভাবে ছেদ করা হয় সেখানে একটি নতুন ত্রিভুজ তৈরি করা হয় (কেবল তিনটি রেখা একটি বিন্দুতে ছেদ করা ছাড়া, যা একটি বিশেষ ক্ষেত্রে যা মোকাবিলা করতে হবে is)

এখানে চিত্র বর্ণনা লিখুন

কোড

মূল প্রোগ্রামটি যতটা সহজ হতে পারে is শেষটি হল ফাংশনটি, যা চৌরাস্তা সনাক্তকরণের জটিল কাজটি সম্পাদন করে, http://en.wikedia.org/wiki/Line%E2%80%93line_intersection এ সূত্র অনুযায়ী

কোনও ছেদ না থাকলে ফাংশনটি শূন্য ফিরে আসে এবং সেখানে যদি একটি ননজারো ভাসমান পয়েন্ট নম্বর থাকে। এটির একটি পার্শ্ব প্রতিক্রিয়াও রয়েছে: ছেদটির স্থানাঙ্কগুলি z string স্ট্রিংয়ের সাথে যুক্ত হয় $ অতিরিক্তভাবে, বিবিসি বেসিকের মধ্যে একটি ফাংশনের ভেরিয়েবলগুলি মূল প্রোগ্রামটিতে দৃশ্যমান হয় তবে মূল প্রোগ্রামটির একই নামের একটি পরিবর্তনশীল না থাকে (ফাংশন শেষ হওয়ার পরেও))

অতএব মূল প্রোগ্রামটির চলকগুলিতে xএবং yএবং mএবং n, যা বর্তমান এবং পূর্ববর্তী ছেদগুলির স্থানাঙ্কগুলি সঞ্চয় করে তার অ্যাক্সেস রয়েছে । এটি সনাক্ত করতে আমরা সত্যই একটি বিন্দুতে কেবল তিনটি রেখা ছেদ করে না এমন একটি ত্রিভুজ খুঁজে পেয়েছি কিনা তা সনাক্ত করতে ব্যবহৃত হয়।

  DIM a(99),b(99),c(99),d(99)                                                    :REM declare 4 arrays to hold the ata
  y=0                                                                            :REM x and y are only initialized
  x=0                                                                            :REM to avoid a no such varialbe error later
  FOR i=0 TO 99                                                                  :REM for each input line
    INPUT a(i),b(i),c(i),d(i)
    FOR j=0 TO i-1                                                               :REM iterate through all combinations of 2 previous lines
      FOR k=0 TO j-1
        z$=""                                                                    :REM clear z$, three function calls on next line will write the triangle (if found) to it
        IF i>j AND j>k AND FNf(i,j)*FNf(i,k)*FNf(j,k)<>0 IF x<>m OR y<>n PRINT z$:REM to avoid printing the same triangle twice, print only if j,k,i in lexicographic order. Also reject if x,y (3rd FNf call) and m,n (2nd FNf call) are the same: this means a point, not a triangle.
      NEXT
    NEXT
  NEXT

  DEF FNf(g,h)                                                                   :REM returns zero if no intersection found, otherwise a floating point value
  m=x                                                                            :REM backup previous x and y
  n=y                                                                            :REM to use in test for point versus triangle
  p=a(g)-c(g)
  q=b(g)-d(g)
  r=a(h)-c(h)
  s=b(h)-d(h)
  t=a(g)*d(g)-b(g)*c(g)
  u=a(h)*d(h)-b(h)*c(h)
  e=p*s-q*r                                                                      :REM following method in wikipedia, calculate denominator of expression
  IF e<>0 x=(t*r-u*p)/e : y=(t*s-u*q)/e: z$=z$+" "+STR$(x)+" "+STR$(y)           :REM if denominator not zero, calculate x and y and append a string copy to z$
  IF (a(g)-x)*(c(g)-x)>0 OR (b(g)-y)*(d(g)-x)>0 OR(a(h)-x)*(c(h)-x)>0 OR(b(h)-y)*(d(h)-y)>0 e=0
  =e          :REM return e                                                      :REM previous line sets e to zero if the intersection falls outside the line segment. This is detected when both are on the same side of the intersection, which yields a positive multiplication result.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.