निर्भरता ग्राफ विज़ुअलाइज़ेशन


22

इस चुनौती का लक्ष्य एक कार्यक्रम लिखना है जो एक पेड़ के रूप में एक निर्भरता ग्राफ की कल्पना करता है। जबकि इस संदर्भ में "निर्भरता ग्राफ" का मतलब निर्देशित ग्राफ से अधिक कुछ नहीं है, यहाँ वर्णित दृश्य विधि कुछ निर्भरता संबंध (एक अभ्यास के रूप में, आप चुनौती पढ़ने के बाद, किसी एक की दिशा को उलटने की कोशिश करते हैं) का वर्णन करने के लिए सबसे अच्छा काम करता है नमूना रेखांकन, और देखें कि क्या परिणाम उपयोगी है।)

इनपुट कार्यक्रम के लिए एक या अधिक के होते हैं लक्ष्य परिभाषाओं , जो फार्म की लाइनें हैं

Target DirectDependency1 DirectDependency2 ...

, किसी लक्ष्य को परिभाषित करना , और इससे संबंधित प्रत्यक्ष निर्भरता , यदि कोई हो। लक्ष्य और उनकी निर्भरता को सामूहिक रूप से वस्तु कहा जाता है । यदि कोई वस्तु केवल निर्भरता के रूप में प्रकट होती है, और लक्ष्य के रूप में नहीं, तो इसकी कोई निर्भरता नहीं है। इनपुट में दिखाई देने वाली सभी वस्तुओं के सेट को that कहा जाता है । (इनपुट प्रारूप के बारे में अधिक जानकारी के लिए इनपुट और आउटपुट अनुभाग देखें।)

किसी भी जोड़ी के लिए, A और B , हम कहते हैं कि:

  • एक पर निर्भर करता है बी (समतुल्य रूप, बी के लिए आवश्यक है एक ), अगर एक सीधे पर निर्भर करता है बी , या यदि एक सीधे पर निर्भर करता है बी ' , और बी' पर निर्भर करता है बी , किसी वस्तु के लिए बी ' ;
  • A ठीक से B पर निर्भर करता है (समकक्ष, B को A की ठीक से आवश्यकता है ), यदि A B पर निर्भर करता है, और B A पर निर्भर नहीं करता है।

हम एक वंचित वस्तु को परिभाषित करते हैं, ʀoo a , such में नहीं, जैसे कि contooᴛ को सीधे किसी भी वस्तु की आवश्यकता नहीं होती है, और ऐसा है कि, सभी वस्तुओं A के लिए , dependsooᴛ सीधे A पर निर्भर करता है और यदि A केवल is में है, और A नहीं है ठीक से Γ में किसी भी वस्तु के लिए आवश्यक (दूसरे शब्दों में, ʀooᴛ सीधे पर निर्भर करता है एक , अगर कोई अन्य वस्तु पर निर्भर करता है एक , या सभी वस्तुओं है कि इस पर निर्भर करता है, तो एक भी के लिए आवश्यक हैं एक ।)

आउटपुट ट्री

हम एक पेड़ का निर्माण करते हैं , जिसका मूल नोड aoo and है, और ऐसा है कि प्रत्येक नोड के बच्चे इसकी प्रत्यक्ष निर्भरता हैं। उदाहरण के लिए, इनपुट दिया गया

Bread Dough Yeast
Dough Flour Water
Butter Milk

परिणामी वृक्ष है

आउटपुट ट्री उदाहरण

, या, ASCII फॉर्म में,

ʀooᴛ
+-Bread
| +-Dough
| | +-Flour
| | +-Water
| +-Yeast
+-Butter
  +-Milk

। कार्यक्रम का आउटपुट उपरोक्त परिभाषित वृक्ष है, जिसे outputoo। नोड के बिना मुद्रित किया गया है। इसलिए, उदाहरण के लिए, उपरोक्त इनपुट के लिए संबंधित आउटपुट है

Bread
+-Dough
| +-Flour
| +-Water
+-Yeast
Butter
+-Milk

। आउटपुट ट्री के लेआउट का विस्तृत विवरण बाद में दिया गया है।

नोड आदेश

किसी दिए गए माता पिता नोड, के बच्चे नोड्स पी , किया जाना चाहिए अनुसार क्रमबद्ध हैं, जैसे कि, सभी बच्चे के लिए नोड एक और बी के पी , एक प्रतीत होता है से पहले बी यदि और केवल यदि

  • पी का एक बच्चा नोड सी मौजूद है , जैसे कि , सी द्वारा ठीक से आवश्यक है , और सी एक ही क्रम के अनुसार , बी , पूर्व या के बराबर है ; या ,
  • एक वर्णानुक्रमिक रूप से बी (अधिक सटीक रूप से, एएससीआईआई कोलाजेशन का उपयोग करते हुए एक पूर्ववर्ती बी ), और पी का कोई बच्चा नोड सी मौजूद नहीं है , जैसे कि बी को सी द्वारा ठीक से आवश्यक है , और सी पूर्व , या उसी क्रम के अनुसार , के बराबर है। ।

