দীর্ঘতম ডোমিনো চেইন


31

চ্যালেঞ্জের বিবরণ

ডোমিনোস এমন একটি গেম যা টাইলগুলির সাথে দুটি মান সহ খেলে - একটি বাম দিকে, একটি ডানদিকে, উদাহরণস্বরূপ [2|4]বা [4|5]। দুটি টাইল একসাথে যোগ হতে পারে যদি সেগুলির মধ্যে একটি সাধারণ মান থাকে। উপরের দুটি টাইলস এভাবে যুক্ত হতে পারে:

[2|4][4|5]

আমরা nযুক্ত টাইলসের একটি ক্রমকে দৈর্ঘ্যের একটি শৃঙ্খল বলব । অবশ্যই, টাইলস আবর্তিত করা যেতে পারে, তাই টাইল [1|2], [1|3]এবং [5|3]একটি চেইন মধ্যে পুনর্বিন্যাস করা যেতে পারে [2|1][1|3][3|5]দৈর্ঘ্য 3।

পূর্ণসংখ্যার জোড়ার একটি তালিকা দেওয়া, এই টাইলগুলি ব্যবহার করে দীর্ঘতম চেইনের দৈর্ঘ্য নির্ধারণ করুন। যদি তালিকাটি খালি থাকে তবে সঠিক উত্তরটি 0(নোট করুন যে আপনি সর্বদা 1খালি খালি টাইলসের তালিকা থেকে দৈর্ঘ্যের একটি শৃঙ্খলা তৈরি করতে পারেন )।

নমুনা ইনপুট / আউটপুট

[(0, -1), (1, -1), (0, 3), (3, 0), (3, 1), (-2, -1), (0, -1), (2, -2), (-1, 2), (3, -3)] -> 10
([-1|0][0|-1][-1|2][2|-2][-2|-1][-1|1][1|3][3|0][0|3][3|-3])

[(17, -7), (4, -9), (12, -3), (-17, -17), (14, -10), (-6, 17), (-16, 5), (-3, -16), (-16, 19), (12, -8)] -> 4
([5|-16][-16|-3][-3|12][12|-8])

[(1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1)] -> 7
([1|1][1|1][1|1][1|1][1|1][1|1][1|1])

[(0, 1), (2, 3), (4, 5), (6, 7), (8, 9), (10, 11)] -> 1
(any chain of length 1)

[] -> 0
(no chain can be formed)

চলমান সময় বা স্মৃতিতে কোনও বিধিনিষেধ? সমস্ত অনুক্রমনকে জোর করে জোর করে ভাবেন
লুইস মেন্ডো

3
@LuisMendo: চমত্কার নিশ্চিত এই সমস্যা দ্বারা NP, তাই আপ আপনার আগুন O(n!)ইচ্ছে মতন
shooqie

I guess it's P
l4m2

উত্তর:


5

ব্র্যাচল্যাগ , 23 বাইট

