সর্বাধিক বেড়া ব্যবস্থা গণনা করুন


9

পটভূমি

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

ইনপুট

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

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

আউটপুট

আপনার আউটপুটটি সর্বাধিক ব্যবস্থার সংখ্যা যা খুঁটি ব্যবহার করে নির্মিত যেতে পারে can

উদাহরণ

ইনপুট তালিকাটি বিবেচনা করুন

[(3,0),(1,1),(0,2),(-1,1),(-2,0),(-1,-1),(0,-2),(1,-1)]

উপরের থেকে দেখা যায়, খুঁটির আনুষঙ্গিক ব্যবস্থাটি দেখতে এরকম কিছু দেখাচ্ছে:

  o
 o o
o    o
 o o
  o

এই পোলগুলি ব্যবহার করে ঠিক তিনটি সর্বাধিক ব্যবস্থা তৈরি করা যেতে পারে:

  o        o        o
 o-o      o|o      o-o
o----o   o||| o   o| | o
 o-o      o|o      o-o
  o        o        o

সুতরাং সঠিক আউটপুট হয় 3

বিধি

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

পরীক্ষার কেস

[] -> 1
[(0,0),(1,1),(2,2)] -> 1
[(0,0),(1,0),(2,0)] -> 1
[(0,0),(0,1),(1,0),(1,1)] -> 1
[(1,0),(0,1),(-1,0),(0,-1)] -> 2
[(3,0),(1,1),(0,2),(-1,1),(-2,0),(-1,-1),(0,-2),(1,-1)] -> 3
[(0,0),(4,0),(1,1),(1,-2),(3,1),(3,-2),(2,-1),(4,-1)] -> 3
[(0,0),(4,0),(1,1),(1,-2),(3,1),(3,-2),(2,-1),(4,-1),(0,-1)] -> 4
[(0,0),(4,0),(1,1),(1,-2),(3,1),(3,-2),(2,-1),(0,-1),(2,2)] -> 5
[(0,0),(4,0),(1,1),(1,-2),(3,1),(3,-2),(2,-1),(4,-1),(0,-1),(2,2)] -> 8

1
উদাহরণটিতে মনে হয় দু'বার (-2,0) রয়েছে। এর মধ্যে একটি (২,০) হওয়া উচিত?
isaacg 12'15

@ আইসএএসিজি আসলে এটি (0,-2)ভাল হওয়া উচিত । এখনই পরিবর্তন হচ্ছে।
জাগারব

উত্তর:


5

গণিত, 301 বাইট

