খুশি ইন্ডার সমস্যা


32

সুখী সমাপ্তি সমস্যা (আসলে একটি উপপাদ্য) বলে যে

সাধারণ অবস্থানে বিমানের পাঁচটি পয়েন্টের যে কোনও সেটটিতে চারটি পয়েন্টের উপসেট থাকে যা উত্তল চতুর্ভুজের কোণকে সূচনা করে।

এই সমস্যাটির নাম পাল আর্দস রেখেছিলেন, যখন প্রথম সমস্যাটিতে কাজ করা দুজন গণিতবিদ, এসটার ক্লিন এবং জর্জ সেকেকেরেস, পরে বিবাহবন্ধনে আবদ্ধ হন এবং পরে বিবাহিত হন।

ব্যাখ্যা:

  • এখানে সাধারণ অবস্থানের অর্থ তিনটি পয়েন্ট কলিনারি নয়।
  • চারটি উল্লম্ব দ্বারা গঠিত চতুর্ভুজটি সর্বদা বিন্দুর ক্রম নির্বিশেষে আন্তঃ ছেদযুক্ত হিসাবে বিবেচিত হবে। উদাহরণ হিসেবে বলা যায়, চার পয়েন্ট দেওয়া [1 1], [1 2], [2 1], [2 2]অভিপ্রেত চতুর্ভুজ বর্গাকার, না নম-টাই হল:

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

  • কোনও অভ্যন্তরীণ কোণ 180 ডিগ্রি অতিক্রম না করে একটি অ-ছেদযুক্ত চতুর্ভুজটি উত্তল হয় ; অথবা সমানভাবে যদি উভয় তির্যকটি চতুর্ভুজের ভিতরে থাকে।

চ্যালেঞ্জ

ধনাত্মক পূর্ণসংখ্যার স্থানাঙ্ক সহ 5 পয়েন্ট দেওয়া হয়েছে, উত্তল চতুর্ভুজ গঠন করে এমন পয়েন্টগুলির 4 আউটপুট।

বিধি

যদি বেশ কয়েকটি সমাধান থাকে (যা 4 পয়েন্টের কয়েকটি সেট) থাকে তবে আপনি ধারাবাহিকভাবে সেগুলির মধ্যে একটি বা সমস্ত আউটপুট বেছে নিতে পারেন।

ইনপুট এবং আউটপুট ফর্ম্যাটগুলি যথারীতি নমনীয় (অ্যারে, তালিকা, তালিকার তালিকার তালিকা, যুক্তিসঙ্গত পৃথককারীগুলির সাথে স্ট্রিং ইত্যাদি)।

কোড গল্ফ, সবচেয়ে কম বাইট জিতেছে।

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

  1. ইনপুট:

    [6 8] [1 10] [6 6] [5 9] [8 10]
    

    কেবলমাত্র একটি সম্ভাব্য আউটপুট রয়েছে:

    [6 8] [1 10] [6 6] [5 9]
    
  2. ইনপুট:

    [3 8] [7 5] [6 9] [7 8] [5 1]
    

    পাঁচটি সমাধান রয়েছে:

    [3 8] [7 5] [6 9] [7 8]
    [3 8] [7 5] [6 9] [5 1]
    [3 8] [7 5] [7 8] [5 1]
    [3 8] [6 9] [7 8] [5 1]
    [7 5] [6 9] [7 8] [5 1]
    
  3. ইনপুট:

    [4 8] [1 9] [9 9] [10 2] [1 6]
    

    তিনটি সমাধান রয়েছে:

    [4 8] [1 9] [10 2] [1 6]
    [4 8] [9 9] [10 2] [1 6]
    [1 9] [9 9] [10 2] [1 6]
    

    উদাহরণস্বরূপ, এখানে এই মামলার তিনটি সমাধান রয়েছে:

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


14
আমি মার্টিনের কাছ থেকে ইতিবাচক আবেগ প্রকাশের সাথে একটি উত্তর আশা করছি।
এল'েন্ডিয়া স্টারম্যান

1
সুখী সমাপ্তি সমস্যা খুশি Ender সমস্যা, একটি উপায় খুঁজে বের হয় যা দিয়ে বিভ্রান্ত করা যাবে না হয় সিমিউলেশন তারা বাজানো আসল আবিষ্কার থেকে সামরিক নিয়োগপ্রাপ্তরা প্রতিরোধ
ব্যবহারকারী 253751

উত্তর:


24

সিজেম, 37 34 32 বাইট

