দৈর্ঘ্যের মাইবিয়াস মইতে সীমিত বনগুলির সংখ্যা গণনা


13

ওআইআইএস ক্রম A020872 Möbius মই এম এন তে সীমিত বনগুলির সংখ্যা গণনা করে ।

চ্যালেঞ্জ

চ্যালেঞ্জটি হ'ল এমন একটি প্রোগ্রাম লিখুন যা কোনও ইনপুট হিসাবে পূর্ণসংখ্যার মতো লাগে n > 1এবং ফিরে আসে A020872(n), এমবিয়াস মই এম এন এর উপর নিষিদ্ধ বনগুলির সংখ্যা । এটি , তাই সংক্ষিপ্ততম কোড জিততে পারে। (একটি ছোট্ট উদ্দেশ্য সম্ভবত এই ক্রমের দৈর্ঘ্যটি কিছুটা বাড়িয়ে দেওয়া))

সংজ্ঞা

একটি সীমিত বন হ'ল গ্রাফের একটি বিভাজন যেমন প্রতিটি অংশ হয় হয় একটি (পুনর্নির্দেশিত) পাথ বা একটি বিচ্ছিন্ন শীর্ষবিন্দু।

Möbius মই এম এন গ্রাফ যা 2n-Gon সব বিপরীত ছেদচিহ্ন মধ্যে টানা কর্ণ সঙ্গে চিন্তা করা যেতে পারে।

উদাহরণ

এখানে এম 2 এর 34 টি সীমাবদ্ধ বন রয়েছে (ত্রিভুজ সহ একটি বর্গক্ষেত্র)। লক্ষ্য করুন যে প্রথম গ্রাফটি চারটি বিচ্ছিন্ন শীর্ষে বিভক্ত হয়েছে, দ্বিতীয়টি একটি পাথ এবং দুটি পৃথক বিভাজন ইত্যাদিতে বিভক্ত হয়েছে etc. A020872 (2)


1
পরীক্ষার বিষয় 2 থেকে 12: 34, 241, 1582, 10204, 65197, 415076, 2638366, 16759249, 106427154, 675771276, 4290678337। আমি নিশ্চিত 1না আউটপুট সহ কেন ইনপুট প্রয়োজন হয় না 2
পিটার টেলর

@ পিটারটেলর, ওইআইএস-এ এই পদগুলি যুক্ত করার জন্য ধন্যবাদ! আমি ইনপুটটি বাদ দিয়েছি 1কারণ এম_1 উইকিপিডিয়া নিবন্ধে স্পষ্টভাবে সংজ্ঞায়িত হয়নি। (বিশেষত, এটির একাধিক প্রান্ত রয়েছে বা এটি কিউবিক গ্রাফ নয়))
পিটার কেজে

1
এটি আসলে একটি একজন ভাল প্রার্থী মত শোনাচ্ছে fastest-codeবা fastest-algorithmচ্যালেঞ্জ।
মাইপেটলিয়ন

1
পরবর্তী পরীক্ষার কেসগুলি ( প্রজন্মের কোড ): 13 থেকে 17 টি হল27242281044, 172964658642, 1098170541121, 6972388689086, 44268329738124
পিটার টেলর

1
ঠিক আছে, আমি মনে করি আপনার সন্তানের উদ্দেশ্যটি সন্তুষ্টের চেয়ে বেশি।
পিটার টেলর

উত্তর:


10

সিজাম ( 56 56 চর)

কিছু অক্ষর ছাপিয়ে যায় না, এবং একটি হ'ল ট্যাব যা স্ট্যাক এক্সচেঞ্জ সফ্টওয়্যার দ্বারা ম্যাঙ্গেল করা হবে:

"¶3¬î¿Á·    7ÛÈmÈÚÚ¡"256b454b212f-{__W%.*A<1b+}qi*-4=

অনলাইন ডেমো । এটি প্রায় তিন সেকেন্ডে এন = 400 এর জন্য অনলাইনে চলবে।

দ্বারা এনকোড করা xxd:

0000000: 22b6 0233 93ac eebf c1b7 0609 3794 dbc8  "..3........7...
0000010: 6dc8 1015 dada a122 3235 3662 3435 3462  m......"256b454b
0000020: 3231 3266 2d7b 5f5f 5725 2e2a 413c 3162  212f-{__W%.*A<1b
0000030: 2b7d 7169 2a2d 343d                      +}qi*-4=

ব্যাখ্যা