(t~SetAttributes~Orderless;u=Subsets;c=Complement;l=Select;f=FreeQ;Count[s=List@@@l[t@@@u[Sort@l[Sort/@#~u~{2},!f[#-#2&@@#,0]&]//.{a___,{x_,y_},{x_,z_},b___,{y_,z_},c___}:>{a,{x,y},b,{y,z},c}],f[#,t[{{a_,b_},{a_,c_}},{{d_,e_},{f_,e_}},___]/;d<a<f&&b<e<c]&],l_/;f[s,k_List/;k~c~l!={}&&l~c~k=={},{1}]])&

এটি একটি নামবিহীন ফাংশন যা স্থানাঙ্কগুলিকে নেস্টেড হিসাবে গ্রহণ করে Listএবং পূর্ণসংখ্যা ফেরত দেয়। এটি হল, আপনি হয় এটির নাম দিতে পারেন এবং কল করতে পারেন, বা কেবল সংযোজন করতে পারেন

@ {{3, 0}, {1, 1}, {0, 2}, {-1, 1}, {-2, 0}, {-1, -1}, {0, -2}, {1, -1}}

ইন্ডেন্টেশন সহ:

(
  t~SetAttributes~Orderless;
  u = Subsets;
  c = Complement;
  l = Select;
  f = FreeQ;
  Count[
    s = List @@@ l[
      t @@@ u[
        Sort @ l[
          Sort /@ #~u~{2}, 
          !f[# - #2 & @@ #, 0] &
        ] //. {a___, {x_, y_}, {x_, z_}, b___, {y_, z_}, c___} :> 
              {a, {x, y}, b, {y, z}, c}
      ],
      f[
        #,
        t[{{a_, b_}, {a_, c_}}, {{d_, e_}, {f_, e_}}, ___] 
          /; d < a < f && b < e < c
      ] &
    ], 
    l_ /; f[
      s, 
      k_List /; k~c~l != {} && l~c~k == {}, 
      {1}
    ]
  ]
) &

আমি এই বাস্তবায়নটি কতটা নির্বোধ তা প্রকাশ করাও শুরু করতে পারি না ... এটি অবশ্যই আরও নিষ্ঠুর শক্তি হতে পারে না ...

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

আশ্চর্যজনকভাবে এটি সমস্ত পরীক্ষার কেস কার্যত তাৎক্ষণিকভাবে সমাধান করে।

আমি এটির জন্য একটি সত্যই ঝরঝরে কৌশল আবিষ্কার করেছি তা হল Orderlessআমার যে ধরণের মেটাতে হবে তার সংখ্যা হ্রাস করা। মূলত, যখন আমি পার্শ্বে বেড়া দিয়ে বেড়া সেট খাঁজতে চাই, তখন আমাকে উল্লম্ব এবং অনুভূমিক বেড়ার একটি জোড়া খুঁজে বের করতে হবে এবং তাদের অবস্থাটি পরীক্ষা করতে হবে। তবে আমি জানি না তারা কী অর্ডারে উপস্থিত হবে list যেহেতু তালিকাগুলি সাধারণভাবে নির্ভর করে অর্ডার নির্ভর করে, এর ফলে দুটি সত্যিই দীর্ঘ নিদর্শন হতে পারে। সুতরাং পরিবর্তে আমি পার্শ্ববর্তী তালিকার সাথে একটি ফাংশন tদিয়ে প্রতিস্থাপন করব t @@@- যা সংজ্ঞায়িত হয় না তাই এটি যেমন রাখা হয় তেমন। তবে সেই ফাংশনটি হ'ল Orderless, সুতরাং আমি কেবল প্যাটার্নে একটি একক অর্ডার পরীক্ষা করতে পারি, এবং ম্যাথামেটিকা ​​এটি সমস্ত আদেশের বিপরীতে পরীক্ষা করবে। এরপরে, আমি তালিকাগুলি আবার রেখে দিয়েছিলাম List @@@

আমি ইচ্ছা করি একটি বিল্ট-ইন রয়েছে এটি হ'ল ক) Orderless, খ) না Listable এবং গ) 0 টি আর্গুমেন্ট বা তালিকা আর্গুমেন্টের জন্য সংজ্ঞায়িত হয়নি। তারপর আমি tযে দ্বারা প্রতিস্থাপন করতে পারে । কিন্তু এমন কোনও অপারেটর বলে মনে হয় না।


আপনি যখন ভাবছেন যে গাণিতিক এটি সঠিকভাবে বা যথেষ্ট দ্রুত করে, উত্তরটি "হ্যাঁ"।
20

ঠিক আছে, এটি আমার রেফারেন্স প্রয়োগের মতো নির্বোধ। : পি
জাগারব

1

হাস্কেল, 318 বাইট

import Data.List
s=subsequences
k[(_,a,b),(_,c,d)]|a==c=f(\w->(1,a,w))b d|1<2=f(\w->(2,w,b))a c
f t u v=[t x|x<-[min u v+1..max u v-1]]
q l=nub[x|x<-map(k=<<)$s[a|a@[(_,n,m),(_,o,p)]<-s l,n==o||m==p],x++l==nubBy(\(_,a,b)(_,c,d)->a==c&&b==d)(x++l)]
m=q.map(\(a,b)->(0,a,b))
p l=sum[1|x<-m l,all(\y->y==x||x\\y/=[])$m l]

ব্যবহার: p [(1,0),(0,1),(-1,0),(0,-1)]। আউটপুট:2

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

  • ইনপুট তালিকার সমস্ত সাবলিস্ট তৈরি করুন এবং দুটি উপাদান সহ এবং সমান এক্স বা সমান y স্থানাঙ্ক সহ এগুলি রাখুন। এটি সমস্ত জোড়া পোলের একটি তালিকা যেখানে একটি বেড়া তৈরি করা যেতে পারে।
  • এটির সমস্ত সাবলিস্ট তৈরি করুন
  • প্রতিটি তালিকার জন্য বোর্ড যুক্ত করুন
  • তালিকাগুলি সরিয়ে ফেলুন যেখানে xy স্থানাঙ্ক দু'বার প্রদর্শিত হবে (বোর্ড এবং খুঁটি)
  • সরাসরি সংলগ্ন খুঁটির কারণে (যেমন (1,0) এবং (1,1)) একাধিক খালি তালিকা পরিচালনা করতে সদৃশ তালিকা (কেবল বোর্ডগুলি) সরিয়ে ফেলুন
  • যেগুলি অন্য তালিকার কঠোর সাবলিস্ট নয় keep
  • বাকী তালিকা গণনা করুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.