বহুভুজ উত্তল কিনা তা নির্ধারণ করুন


21

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

উদাহরণ 1

ইনপুট

4
0 0
0 1
1 1
1 0

আউটপুট

convex

উদাহরণ 2

ইনপুট

4
0 0
2 1
1 0
2 -1

আউটপুট

concave

উদাহরণ 3

ইনপুট

8
0 0
0 1
0 2
1 2
2 2
2 1
2 0
1 0

আউটপুট

convex

x এবং y হল পূর্ণসংখ্যা, এন <1000 এবং | x |, | y | <1000 । আপনি ধরে নিতে পারেন যে ইনপুট বহুভুজটি সহজ (কোনও প্রান্তটি ক্রস করেনি, কেবল প্রতিটি প্রান্তটি কেবল 2 টি কিনে স্পর্শ করে)। সংক্ষিপ্ততম প্রোগ্রামের জয়।


"সিম্পল" এ "ক্রমাগত প্রান্তগুলি নন-কোলাইনারি" অন্তর্ভুক্ত নয় ?! এছাড়াও, আরও একটি দম্পতি পরীক্ষার ক্ষেত্রে: (0,0) (0,2) (2,2) (2,0) (1,1); এবং (1,1) (0,0) (0,2) (2,2) (2,0) - অবতল প্রান্তটি খুঁজে পেতে শেষ থেকে শুরু পর্যন্ত মোড়ানো প্রয়োজন এমন কেসগুলি পরীক্ষা করতে।
পিটার টেলর

এই প্রশ্নটি বার্ধক্যজনিত, তবে ... দুটি সারিবদ্ধ অংশের সাথে অবতল উদাহরণ যুক্ত করার কথা বিবেচনা করুন, উদাহরণস্বরূপ 2: (0,0), (2,1), (4,2), (1,0) (1,0) ( 2, -1)। আমি এটিকে সামনে এনেছি কারণ আমি টের না পেয়ে 3 টি উদাহরণের আশেপাশে এলোমেলো করেছিলাম।
জেসি মিলিকান

উত্তর:


4

জে, 105

echo>('concave';'convex'){~1=#=(o.1)([:>-.~)(o.2)|3([:-/12 o.-@-/@}.,-/@}:)\(,2&{.)j./"1}.0&".;._2(1!:1)3

উপরের তিনটি পরীক্ষায় উত্তীর্ণ।

সম্পাদনা করুন: (111-> 115) পাই এর কোণগুলি দূর করে সহ-লিনিয়ার পয়েন্টগুলি পরিচালনা করুন। অন্য কোথাও কয়েকটি চরিত্র অর্জন করেছেন।

সম্পাদনা করুন (115-> 105) কম বোবা।

জে-প্রতিবন্ধীদের জন্য ব্যাখ্যা:

  • (1!:1)3EF তে STDIN পড়ুন। (আমি মনে করি.)
  • 0&".;._2 এই ধরণের ইনপুট পার্স করার জন্য একটি দুর্দান্ত প্রতিমা।
  • j./"1}. ইনপুট প্রথম লাইন বন্ধ (এন 0) এবং জটিলগুলিতে জোড়া রূপান্তর।
  • (,2&{.) তালিকার শেষে দুটি পয়েন্ট আলতো চাপুন।
  • 3(f)\ দৈর্ঘ্যের 3 স্লাইডিং উইন্ডো এফ প্রয়োগ করে (একটি কোণে 3 পয়েন্ট)
  • [:-/12 o.-@-/@}.,-/@}: একটি ক্রিয়া যা প্রতিটি 3 পয়েন্টকে -pi এবং পাই এর মধ্যে একটি কোণে রূপান্তর করে।
    • -@-/@}.,-/@}:(p1 - p2), (p3 - p2) উত্পাদন করে। (স্মরণ করুন যে এগুলি জটিল।
    • 12 o. প্রতিটি জটিল জন্য একটি কোণ দেয়।
    • [:-/(...) দুটি কোণের পার্থক্য দেয়।
  • (o.1)([:>-.~)(o.2)| Mod 2 pi, পাই (সোজা অংশ) এর কোণগুলি নির্মূল করুন এবং পাই এর সাথে তুলনা করুন (পয়েন্টগুলি এক দিকের ক্ষতস্থানের ক্ষত হওয়ার কথা বিবেচনা না করা হলে এর চেয়ে বড়, এর চেয়ে বেশি কিছু যায় আসে না)।
  • 1=#= যদি এই সমস্ত তুলনা ফলাফল 1 বা 0 (স্ব-শ্রেণিবদ্ধ সহ। এটি বোবা বলে মনে হয় seems)
  • echo>('concave';'convex'){~ প্রিন্ট উত্তল।

3

পাইথন - 149 অক্ষর

p=[map(int,raw_input().split())for i in[0]*input()]*2
print'ccoonncvaevxe'[all((a-c)*(d-f)<=(b-d)*(c-e)for(a,b),(c,d),(e,f)in zip(p,p[1:],p[2:]))::2]

আমার মনে হয় আপনার <= প্রয়োজন আছে, উদাহরণটি দেখুন 3 আমি সবে যুক্ত করেছি।
কিথ র্যান্ডাল

1
জঘন্য, সেই টুকরো ...
st0le

2

রুবি 1.9, 147 133 130 124 123

gets
puts ($<.map{|s|s.split.map &:to_i}*2).each_cons(3).any?{|(a,b),(c,d),(e,f)|(e-c)*(d-b)<(d-f)*(a-c)}?:concave: :convex

1

স্কেল: 297 অক্ষর

object C{class D(val x:Int,val y:Int)
def k(a:D,b:D,c:D)=(b.y-a.y)*(c.x-b.x)>=(c.y-b.y)*(b.x-a.x) 
def main(a:Array[String]){val s=new java.util.Scanner(System.in)
def n=s.nextInt
val d=for(x<-1 to n)yield{new D(n,n)}print((true/:(d:+d.head).sliding(3,1).toList)((b,t)=>b&&k(t(0),t(1),t(2))))}}

1
def main(a:...পরিবর্তে ব্যবহার করে আপনি তিনটি অক্ষরের শেভ করতে পারেন def main(args:...
গ্যারেথ

হ্যাঁ, আমি নিজে লক্ষ করেছি, তবে 299 থেকে 149 অন্য কারও ক্ষেত্রে আমাকে নিয়ে আসে না। হতে পারে যদি আমি অন্যান্য উন্নতিগুলি খুঁজে পাই - আহ, একটি রয়েছে: n একটি ফাংশনের নাম (পরের) এবং একটি পরিবর্তনশীল নাম।
ব্যবহারকারী অজানা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.