{e!Wf<{2*3ew{)f.-~W%.*:-V>},!}=}

:-Vযথেষ্ট খুশি কিনা তা নিশ্চিত নন , তবে কে জাং উল্লেখ করেছেন, =}শেষে রয়েছে। :)

এটি কেবলমাত্র একটি সমাধান মুদ্রণ করে কারণ ডুপ্লিকেটগুলি সরানো আরও ব্যয়বহুল।

এটি এখানে পরীক্ষা করুন।

ব্যাখ্যা

ধারণাটি মোটামুটি সহজ। আমরা সমস্ত সম্ভাব্য চতুর্ভুজ তৈরি করি (পয়েন্টগুলির সমস্ত ক্রম সহ) এবং তারপরে কেবল উত্তলগুলি নির্বাচন করি select আমরা প্রতিটি জোড়া প্রান্ত দেখে এবং পরীক্ষা করে দেখি যে তারা সবাই একই দিকে ঘুরছে।

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

e!       e# Generate all permutations of the five input points.
Wf<      e# Discard the fifth point in each permutations, giving all
         e# possible quadrilaterals.
{        e# Select the first for which this block gives a truthy result...
  2*     e#   Double the list of points, so that it includes each cyclically
         e#   adjacent set of three points.
  3ew    e#   Get all sublists of length 3, i.e. all sets of three consecutive
         e#   points (with two duplicates).
  {      e#   Filter these sets of three points...
    )    e#     Pull off the last point.
    f.-  e#     Subtract it from the other two, giving vectors from it to
         e#     to those.
    ~    e#     Unwrap the array dumping both vectors on the stack.
    W%   e#     Reverse one of them.
    .*   e#     Element-wise multiplication.
    :-   e#     Subtract the second element from the first. This completes
         e#     the projection.
    V>   e#     Check whether it's greater than 0. This is *false* for right-
         e#     turning sets of three points.
  },     e#   If all corners are right-turning, this will result
         e#   in an empty array.
  !      e#   Logical NOT - hence, only quadrilaterals where all corners
         e#   are right-turning give something truthy.
}=

2
অবশ্যই, একটি সুখী হাঁস!
লুইস মেন্ডো

1
@ লুইস মেন্ডো আমি মনে করি শেষ দুটি চরিত্রটি আরও হাসির মতো দেখাচ্ছে =}
কে জাং

!}একটি
পলক

2
কোডগল্ফের জনের স্কিটি .. এটি আশ্চর্যজনক
অ্যালেক্স কার্লসেন

8

ম্যাটল্যাব, 67 বাইট

I=input('');for k=~eye(5);if nnz(convhull(I(k,:)))>4;I(k,:),end;end

ইনপুটটি 2D ম্যাট্রিক্সের আকারে যেখানে কলামগুলি যথাক্রমে X এবং Y হয়:

[6 8; 1 10; 6 6; 5 9; 8 10]
[3 8; 7 5; 6 9; 7 8; 5 1]
[4 8; 1 9; 9 9; 10 2; 1 6]

উত্তল চতুর্ভুজ তৈরি করে এমন 4 টি পয়েন্টের সমস্ত সেট একই বিন্যাসে প্রদর্শিত হবে।

এখানে একটি ডেমো যা অ্যাক্টাভের সাথে কাজ করার জন্য সামান্য পরিবর্তন করা হয়েছে

ব্যাখ্যা

এই সমাধানটি ইনপুটটির 4 পয়েন্টের সমস্ত সাবসেট নেয় (অর্ডার কোনও ব্যাপার নয়)। এই কাজের জন্য, আমরা পরিচয় ম্যাট্রিক্স তৈরি করব এবং অস্বীকার: ~eye(5)। আমরা এই ম্যাট্রিক্সের কলামগুলি দিয়ে লুপ করছি এবং k(লুপ সূচক) একটি লজিক্যাল অ্যারে যা 4 পয়েন্টগুলির মধ্যে কোনটি বিবেচনা করতে হবে তা নির্দিষ্ট করে। তারপরে আমরা ইনপুট ( I(k,:)) থেকে এই 4 টি এক্সওয়াই পয়েন্ট ধরতে এটি ব্যবহার করি ।

এরপরে আমরা এই 4 টি পয়েন্টের উত্তল হালকে গণনা করব ( convhull)। এর আউটপুট convhullহ'ল ইনপুটটির সূচকগুলি যা উত্তল হাল তৈরি করে এমন পয়েন্টগুলির সাথে মিল রাখে (প্রথম সূচকটি হুলটি বন্ধ করার জন্য নকল হয়)।

