একটি ট্রি দেওয়া তার প্রিফার কোড উত্পন্ন করে


10

ভিতরে একটি প্রিফার কোড হল পূর্ণসংখ্যার একটি অনন্য ক্রম যা একটি নির্দিষ্ট গাছকে বোঝায়।

আপনি উইকিপিডিয়া থেকে নেওয়া নিম্নলিখিত অ্যালগরিদমের সাথে একটি গাছের প্রেফার কোডটি খুঁজে পেতে পারেন:

শীর্ষে একটি লেবেলযুক্ত গাছ টি বিবেচনা করুন {1, 2, ..., n}। ধাপে আমি , ক্ষুদ্রতম ট্যাগ পাত মুছে ফেলুন এবং সেট আমি Prüfer ক্রম তম উপাদান এই পাতার প্রতিবেশী লেবেল যাবে।

(দ্রষ্টব্য যে এটি একটি পাতাগুলি থেকে এটির কেবল একটি প্রতিবেশী থাকবে)।

যখন গ্রাফের মধ্যে কেবল দুটি সূচি থাকবে তখন আপনার পুনরাবৃত্তি থামানো উচিত।

কার্য

ইনপুট আউটপুট হিসাবে তার প্রেফার কোড হিসাবে একটি লেবেলযুক্ত গাছ দেওয়া হয়েছে। আপনি কোনও যুক্তিসঙ্গত পদ্ধতিতে ইনপুট নিতে পারেন। যেমন একটি সংলগ্ন ম্যাট্রিক্স বা আপনার ভাষা অন্তর্নির্মিত গ্রাফ উপস্থাপনা। ( আপনি প্রিফার কোড হিসাবে ইনপুট নাও নিতে পারেন )।

এই সুতরাং আপনার উত্সের বাইটগুলি হ্রাস করার লক্ষ্য করা উচিত।

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

নীচে আউটপুট সহ এএসসিআইআই-এর কিছু ইনপুট রয়েছে। আপনাকে এএসসিআইআই ইনপুটটিকে সমর্থন করার দরকার নেই।

    3
    |
1---2---4---6
    |
    5

{2,2,2,4}

1---4---3
    |
5---2---6---7
|
8

{4,4,2,6,2,5}

5---1---4   6
    |       |
    2---7---3

{1,1,2,7,3}

আমরা কি একটি শিকড় গাছকে ইনপুট হিসাবে নিতে পারি?
xnor

আমরা কি [[2,1],[2,3],[2,5],[2,4,6]]প্রথম ক্ষেত্রে যেমন কিছু হিসাবে ইনপুট নিতে পারি ? (অর্থাত্ প্রতিটি শাখা)
হাইপার নিউট্রিনো 11:57

@ এক্সনর হ্যাঁ আপনি করতে পারেন
অ্যাডহক গার্ফ হান্টার

1
আমি মনে করি কোনও মূলের দিকে নির্দেশিত প্রান্তগুলি বা পাথের সাথে একটি ইনপুট নেওয়া প্রিফার কোডের দিকে পূর্বনির্মাণ। যেভাবেই হোক না কেন, আমার মনে হয় আপনার "আরও সঠিকভাবে ইনপুট নিতে পারেন (আপনি প্রিফার কোড হিসাবে ইনপুট নাও নিতে পারেন)" এ সম্পর্কে আপনাকে আরও পরিষ্কার হতে হবে "
xnor

@ এক্সনর ওহ আমি বুঝতে পারি নি হাইপার নিউট্রিনো কী জিজ্ঞাসা করছে।
অ্যাডহক গার্ফ হান্টার

উত্তর:


9

গণিত, 34 বাইট