একটি এমবিয়াস মই মূলত দুটি অতিরিক্ত প্রান্ত সহ একটি সিঁড়ি। মইতে একটি সীমাবদ্ধ বন দেওয়া, এটি এমবিয়াস মইতে 1 থেকে 4 টি সীমাবদ্ধ বন থেকে তোলা যায়। প্রান্তগুলি এমনভাবে যুক্ত করা যেতে পারে যেগুলি 3 ডিগ্রি বা একটি চক্রের একটি শীর্ষকে তৈরি করে না। চারটি কোণার ডিগ্রি এবং তাদের আন্তঃসংযোগগুলি সিঁড়িতে 116 শ্রেণির সীমিত বনভূমি গঠন করে, যদিও তাদের কয়েকটি আয়তক্ষেত্রের প্রতিসাম্যের কারণে সমান। আমি দৈর্ঘ্যের সিঁড়ির সিঁড়ির দৈর্ঘ্যের এন +1 এর একের প্রস্থের বিশ্লেষণের জন্য একটি প্রোগ্রাম লিখেছি এবং তারপরে ক্লাসগুলি 26 সমতুল্য শ্রেণিতে একীভূত করেছি। এটি একটি বদ্ধ ফর্ম দেয়

[1111]T[1220121123410010]n2[0100]+

[221111122]T[211111111101001010002010000001010000000100001110000011001000011322112142000100002]n2[002200000]+

[1244113222344]T[0001000000100020010000000001201101101111004003002000000000001021001000000000111001002001000012000010001201001000000000002002001000000000000010000000000102200230110210124]n2[1011201000121]

সুতরাং তিনটি লিনিয়ার পুনরাবৃত্তি গ্রহণ করে এবং তারপরে সেগুলি যুক্ত করে মানগুলিকে দ্রুত গণনা করা যায়, তবে এটি খুব আড়ম্বরপূর্ণ দেখাচ্ছে না।

তবে, আমরা যদি বিভিন্ন চরিত্রগত বহুবর্ষের অপরিবর্তনীয় কারণগুলি গ্রহণ করি এবং প্রত্যেকে একের সাথে একাধিক গুণ করি (বহুগুণ উপেক্ষা করে) আমরা 10 ডিগ্রি একটি বহুপদী পাই যা একটি কার্যকরী একক রৈখিক পুনরাবৃত্তি দেয়।

গঠনমূলক পদ্ধতির (58 টি অক্ষর)