(गणितीय चुनौती की तलाश कर रहे लोग यह बताना चाहते हैं कि यह संबंध अच्छी तरह से परिभाषित है, और यह वास्तव में, एक सख्त कुल आदेश है। यह मत भूलो कि fin परिमित है!)

उदाहरण के लिए, इनपुट दिया गया

X D C B A
B D
C A

, आउटपुट होना चाहिए

X
+-A
+-D
+-B
| +-D
+-C
  +-A

Aपहले दिखाई देने वाला Bहै, और Bपहले दिखाई देने वाला C, उनके वर्णमाला के क्रम के कारण; Dइससे पहले कि Bयह ठीक से आवश्यक है, और बाद में A, क्योंकि यह वर्णानुक्रम से इसका अनुसरण करता है, पहले प्रकट होता है; Bऔर Cपहले नहीं दिखाई देते हैं D, भले ही वे इसे वर्णानुक्रम में पहले से मानते हैं, क्योंकि एक नोड मौजूद है, अर्थात् B, जिसे ठीक से आवश्यकता होती है D, और यह समान नियमों के अनुसार B(यानी, स्वयं), और आगे बढ़ता Cहै।

repetitions

एक ही ऑब्जेक्ट, , आउटपुट में एक से अधिक बार दिखाई दे सकता है, यदि, उदाहरण के लिए, यह एक से अधिक ऑब्जेक्ट द्वारा आवश्यक है। यदि A की स्वयं की कोई निर्भरता नहीं है, तो इस मामले में किसी विशेष हैंडलिंग की आवश्यकता नहीं है। अन्यथा, आदेश उत्पादन के शब्दाडंबर कम करने के लिए, और परिपत्र निर्भरता की वजह से अनंत प्रत्यावर्तन से बचने के लिए, की निर्भरता एक ही अपने पर सूचीबद्ध हैं पहली घटना है जिसके लिए पूर्वजों में से कोई भी एक और के भाई-बहन हैं एक नोड; की किसी भी अन्य घटना के कोई संतान नहीं होनी चाहिए, और जैसा कि एक अंतरिक्ष और एक दीर्घवृत्त के बाद दिखाई देना चाहिए, जैसा कि अंदर है ।A...

उदाहरण के लिए, इनपुट दिया गया

IP Ethernet
TCP IP
UDP IP
WebRTC TCP UDP

, आउटपुट होना चाहिए

WebRTC
+-TCP
| +-IP
|   +-Ethernet
+-UDP
  +-IP ...

। एक अन्य उदाहरण के रूप में, दोनों पर निर्भरता और वंशानुगत विचारों की विशेषता,

Rock Scissors
Paper Rock
Scissors Paper

में परिणाम होना चाहिए

Paper
+-Rock ...
Rock
+-Scissors ...
Scissors
+-Paper ...

। ध्यान दें, उदाहरण के लिए, पहली घटना Rockइसकी निर्भरता को सूचीबद्ध नहीं करती है, क्योंकि इसके माता-पिता, Paperदूसरे Rockनोड के भाई-बहन हैं । दूसरे Rockनोड के माता-पिता , ᴛooᴛ (जो आउटपुट में प्रकट नहीं होता है), Rockएक भाई के रूप में नहीं होता है , इसलिए Rockइस नोड पर निर्भरताएं सूचीबद्ध हैं।

आउटपुट ट्री लेआउट

मुझे यकीन है कि आपको इस बात का पता चल गया होगा कि पेड़ को ASCII कला के रूप में कैसे प्रस्तुत किया जाना चाहिए (और यदि आपके पास इस खंड को छोड़ने के लिए स्वतंत्र हैं, तो) लेकिन पूर्णता के लिए ...