উত্তল চতুর্ভুজটির জন্য, সমস্ত চারটি পয়েন্ট একই পয়েন্টগুলির উত্তল হলের অংশ হবে ( nnz(convhull(points)) > 4)। যদি আমরা সনাক্ত করি যে এটি কেস, তবে আমরা নির্দিষ্ট পয়েন্টগুলির জন্য এই নির্দিষ্ট পুনরাবৃত্তির জন্য ব্যবহার করি।


4

জাভাস্ক্রিপ্ট (ES6), 306 293 283 বাইট

c=(v,w,x)=>(w[0]-v[0])*(w[1]-x[1])-(w[1]-v[1])*(w[0]-x[0])>0?1:0
i=(v,w,x,y)=>(c(v,w,x)+c(w,x,y)+c(x,y,v)+c(y,v,w))%4==0&&r.push([v,w,x,y])
j=(v,w,x,y)=>{i(v,w,x,y);i(v,w,y,x);i(v,x,w,y)}
k=(v,w,x,y,z)=>{j(v,w,x,y);j(v,w,x,z);j(v,w,y,z);j(v,x,y,z);j(w,x,y,z)}
f=(v)=>(r=[],k(...v),r)

ব্যাখ্যা :

ফাংশনটি cবহুভুজটির 3 সংলগ্ন পয়েন্টগুলির মধ্যে ভেক্টরের ক্রস প্রোডাক্টটি গণনা করে এবং ইতিবাচক হলে এটি 1 প্রদান করে এবং অন্যথায় 0 হয় (দ্রষ্টব্য: পয়েন্টগুলি সম-রৈখিক হতে পারে না বলে ক্রস পণ্য শূন্য হতে পারে না)।

j=(v,w,x,y)=>{i(v,w,x,y);i(v,w,y,x);i(v,x,w,y)}
k=(v,w,x,y,z)=>{j(v,w,x,y);j(v,w,x,z);j(v,w,y,z);j(v,x,y,z);j(w,x,y,z)}

ফাংশন kএবং jইনপুট অ্যারের সমস্ত চক্রীয় ক্রম (ক্রমটিকে প্রত্যাখ্যান করে) জেনারেট করে।

i=(v,w,x,y)=>(c(v,w,x)+c(w,x,y)+c(x,y,v)+c(y,v,w))%4==0&&r.push([v,w,x,y])

cপার্শ্ববর্তী কো-অর্ডিনেটের 4 টি ট্রিপল্টের প্রতিটিটির জন্য ফাংশনের যোগফল গণনা করার জন্য 'i' ফাংশনটি প্রতিটি চক্রীয় ক্রান্তিকরণের জন্য বলা হয় । যদি ক্রস পণ্যগুলির সকলের একই চিহ্ন থাকে তবে সেগুলি সবগুলি হয় 0 বা 1 এবং মোট 0 (মডিউল 4) হবে এবং বহুভুজটি অবতল এবং আউটপুট অ্যারেতে পুশ হবে। যদি কোনও ট্রিপলেটের আলাদা চিহ্ন থাকে তবে মোটটি শূন্য-শূন্য (মডুলো 4) হবে এবং বহুভুজটি উত্তল।

f=(v)=>(r=[],k(...v),r)

ফাংশনটি fআউটপুট অ্যারে আরম্ভ করার জন্য এবং তারপরে আউটপুট ফেরত দেওয়ার আগে উপরের ফাংশনগুলিতে কল করতে ব্যবহৃত হয়।

পরীক্ষা :

c=(v,w,x)=>(w[0]-v[0])*(w[1]-x[1])-(w[1]-v[1])*(w[0]-x[0])>0?1:0
i=(v,w,x,y)=>(c(v,w,x)+c(w,x,y)+c(x,y,v)+c(y,v,w))%4==0&&r.push([v,w,x,y])
j=(v,w,x,y)=>{i(v,w,x,y);i(v,w,y,x);i(v,x,w,y)}
k=(v,w,x,y,z)=>{j(v,w,x,y);j(v,w,x,z);j(v,w,y,z);j(v,x,y,z);j(w,x,y,z)}
f=(v)=>(r=[],k(...v),r)

tests = [
  [[6,8],[1,10],[6,6],[5,9],[8,10]],
  [[3,8],[7,5],[6,9],[7,8],[5,1]],
  [[4,8],[1,9],[9,9],[10,2],[1,6]]
];