<<Combinatorica`
LabeledTreeToCode

কারো এটা কি ছিল....

Combinatoricaপ্যাকেজটি লোড করার পরে , ফাংশনটি LabeledTreeToCodeএকটি ট্রি ইনপুটটিকে সুস্পষ্টভাবে তালিকাভুক্ত প্রান্ত এবং শীর্ষগুলি সহ একটি অনির্দেশিত গ্রাফ হিসাবে প্রত্যাশা করে; উদাহরণস্বরূপ, দ্বিতীয় পরীক্ষার ক্ষেত্রে ইনপুট হতে পারে Graph[{{{1, 4}}, {{4, 3}}, {{4, 2}}, {{2, 5}}, {{2, 6}}, {{6, 7}}, {{5, 8}}}, {1, 2, 3, 4, 5, 6, 7, 8}]


5
এটি করার জন্য অবশ্যই একটি অন্তর্নির্মিত আছে। > _>
হাইপার নিউট্রিনো 12:37

4

পাইথন 3, 136 131 127 বাইট

def f(t):
 while len(t)>2:
  m=min(x for x in t if len(t[x])<2);yield t[m][0];del t[m]
  for x in t:m in t[x]and t[x].remove(m)

সংলগ্ন ম্যাট্রিক্স হিসাবে ইনপুট নেয়। প্রথম উদাহরণ:

>>> [*f({1:[2],2:[1,3,4,5],3:[2],4:[2,6],5:[2],6:[4]})]
[2, 2, 2, 4]

ভাল আমি ব্যর্থ হয়েছি ...
হাইপার নিউট্রিনো

আপনি @ হাইপারনিউটারিনো প্রায় 4 সেকেন্ড দ্রুত ছিলেন!
L3viathan

হুঁ! এবং প্রায় 2.7 বার হিসাবে দীর্ঘ! : ডি জিজি
হাইপার নিউট্রিনো

1
delবিদ্যমান? > _>
হাইপারনিউট্রিনো

1
সেমিকোলন সম্পর্কে আপনি @WheatWizard করছি ঠিক আছে, কিন্তু মিশ ট্যাব এবং স্পেস পাইথন 3 একটি ত্রুটি
L3viathan

2

জেলি , 31 বাইট

FĠLÞḢḢ
0ịµÇHĊṙ@µÇCịṪ,
WÇÐĿḢ€ṖṖḊ

একটি মোনাডিক লিঙ্ক যা কোনও ক্রমে (এবং যে কোনও দিকনির্দেশে প্রতিটি) নোডের জোড়া (প্রান্তগুলি সংজ্ঞায়িত করে) এর একটি তালিকা নেয় এবং প্রিফার কোডকে একটি তালিকা হিসাবে প্রদান করে।

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

কিভাবে?

FĠLÞḢḢ - Link 1, find leaf location: list of edges (node pairs)
F      - flatten
 Ġ     - group indices by value (sorted smallest to largest by value)
  LÞ   - sort by length (stable sort, so equal lengths remain in prior order)
    ḢḢ - head head (get the first of the first group. If there are leaves this yields
       -   the index of the smallest leaf in the flattened version of the list of edges)

0ịµÇHĊṙ@µÇCịṪ, - Link 2, separate smallest leaf: list with last item a list of edges
0ị             - item at index zero - the list of edges
  µ            - monadic chain separation (call that g)
   Ç           - call last link (1) as a monad (index of smallest leaf if flattened)
    H          - halve
     Ċ         - ceiling (round up)
      ṙ@       - rotate g left by that amount (places the edge to remove at the right)
        µ      - monadic chain separation (call that h)
         Ç     - call last link (1) as a monad (again)
          C    - complement (1-x)
            Ṫ  - tail h (removes and yields the edge)
           ị   - index into, 1-based and modular (gets the other node of the edge)
             , - pair with the modified h
               -    (i.e. [otherNode, restOfTree], ready for the next iteration)

WÇÐĿḢ€ṖṖḊ - Main link: list of edges (node pairs)
W         - wrap in a list (this is so the first iteration works)
  ÐĿ      - loop and collect intermediate results until no more change:
 Ç        -   call last link (2) as a monad
    Ḣ€    - head €ach (get the otherNodes, although the original tree is also collected)
      ṖṖ  - discard the two last results (they are excess to requirements)
        Ḋ - discard the first result (the tree, leaving just the Prüfer Code)

1

05 এ বি 1 ই , 29 বাইট

[Dg#ÐD˜{γé¬`U\X.å©Ï`XK`ˆ®_Ï]¯

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

ব্যাখ্যা

[Dg#                           # loop until only 1 link (2 vertices) remain
    ÐD                         # quadruple the current list of links
      ˜{                       # flatten and sort values
        γé                     # group by value and order by length of runs
          ¬`U                  # store the smallest leaf in X
             \X                # discard the sorted list and push X
               .å©             # check each link in the list if X is in that link
                  Ï`           # keep only that link
                    XK`ˆ       # add the value that isn't X to the global list
                        ®_Ï    # remove the handled link from the list of links
                           ]   # end loop
                            ¯  # output global list

1

ক্লোজার, 111 বাইট

#(loop[r[]G %](if-let[i(first(sort(remove(set(vals G))(keys G))))](recur(conj r(G i))(dissoc G i))(butlast r)))

ইনপুটটিকে হ্যাশ-ম্যাপ হতে হবে, কী হিসাবে "পাতার মতো" লেবেল এবং মান হিসাবে "মূলের মতো" লেবেল রয়েছে। উদাহরণ স্বরূপ:

{1 2, 3 2, 5 2, 4 2, 6 4}
{1 4, 3 4, 4 2, 8 5, 5 2, 7 6, 6 2}

প্রতিটি পুনরাবৃত্তিতে এটি ক্ষুদ্রতম কীটি আবিষ্কার করে যা অন্য কোনও নোড দ্বারা রেফারেন্স করা হয় না, ফলাফলটিতে যুক্ত করে rএবং গ্রাফ সংজ্ঞা থেকে নোডটিকে সরিয়ে দেয় G। খালি থাকলে if-letঅন্য ক্ষেত্রে যায় G, firstফেরতের হিসাবে nil। এছাড়াও শেষ উপাদানটি বাদ দিতে হবে।


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