ᴛooᴛ के बच्चे के नोड्स अलग-अलग लाइनों पर मुद्रित होते हैं, बिना किसी इंडेंटेशन के, क्रम में। प्रत्येक नोड को तुरंत उसके बच्चों द्वारा पीछा किया जाता है, यदि कोई हो, एक ही फैशन में मुद्रित, पुनरावर्ती, दाईं ओर दो वर्णों द्वारा प्रेरित। प्रत्येक नोड वाले बच्चों के लिए, एक ऊर्ध्वाधर रेखा, जिसमें |(पाइप) वर्ण होते हैं, नोड के पहले वर्ण से सीधे वर्ण से नीचे तक फैली हुई है, जब तक कि इसकी अंतिम चाइल्ड नोड की पंक्ति नहीं है, अंतिम बाल नोड के बच्चों को शामिल नहीं है। यदि किसी नोड का इंडेंटेशन नॉनजेरो है, तो यह +-ऊपर बताई गई वर्टिकल लाइन को ओवरराइट करके (उसी इंडेंटेशन लेवल पर उसके पैरेंट के रूप में) होता है।

इनपुट और आउटपुट

आप STDIN के माध्यम से इनपुट पढ़ सकते हैं , या एक समकक्ष विधि का उपयोग कर सकते हैं । आप मान सकते हैं कि कोई खाली रेखाएं नहीं हैं , और आपको आवश्यकता हो सकती है कि अंतिम पंक्ति समाप्त हो, या एक नई पंक्ति में समाप्त न हो। आप मान सकते हैं कि ऑब्जेक्ट नाम में मुद्रण योग्य ASCII वर्ण (अंतरिक्ष सहित नहीं) शामिल हैं। आप मान सकते हैं कि लक्ष्य परिभाषा में वस्तुओं को एक एकल स्थान वर्ण द्वारा अलग किया जाता है , और यह कि कोई अग्रणी या अनुगामी स्थान नहीं हैं । आप मान सकते हैं कि प्रत्येक लक्ष्य को एक बार में परिभाषित किया गया है , और इसकी निर्भरता सूची में कोई पुनरावृत्ति नहीं है

आप आउटपुट को STDOUT में लिख सकते हैं , या समकक्ष पद्धति का उपयोग कर सकते हैं । सभी आउटपुट लाइनें, सबसे लंबे समय तक छोड़कर, अनुगामी रिक्त स्थान शामिल हो सकते हैं। अंतिम आउटपुट लाइन एक नई पंक्ति वर्ण में समाप्त हो सकती है, या नहीं भी हो सकती है।

स्कोर

यह कोड-गोल्फ है । सबसे छोटा जवाब , बाइट्स में, जीतता है।

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

आपके कार्यक्रम को निम्नलिखित परीक्षण मामलों में से प्रत्येक को उचित समय में संसाधित करना चाहिए।


इनपुट

Depender Dependee
Independent

उत्पादन

Depender
+-Dependee
Independent

इनपुट

Earth Turtle
Turtle Turtle

उत्पादन

Earth
+-Turtle
  +-Turtle ...

इनपुट

F A C B D I
A B
B A C
D E H
C
G F
J H G C E I
E D
H D
I G

उत्पादन

J
+-C
+-E
| +-D
|   +-E ...
|   +-H ...
+-H
| +-D ...
+-G
| +-F
|   +-C
|   +-A
|   | +-B ...
|   +-B
|   | +-C
|   | +-A ...
|   +-D ...
|   +-I ...
+-I
  +-G ...

सभ्यता वी टेक्नोलॉजी ट्री

इनपुट

उत्पादन


साइगविन syslog- एनजी पैकेज निर्भरता ग्राफ

इनपुट

उत्पादन


GNU grep regex.cकॉल ग्राफ़

इनपुट

आउटपुट (वूप्स! एसई को संभालने के लिए बहुत लंबा।)


5
अच्छी निर्दिष्ट!
नहीं कि चार्ल्स

नोड आदेश अनुभाग में स्व-संदर्भ मेरे सिर को चोट पहुंचाता है।
पुनरावर्ती

जवाबों:


5

हास्केल, 512 बाइट्स

import Data.List
r=reverse
n j|let(w,s)#p|let a?b=or[q!b<GT|(q,r)<-i,a==r,elem q(h p)>elem(a,q)i];a!b|a==b=EQ|a?b||(a<b)>b?a=LT;_!_=GT;l=nub.sortBy(!)$h p;m(v,s)q|h q==[]=(v,[q]:s)|elem q w=(v,[q++" ..."]:s)|(w,x:y)<-(v,[])#q=(w,(q:(u"| "=<<r y)++u"  "x):s)=foldl m(l++w,[])l;c(p,q)=z$p:q:h q;y=z=<<j;i=iterate(nub.sort.(c=<<))y!!length j;h""=[p|p<-id=<<j,and[elem(p,r)i|(r,q)<-i,p==q]];h p=[r|(q,r)<-y,p==q]=unlines=<<r(snd$mempty#"")
u s(x:y)=("+-"++x):map(s++)y
z(x:y)=(,)x<$>y
main=interact$n.map words.lines

Ideone पर ऑनलाइन रन करें


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