एक पेड़ को देखते हुए अपने Prüfer कोड उत्पन्न करते हैं


10

में एक Prüfer कोड है कि एक विशेष पेड़ को दर्शाता है पूर्णांकों का एक अनूठा अनुक्रम है।

आप विकिपीडिया से लिए गए निम्नलिखित एल्गोरिथ्म के साथ एक पेड़ का Prüfer कोड पा सकते हैं:

शीर्ष के साथ एक लेबल ट्री टी पर विचार करें {1, 2, ..., n}। चरण i पर , पत्ती को सबसे छोटे लेबल के साथ हटा दें और इस पत्ते के पड़ोसी के लेबल होने के लिए Prüfer अनुक्रम का i तत्व निर्धारित करें ।

(ध्यान दें कि यह एक पत्ता है क्योंकि इसमें केवल एक पड़ोसी होगा)।

ग्राफ़ में केवल दो कोने बने रहने पर आपको पुनरावृति को रोकना चाहिए।

कार्य

इनपुट आउटपुट के रूप में एक लेबल वाले पेड़ को देखते हुए उसका Prüfer कोड। आप किसी भी उचित तरीके से इनपुट ले सकते हैं। जैसे कि आसन्न मैट्रिक्स या आपकी भाषाओं में निर्मित ग्राफ प्रतिनिधित्व। ( आप एक इनपुट कोड के रूप में इनपुट नहीं ले सकते हैं )।

ये है इसलिए आपको अपने स्रोत में बाइट्स को कम करने का लक्ष्य रखना चाहिए।

परीक्षण के मामलों

नीचे ASCII में उनके आउटपुट के साथ कुछ इनपुट दिए गए हैं। आपको इस तरह से ASCII इनपुट का समर्थन करने की आवश्यकता नहीं है।

    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]]पहले मामले के लिए इनपुट जैसा कुछ ले सकते हैं ? (यानी प्रत्येक शाखा)
हाइपरएनुट्रिनो

@xnor हाँ आप कर सकते हैं
Ad Hoc Garf हंटर

1
मुझे लगता है कि एक रूट की ओर निर्देशित किनारों या रास्तों के साथ एक इनपुट लेना Prüfer कोड की ओर पूर्वसंक्रमण है। किसी भी तरह से, मुझे लगता है कि आपको स्पष्ट होना चाहिए "आप किसी भी उचित तरीके से इनपुट ले सकते हैं (आप Prüfer कोड के रूप में इनपुट नहीं ले सकते हैं)।"
xnor

@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
बेशक ऐसा करने के लिए एक अंतर्निहित है। > _>
हाइपरनेट्रोइनो

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]

अच्छी तरह से मैं असफल रहा ...
हाइपरएन्यूट्रीनो

@HyperNeutrino आप लगभग 4 सेकंड तेज थे!
L3viathan

हे यूप! और लगभग 2.7 गुना लंबा! : डी जीजी
हाइपरएनुट्रिनो

1
delमौजूद? > _>
HyperNeutrino

1
@WheatWizard आप अर्धविरामों के बारे में सही हैं, लेकिन टैब और स्पेस को
मिलाना

2

जेली , 31 बाइट्स

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

एक मोनडिक लिंक जो किसी भी क्रम में (और किसी भी अभिविन्यास में) नोड्स के जोड़ों की सूची (किनारों को परिभाषित करना) लेता है और एक सूची के रूप में Prüfer कोड लौटाता है।

इसे ऑनलाइन आज़माएं!

कैसे?

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

05AB1E , 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। साथ ही अंतिम तत्व को छोड़ना होगा।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.