tests.forEach(
  (test,i)=>{
    console.log( "Test " + (i+1) );
    f(test).forEach(
      (x)=>console.log( "  " + x.map((e)=>"("+e[0]+","+e[1]+")").join(','))
    );
  }
);

সম্পাদনা করুন :

মূল সংস্করণটি ব্যবহার করে এবং প্রথম দুটি লাইন এতে পরিবর্তন করে সহ-লিনিয়ার পয়েন্টগুলিও পরিচালনা করতে পারে:

t=(a,b,c)=>Math.sign((b[0]-a[0])*(b[1]-c[1])-(b[1]-a[1])*(b[0]-c[0]))
p=(a,b,c,d)=>[t(a,b,c),t(b,c,d),t(c,d,a),t(d,a,b)].filter(x=>x).reduce((p,c,i,a)=>p&c==a[0],1)
q=(a,m,n,o)=>[a[0],a[m],a[n],a[o]]
f=(a)=>{r=[];for(i=0;i<5;i++){b=a.slice();b.splice(i,1);r.push(q(b,1,2,3));r.push(q(b,1,3,2));r.push(q(b,2,1,3))}return r.filter((a)=>p(...a))}

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


3

গণিত 105 105 বাইট

Select[#~Subsets~{4},f@#&]&(5) পয়েন্টের তালিকা থেকে, 4 পয়েন্টের উপসেটগুলি সন্তুষ্ট করে f

fসন্তুষ্ট হলে একটি সেট প্রতিটি বিন্দু, 4 পয়েন্ট, উপর মিথ্যা RegionBoundaryএর ConvexHull4 পয়েন্ট করে।

f@p_:=Apply[And,RegionBoundary@ConvexHullMesh@p~RegionMember~#&/@p];
Select[#~Subsets~{4},f@#&]&

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

১. আসুন look {6, 8}, {1, 10}, {6, 6}, {5, 9}, {8, 10} subse উপগ্রহের 5 টি উত্তল হাল (4 পয়েন্টের প্রতিটি) দেখি ।

Select[#~Subsets~{4},f@#&[{{6, 8}, {1, 10}, {6, 6}, {5, 9}, {8, 10}}]

{{{6, 8}, {1, 10}, {6, 6}, {5, 9}}


{, 6, 8}, {1, 10}, {6, 6}, {5, 9} the একমাত্র সমাধান; চারটি পয়েন্টের প্রত্যেকটি উত্তল হলের (একই 4 পয়েন্টের) একটি শীর্ষস্থান হিসাবে কাজ করে।

সমাধান


{{6, 8}, {1, 10}, {6, 6}, {8, 10} a কোনও সমাধান নয়; উত্তল হালতে কেবল 3 টি শীর্ষ টি রয়েছে। , 6, 8 the হলের মধ্যে রয়েছে।

fail1


অবশিষ্ট উপগ্রহগুলিও সমাধান নয়:

fail2

fail3

fail4


2. {{4, 8}, {1, 9}, {9, 9}, {10, 2}, {1, 6} three এর তিনটি সমাধান রয়েছে।

Select[#~Subsets~{4},f@#&[{{4, 8}, {1, 9}, {9, 9}, {10, 2}, {1, 6}}]

{
{{4, 8}, {1, 9}, {10, 2}, {1, 6}},
{{4, 8}, {9, 9}, {10, 2}, {1, 6 }},
{{1, 9}, {9, 9}, {10, 2}, {1, 6}
}


3. {{3, 8}, {7, 5}, {6, 9}, {7, 8}, {5, 1} এর 5 টি সমাধান রয়েছে।

Select[#~Subsets~{4},f@#&[{{3, 8}, {7, 5}, {6, 9}, {7, 8}, {5, 1}}]

{
{{3, 8}, {7, 5}, {6, 9}, {7, 8}},
{{3, 8}, {7, 5}, {6, 9}, {5, 1 }},
{{3, 8}, {7, 5}, {7, 8}, {5, 1}},
{{3, 8}, {6, 9}, {7, 8}, {5 , 1}},
{{7, 5}, {6, 9}, {7, 8}, {5, 1}
}

নোট করুন যে পাঁচটি পয়েন্টের প্রত্যেকটিই সমস্ত পয়েন্টের উত্তল হলের সীমানায় অবস্থিত।

যদি বিন্দুগুলির কোনও একটি অপসারণ করা হয়, বাকি 4 পয়েন্টগুলি প্রতিটি হ্রাসিত উত্তল হলের শিখরের কোণ হবে।

sol2

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