নির্ভরতা গ্রাফ ভিজ্যুয়ালাইজেশন


22

এই চ্যালেঞ্জের লক্ষ্যটি এমন একটি প্রোগ্রাম লিখুন যা গাছের আকারে নির্ভরতা গ্রাফটি কল্পনা করে। যদিও এই প্রসঙ্গে "নির্ভরতা গ্রাফ" অর্থ নির্দেশিত গ্রাফ ছাড়া আর কিছুই নয়, এখানে বর্ণিত ভিজ্যুয়ালাইজেশন পদ্ধতি কিছু নির্ভরশীলতার সম্পর্ক বর্ণনা করার জন্য গ্রাফগুলির পক্ষে সবচেয়ে ভাল কাজ করে (একটি চর্চা হিসাবে, আপনি চ্যালেঞ্জটি পড়ার পরে, কোনওটির দিককে বিপরীত করার চেষ্টা করুন) নমুনা গ্রাফগুলি দেখুন এবং ফলাফলটি যেমন কার্যকর তেমন কার্যকর কিনা তা দেখুন))

ইনপুট প্রোগ্রাম এক বা একাধিক নিয়ে গঠিত লক্ষ্য সংজ্ঞা , যা ফর্মের লাইন আছে

Target DirectDependency1 DirectDependency2 ...

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

যেকোনও জোড়া বস্তুর জন্য, এবং বি , আমরা এটি বলি:

  • একটি উপর নির্ভর করে বি (equivalently, বি দ্বারা প্রয়োজন বোধ করা হয় একটি ), যদি একটি সরাসরি উপর নির্ভর করে বি , অথবা যদি একজন সরাসরি উপর নির্ভর করে বি ' , এবং বি' উপর নির্ভর করে বি , কিছু বস্তুর জন্য বি ' ;
  • একটি সঠিকভাবে উপর নির্ভর করে বি (equivalently, বি সঠিকভাবে দ্বারা প্রয়োজন বোধ করা হয় একটি ), যদি একটি উপর নির্ভর করে বি , আর বি উপর নির্ভর করে না একটি

আমরা একটি স্বীকৃত অবজেক্টের সংজ্ঞা দিই , ᴛooᴛ , in এ নয়, যেমন ʀooᴛ সরাসরি কোনও বস্তুর দ্বারা প্রয়োজন হয় না এবং যেমন, সমস্ত বস্তুর A এর জন্য ʀooᴛ সরাসরি A এর উপর নির্ভর করে এবং কেবল যদি A A-এ থাকে এবং A হয় না সঠিকভাবে Γ যে কোন বস্তু দ্বারা প্রয়োজনীয় (অন্য কথায়, ʀooᴛ সরাসরি উপর নির্ভর করে একটি যদি অন্য কোন বস্তুর উপর নির্ভর করে একটি বা সব বস্তু যা উপর নির্ভর করে যদি একজন এছাড়াও প্রয়োজনীয় হয় একটি ।)

আউটপুট ট্রি

আমরা একটি গাছ তৈরি করি , যার মূল নোড ʀooᴛ এবং প্রতিটি নোডের শিশুরা এর প্রত্যক্ষ নির্ভরতা। উদাহরণস্বরূপ, ইনপুট দেওয়া

Bread Dough Yeast
Dough Flour Water
Butter Milk

, ফলস্বরূপ গাছ হয়

আউটপুট ট্রি উদাহরণ

, বা, ASCII আকারে,

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

। প্রোগ্রামটির আউটপুট হ'ল উপরের সংজ্ঞায়িত গাছ, ʀooᴛ নোড ছাড়াই মুদ্রিত । সুতরাং, উদাহরণস্বরূপ, উপরের ইনপুটটির জন্য সংশ্লিষ্ট আউটপুট

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

। আউটপুট গাছের বিন্যাসের বিশদ বিবরণ পরে দেওয়া হবে।

নোড অর্ডার

একটি প্রদত্ত পিতা বা মাতা নোডের সন্তান নোড পি , করা উচিত সাজানো , যেমন যে, সমস্ত সন্তানের জন্য নোড একটি এবং বি এর পি , একজন মনে হচ্ছে, সামনে বি যদি এবং কেবল যদি

  • একটি শিশু নোড অস্তিত্ব আছে সি এর পি , যেমন যে একজন সঠিকভাবে দ্বারা প্রয়োজন বোধ করা হয় সি , এবং সি তার আগে বসেছে, বা, সমান বি একই আদেশ অনুযায়ী; বা ,
  • একটি বর্ণানুক্রমে পূর্বে বি (আরও preceisely, একজন তার আগে বসেছে বি হওয়া ASCII কোলেশন ব্যবহার করে,) এবং অস্তিত্ব আছে কোন সন্তান নোড সি এর পি , যেমন যে বি সঠিকভাবে দ্বারা প্রয়োজন বোধ করা হয় সি , এবং সি তার আগে বসেছে, বা, সমান একজন , একই আদেশ অনুযায়ী ।

(গাণিতিক চ্যালেঞ্জের সন্ধানকারী লোকেরা দেখাতে পারেন যে এই সম্পর্কটি সুস্পষ্টভাবে সংজ্ঞায়িত হয়েছে এবং এটি আসলে একটি কঠোর সামগ্রিক অর্ডার। ভুলে যাবেন না যে 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

একই বস্তু, , আউটপুটে একাধিকবার উপস্থিত হতে পারে, উদাহরণস্বরূপ, এটি একাধিক বস্তুর দ্বারা প্রয়োজন হয়। যদি এর নিজস্ব কোনও নির্ভরতা না থাকে তবে এই ক্ষেত্রে বিশেষ হ্যান্ডলিংয়ের প্রয়োজন নেই। অন্যথায়, অর্ডার আউটপুট ভারবোসিটি কমানোর জন্য, এবং বিজ্ঞপ্তি নির্ভরতা কারণে অসীম recursion এড়ানোর জন্য, এর নির্ভরতা একটি শুধুমাত্র তার তালিকাভুক্ত করা হয় প্রথম সংঘটন , যার জন্য পূর্বপুরুষদের কেউ অন্যের ভাইবোন হয় একটি নোড; অন্য কোন সংঘটন একটি কোন সন্তান থাকা উচিত, এবং একটি স্থান এবং হিসাবে একটি ঊহ্য শব্দ, দ্বারা অনুসরণ প্রদর্শিত হওয়া উচিত ।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 ...

সভ্যতা ভি প্রযুক্তি গাছ

ইনপুট

আউটপুট


সাইগউইন সিলেগ-এনজি প্যাকেজ নির্ভরতা গ্রাফ

ইনপুট

আউটপুট


জিএনইউ গ্রেপ regex.cকল গ্রাফ

ইনপুট

আউটপুট (ওফফ! এসই হ্যান্ডেল করার জন্য খুব দীর্ঘ।


5
ওয়েল-নির্দিষ্ট!
চার্লস

নোড অর্ডার বিভাগে স্ব-উল্লেখটি আমার মাথাকে আঘাত দেয় hurt
পুনরাবৃত্ত

উত্তর:


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

আইডিয়নে অনলাইনে চালান


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