qi:Q2*,Wa*e!{Wa/{_W%e<}%$}%_&{{,1>},2few:~{:-z(Q(%}%0-!},,

অনলাইন ডেমোn=2এটি সমস্যা ছাড়াই এবং n=3কিছুটা ধৈর্য সহকারে অনলাইনে চলবে । জন্য n=1এটা ক্র্যাশ, কিন্তু যেহেতু ওপি প্রয়োজনীয়তা থেকে যে ক্ষেত্রে বাদ দেওয়ার বেছে নিয়েছেন এটি একটি মৌলিক সমস্যা নয়।

ব্যবচ্ছেদ

qi:Q          e# Take input from stdin, parse to int, store in Q
2*,Wa*e!      e# Take all permutations of (0, -1, 1, -1, 2, -1, ..., -1, 2*Q-1)
{             e# Map to canonical form...
  Wa/         e#   Split around the -1s
  {_W%e<}%    e#   Reverse paths where necessary to get a canonical form
  $           e#   Sort paths
}%
_&            e# Filter to distinct path sets
{             e# Filter to path sets with valid paths:
  {,1>},      e#   Ignore paths with fewer than two elements (can't be invalid; break 2ew)
  2few:~      e#   Break paths into their edges
  {:-z(Q(%}%  e#   The difference between the endpoints of an edge should be +/-1 or Q (mod 2Q)
              e#   So their absolute values should be 1, Q, 2Q-1.
              e#   d => (abs(d)-1) % (Q-1) maps those differences, and no other possible ones, to 0
              e#   NB {:-zQ(%}% to map them all to 1 would save a byte, but wouldn't work for Q=2
  0-!         e#   Test that all values obtained are 0
},
,             e# Count the filtered distinct path sets

আরও কার্যকর সংস্করণে 98 বাইট লাগে:

qi2*:Q{a{__0=[1Q2/Q(]f+Qf%_&1$-\f{+E}~}:E~}/]{_W%>!},:MW=0{_{M\f{__3$_@&@:e<@|^{=}{^j}?}1b}{,)}?}j

অনলাইন ডেমো

এটি গভীরতা-প্রথম অনুসন্ধানের দ্বারা সম্ভাব্য পাথগুলি তৈরি করে, তারপরে একটি মেমোসাইজড ফাংশন ব্যবহার করে যা সম্ভাব্য সীমাবদ্ধ বনাঞ্চলকে একটি উল্লম্ব সেটগুলির জন্য নির্দিষ্ট করে nts ফাংশনটি পুনরাবৃত্তভাবে এই ভিত্তিতে কাজ করে যে প্রদত্ত অ ফাঁকা সমাপ্ত অংশের জন্য যে কোনও সীমাবদ্ধ অরণ্যের মধ্যে সবচেয়ে ছোট ছোট মেরুদণ্ড এবং সেই পথে নয় যে অনুভূমিকাগুলি coveringাকা একটি সীমিত বন রয়েছে path


গ্রিড গ্রাফে, এটি একটি লিনিয়ার পুনরাবৃত্তির সাথে বর্ণনা করা যেতে পারে, সুতরাং এটি দুর্দান্ত তা খুঁজে পেয়ে আমার অবাক করে দেওয়ার কিছু নেই।
পিটার কেজি

6

জাভাস্ক্রিপ্ট (ES6),  160 158  146 বাইট

n=>(g=(e,v,p)=>[...Array(N=2*n),N-1,1,n].reduce((s,x,i)=>(m=1<<(x=i<N?i:(p+x)%N))&v?s:s+g((i>=N)/p?[...e,1<<p|m]:e,v|m,x),g[e.sort()]^(g[e]=1)))``

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

মন্তব্য:

  • n>4
  • a(5)=10204

মন্তব্য

n => (                        // n = input
  g = (                       // g = recursive function taking:
    e,                        //   e[] = array holding visited edges
    v,                        //   v   = bitmask holding visited vertices
    p                         //   p   = previous vertex
  ) =>                        // we iterate over an array of N + 3 entries, where N = 2n:
    [ ...Array(N = 2 * n),    //   - 0...N-1: each vertex of the N-gon (starting points)
      N - 1,                  //   - N      : previous vertex \
      1,                      //   - N+1    : next vertex      }-- connected to p
      n                       //   - N+2    : opposite vertex /
    ].reduce((s, x, i) =>     // reduce() loop with s = accumulator, x = vertex, i = index:
      ( m = 1 << (            //   m is a bitmask where only the x-th bit is set
          x = i < N           //   and x is either:
              ? i             //   - i if i < N
              : (p + x) % N   //   - or (p + x) mod N otherwise
      )) & v ?                //   if this vertex was already visited:
        s                     //     leave s unchanged
      :                       //   else:
        s +                   //     add to s
        g(                    //     the result of a recursive call:
          (i >= N) / p ?      //       if p and x are connected (i >= N and p is defined):
            [ ...e,           //         append to e[]:
              1 << p | m      //           the edge formed by p and x
            ]                 //           and uniquely identified by 1 << p | 1 << x
          :                   //       else:
            e,                //         leave e[] unchanged
          v | m,              //       mark the vertex x as visited
          x                   //       previous vertex = x
        ),                    //     end of recursive call
      g[e.sort()] ^           //   sort the edges and yield 1 if this list of edges has not
      (g[e] = 1)              //   already been encountered; either way, save it in g
    )                         // end of reduce()
)``                           // initial call to g with e = ['']

2

জেলি , 61 58 বাইট

®R,³;Ø+
Ḥ©Ḷµ1ị+¢%®ḟ€;€€1¦-Ẏ;€)Ẏ$ƬẎṣ€-Ẉ’ẠƊƇU¹Ø.ị>/Ɗ?€€Ṣ€QL‘

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

এটি সংক্ষিপ্ত সংস্করণ; এটি অ্যালগরিদমিক জটিলতা এবং গতির তুলনায় স্বল্প দৈর্ঘ্যের জন্য অনুকূলিত।

জেলি , 85 বাইট

%®ḟ
1ị+³;Ø+¤ç,1ị+®_3¤R‘¤Ʋç;€-Ʋ“”2ị>-Ʋ?Ẏ;€
Ḥ©Ḷ;€-Ç€Ẏ$ƬẎṣ€-Ẉ=1ẸƊÐḟU¹1ị>0ị$Ʋ?€€Ṣ€QL‘+=2$

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

এখানে একটি দীর্ঘ সংস্করণ যা অপ্রয়োজনীয় পাথগুলি চেষ্টা করে এড়াতে অতিরিক্ত কোড যুক্ত করে। শেষে n = 2 এর জন্য চেকটি হল n = 2 এর জন্য নির্দিষ্ট ক্ষেত্রে মোকাবেলা করা যা উদাহরণে লাল / নীল ক্রসের মতো দেখায় এবং এই কোড দ্বারা উত্পন্ন হয় না। এই দ্বিতীয় সংস্করণটি টিআইওতে 13 সেকেন্ডেরও কম সময়ে n = 4 টি সম্পন্ন হয়েছে, তবে বেশি সংখ্যার জন্য সময় বেরিয়ে গেছে।

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