s:papcb~k~c:{#=l2}al|,0

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

s:papcb~k~c:{#=l2}al|,0
s                         Check subsets of the input (longest first).
 :pa                      Check all permutations inside the input's elements
    p                     and all permutations /of/ the input's elements.
     c                    Flatten the result;
      b                   delete the first element;
       ~k                 find something that can be appended to the end so that
         ~c               the result can be unflattened into
           :{    }a       a list whose elements each have the property:
             #=             all the elements are equal
               l2           and the list has two elements.
                   l      If you can, return that list's length.
                    |,0   If all else fails, return 0.

সুতরাং অন্য কথায়, ইনপুটটির মতো [[1:2]:[1:3]:[5:3]], আমরা এটিকে বৈধ শৃঙ্খলে পুনরায় সাজানোর চেষ্টা করি [[2:1]:[1:3]:[3:5]], তারপরে ফ্ল্যাট / শিরশ্ছেদ / আনক্নাইফ উত্পাদন করতে [1:1:3:3:5:_](যেখানে _কোনও অজানা প্রতিনিধিত্ব করে)। এর সমন্বয় ~cএবং :{…l2}aকার্যকরভাবে এটি 2 টি উপাদানের গ্রুপে বিভক্ত হয় এবং আমরা নিশ্চিত করি যে সমস্ত গোষ্ঠী সমান। যেহেতু আমরা সমতল (দৈর্ঘ্য দ্বিগুণ) করেছি, শুরু থেকে একটি উপাদান সরিয়ে নিয়েছি এবং শেষে একটি যুক্ত করেছি (কোনও পরিবর্তন নেই) এবং জোড়ায় জোড় করে (দৈর্ঘ্য অর্ধেক করা হবে), এর ডমিনোজের মূল চেইনের সমান দৈর্ঘ্য হবে।

ইনপুটে কোনও ডোমিনোস না থাকলে "শিরশ্ছেদ" নির্দেশ ব্যর্থ হবে (আসলে, আইআইআরসি :paদিলে ব্যর্থ হবে; aখালি তালিকা অপছন্দ করে), তাই আমাদের 0 এর জন্য একটি বিশেষ কেস প্রয়োজন ((একটি বড় কারণ আমাদের মধ্যে অসম্পূর্ণতা রয়েছে bএবং ~kতাই যে আমাদের জন্য একটি বিশেষ ক্ষেত্রে প্রয়োজন হবে না।)



4

ব্র্যাচল্যাগ , 29 বাইট

v0|sp:{|r}aLcbk@b:{l:2%0}a,Ll

এটি অনলাইন চেষ্টা করুন!

খুব নিশ্চিত যে এটি ভয়াবহ দীর্ঘ, তবে যাই হোক না কেন। এটি অত্যন্ত ভীষণ ধীর।

ব্যাখ্যা

v0                               Input = [], Output = 0
  |                              Or
   sp:{|r}aL                     L (a correct chain) must be a permutation of a subset of the
                                   Input with each tile being left as-is or reversed
           Lcbk                  Concatenate L into a single list and remove the first and
                                   last elements (the two end values don't matter)
               @b                Create a list of sublists which when concatenated results in
                                   L, and where each sublist's elements are identical
                 :{     }a,      Apply this to each sublist:
                   l:2%0           It has even length
                           Ll    Output = length(L)

এটি সবচেয়ে বড়টি খুঁজে পাওয়ার কারণটি হ'ল কারণ s - subsetবৃহত্তম থেকে ক্ষুদ্রতম উপসেটটিতে পছন্দ পয়েন্ট তৈরি করে।


4

গণিত, 191 বাইট

If[#=={},0,Max[Length/@Select[Flatten[Rest@Permutations[#,∞]&/@Flatten[#,Depth[#]-4]&@Outer[List,##,1]&@@({#,Reverse@#}&/@#),1],MatchQ[Differences/@Partition[Rest@Flatten@#,2],{{0}...}]&]]]&

মোটামুটিভাবে গল্ফ করা যেতে পারে, আমি নিশ্চিত। তবে মূলত ফ্যাটালাইজের ব্র্যাকল্যাগ উত্তরের মতো একই অ্যালগরিদম , শেষে কিছুটা আলাদা পরীক্ষা দিয়ে।


-1 বাইট: এর Differences/@Rest@Flatten@#~Partition~2পরিবর্তে Differences/@Partition[Rest@Flatten@#,2]( Infixএর চেয়ে বেশি অগ্রাধিকার রয়েছে Map)
JungHwan Min

2

জাভাস্ক্রিপ্ট (ফায়ারফক্স 30-57), 92 বাইট

(a,l)=>Math.max(0,...(for(d of a)for(n of d)if(!(l-n))1+f(a.filter(e=>e!=d),d[0]+d[1]-n)))
  • lসর্বশেষ মান, বা undefinedপ্রাথমিক প্রার্থনার জন্য। l-nসুতরাং ডোমিনো খেলা যায় যদি এটি একটি মিথ্যা মান।
  • d বিবেচনাধীন ডোমিনো হয়।
  • nপূর্ববর্তী ডোমিনোতে শৃঙ্খলার জন্য বিবেচনাধীন ডোমিনোর সমাপ্তি। অন্য প্রান্তটি সহজেই হিসাবে গণনা করা যেতে পারে d[0]+d[1]-n
  • 0, কেবল বাজানোযোগ্য ডোমিনোজের বেস কেসটি হ্যান্ডল করে না।

2

হাস্কেল , 180 134 131 117 বাইট

p d=maximum$0:(f[]0d=<<d)
f u n[]c=[n]
f u n(e@(c,d):r)a@(_,b)=f(e:u)n r a++(f[](n+1)(r++u)=<<[e|b==c]++[(d,c)|b==d])

এটি অনলাইন চেষ্টা করুন! নতুন পদ্ধতির সংক্ষিপ্ত এবং আরও দক্ষ উভয় হিসাবে প্রমাণিত। সমস্ত সম্ভাব্য ক্রমের পরিবর্তে কেবলমাত্র সমস্ত বৈধ চেইন তৈরি করা হয়।

সম্পাদনা করুন: 117 বাইট সংস্করণ আবার অনেক ধীর, তবে ব্রুট ফোর্সের চেয়ে এখনও দ্রুত।


পুরাতন নিষ্ঠুর শক্তি পদ্ধতি:

p(t@(a,b):r)=[i[]t,i[](b,a)]>>=(=<<p r)
p e=[e]
i h x[]=[h++[x]]
i h x(y:t)=(h++x:y:t):i(h++[y])x t
c%[]=[0]
c%((_,a):r@((b,_):_))|a/=b=1%r|c<-c+1=c:c%r
c%e=[c]
maximum.(>>=(1%)).p

এটি একটি নিষ্ঠুর শক্তি প্রয়োগ যা সমস্ত সম্ভাব্য ক্রমশক্তি চেষ্টা করে (সম্ভাব্য অনুমানের সংখ্যা A000165 দ্বারা দেওয়া হয়েছে , " এমনকি সংখ্যার দ্বিগুণ ফ্যাক্টরিয়াল ")। এটি অনলাইনে সবেমাত্র দৈর্ঘ্য 7 পর্যন্ত ইনপুট পরিচালিত করে দেখুন (যা একরকম চিত্তাকর্ষক কারণ 645120 ক্রমের সাথে মিল রয়েছে )।

ব্যবহার:

Prelude> maximum.(>>=(1%)).p $ [(1,2),(3,2),(4,5),(6,7),(5,5),(4,2),(0,0)]
4

1

পাইথন 2, 279 বাইট

Golfed:

l=input()
m=0
def f(a,b):
 global m
 l=len(b)
 if l>m:m=l
 for i in a:
  k=a.index(i)
  d=a[:k]+a[k+1:]
  e=[i[::-1]]
  if not b:f(d,[i])
  elif i[0]==b[-1][1]:f(d,b+[i])
  elif i[0]==b[0][0]:f(d,e+b)
  elif i[1]==b[0][0]:f(d,[i]+b)
  elif i[1]==b[-1][1]:f(d,b+e)
f(l,[])
print m

এটি অনলাইন চেষ্টা করুন!

কিছু মন্তব্য সহ একই জিনিস:

l=input()
m=0
def f(a,b):
 global m
 l=len(b)
 if l>m:m=l                      # if there is a larger chain
 for i in a:
  k=a.index(i)
  d=a[:k]+a[k+1:]                # list excluding i
  e=[i[::-1]]                    # reverse i
  if not b:f(d,[i])              # if b is empty
                                 # ways the domino can be placed:
  elif i[0]==b[-1][1]:f(d,b+[i]) # left side on the right
  elif i[0]==b[0][0]:f(d,e+b)    # (reversed) left side on the left
  elif i[1]==b[0][0]:f(d,[i]+b)  # right side on left
  elif i[1]==b[-1][1]:f(d,b+e)   # (reversed) right side on the right
f(l,[])
print m

আমি পোস্ট করছি কারণ আমি কোনও অজগর উত্তর দেখতে পেলাম না ... কেউ আমার উত্তর দেখতে পাবে এবং ঘৃণাজনকভাবে তাকে আরও খাটো এবং দক্ষ কিছু পোস্ট করতে বাধ্য করা হবে।


0

Clojure, 1983 বাইট

আপডেট: "সম্ভবত খালি সিকোয়েন্সির সর্বাধিক" এর আরও ভাল পরিচালনা

(defn F[a C](remove(fn[i](identical? i a))C))(defn M[C](apply max 0 C))(defn L([P](M(for[p P l p](L l(F p P)))))([l R](+(M(for[r R[i j][[0 1][1 0]]:when(=(r i)l)](L(r j)(F r R))))1)))

পূর্ববর্তী সংস্করণ:

(defn F[a C](remove(fn[i](identical? i a))C))(defn M[C](apply max 1 C))(defn L([P](if(empty? P)0(M(for[p P l p](L l(F p P))))))([l R](M(for[r R[i j][[0 1][1 0]]:when(=(r i)l)](+(L(r j)(F r R))1)))))

কলিং কনভেনশন এবং পরীক্ষার কেস:

(L [])
(L [[2 4] [3 2] [1 4]])
(L [[3, 1] [0, 3], [1, 1]])
(L [[17 -7] [4 -9] [12 -3] [-17 -17] [14 -10] [-6 17] [-16 5] [-3 -16] [-16 19] [12 -8]])
(L [[0 -1] [1 -1] [0 3] [3 0] [3 1] [-2 -1] [0 -1] [2 -2] [-1 2] [3 -3]])
(L [[1 1] [1 1] [1 1] [1 1] [1 1] [1 1] [1 1]])

Fউপাদান Cছাড়াই তালিকার উপাদানগুলি প্রদান করে a, Mসর্বাধিক ইনপুট ইনজারার্স বা 1 প্রদান করে।

Lমূল ফাংশন, যখন একক যুক্তি দিয়ে ডাকা হয় এটি সমস্ত সম্ভাব্য প্রারম্ভিক টুকরোগুলি উত্পন্ন করে এবং তাদের প্রতিটিটির জন্য সর্বোচ্চ দৈর্ঘ্য সন্ধান করে। যখন দুটি আর্গুমেন্টের সাথে ডাকা হয় তখন lপরের টুকরোটি অবশ্যই মেশানো ক্রমের প্রথম উপাদান এবং Rবাকী অংশগুলি।

অনুমোদনের উত্পাদন এবং "একটি উপাদান চয়ন করুন এবং বিশ্রামে বিভক্ত হওয়া" সংক্ষিপ্তভাবে বাস্তবায়নের জন্য বেশ জটিল ছিল।

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