Bağımlılık Grafiği Görselleştirme


22

Bu zorluğun amacı , bir ağaç şeklinde bir bağımlılık grafiğini görselleştiren bir program yazmaktır . Bu bağlamda "bağımlılık grafiği", yönlendirilmiş bir grafikten başka bir şey ifade etmese de, burada açıklanan görselleştirme yöntemi, bazı bağımlılık ilişkilerini tanımlayan grafikler için en iyi sonucu verir (bir egzersiz olarak, zorluğu okuduktan sonra, birinin yönünü tersine çevirmeye çalışın). örnek grafikler ve sonucun işe yarayıp yaramadığına bakın.)

Programın girişi , formun satırları olan bir veya daha fazla hedef tanımından oluşur.

Target DirectDependency1 DirectDependency2 ...

varsa bir hedef ve bununla ilişkili doğrudan bağımlılıklar tanımlanması . Hedefler ve bağımlılıkları topluca nesneler olarak adlandırılır . Bir nesne yalnızca bir bağımlılık olarak görünüyorsa ve bir hedef olarak görünmüyorsa, hiçbir bağımlılığı yoktur. Girdi görünen tüm nesnelerin kümesi denir Γ . (Giriş formatı hakkında daha fazla bilgi için Giriş ve Çıkış bölümüne bakın.)

A ve B nesnelerinin herhangi biri için şunu söylüyoruz:

  • Bir bağlıdır B (eşit biçimde, B gereklidir A ) ise, bir direkt olarak bağlıdır B olması durumunda veya bir direkt olarak bağlıdır B ' ve B' bağlı B bir nesne için, B' ;
  • Bir düzgün bağlıdır B (eşit biçimde, B düzgün gerektirdiği A ise,) A bağlıdır B ve B bağlı değildir A .

Biz, zoraki bir nesneyi tanımlamak ʀooᴛ ʀooᴛ doğrudan herhangi bir nesne tarafından gerekli değildir, öyle ki, olup y de, ve tüm nesneler için, öyle ki A , ʀooᴛ direkt olarak bağlıdır A , ancak ve ancak bir y olan ve bir değil düzgün y herhangi bir nesne gerektirdiği (diğer bir deyişle, ʀooᴛ direkt olarak bağlıdır A herhangi bir başka nesnenin bağlı ise A veya bağımlı tüm nesneler, eğer A , aynı zamanda gerekli olan A ).

Çıktı Ağacı

Kök düğümü ʀooᴛ olan bir ağaç inşa ediyoruz ve öyle ki her düğümün çocukları doğrudan bağımlılık yapıyor. Örneğin, giriş verilen

Bread Dough Yeast
Dough Flour Water
Butter Milk

, ortaya çıkan ağaç

Çıktı Ağacı Örneği

veya ASCII formunda,

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

. Programın çıktısı treeoo tree düğümü olmadan basılan yukarıda tanımlanan ağaçtır . Dolayısıyla, örneğin, yukarıdaki giriş için karşılık gelen çıktı

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

. Çıkış ağacının düzeninin ayrıntılı bir açıklaması daha sonra verilmektedir.

Düğüm Sırası

Belirli üst düğüm, çocuk düğümleri P , gereken kriteri her bir çocuk için düğümleri, öyle ki, bir ve B arasında , P , bir belirmesi B , ancak ve ancak

  • Orada bir çocuk düğüm var ait P , öyle ki, bir düzgün gerektirdiği C , ve önce gelir, ya da eşit B , aynı sıraya göre; veya ,
  • Bir alfabetik önce gelen B (daha preceisely, bir ilerlettiği B ASCII harmanlama kullanılarak) ve vardır bir çocuk düğüm C arasında P , öyle ki B doğru gerektirdiği C , ve önce gelir, ya da eşittir , A aynı sıraya göre, .

(Matematiksel bir meydan okuma arayan insanlar, bu ilişkinin iyi tanımlandığını ve aslında kesin bir düzen olduğunu göstermek isteyebilir. Γ'nun sonlu olduğunu unutma!)

Örneğin, giriş verilen

X D C B A
B D
C A

çıkış olmalı

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

. Aönce görünen Bve Bdaha önce görünür Cnedeniyle alfabetik sıraya; Ddaha önce görünür B, çünkü onun tarafından gerektiği şekilde ve sonra A, alfabetik olarak takip ettiği için; Bve Cdaha önce görünmüyorlar D, alfabetik olarak gelmelerine rağmen , aynı kurallara uygun bir Bşekilde gerektiren Dve buna eşit B(yani, kendi) ve öncelikleri Colan bir düğüm var .

tekrarlar

Aynı amacı, bir örneğin, birden fazla nesne tarafından gerekli olan, eğer çıktı birden fazla kez ortaya çıkabilir. Eğer bir kendine ait hiçbir bağımlılığı yoktur, hiçbir özel işleme bu durumda gereklidir. Aksi takdirde, çıkışın verbilgisini en aza indirmek ve dairesel bağımlılıklar nedeniyle sonsuz yinelemeyi önlemek için, A bağımlılıkları yalnızca atalarından hiçbirinin başka bir A düğümünün kardeşi olmadığı ilk oluşumunda listelenir ; A'nın başka hiçbir oluşumunun çocuğu olmamalı ve içinde olduğu gibi bir boşluk ve bir üç nokta tarafından takip edilmeli .A...

Örneğin, giriş verilen

IP Ethernet
TCP IP
UDP IP
WebRTC TCP UDP

çıkış olmalı

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

. Diğer bir örnek olarak, hem dairesel bağımlılık hem de geçmişe dair düşünceleri içeren,

Rock Scissors
Paper Rock
Scissors Paper

, sonuçlanmalı

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

. Örneğin, ilk oluşumunun Rockbağımlılıklarını listelemediğine dikkat edin, çünkü ebeveyn, Paperbaşka bir Rockdüğümün kardeşidir . İkinci Rockdüğümün ebeveyni olan ʀooᴛ (çıkışta görünmüyor) Rockbir kardeş olarak bulunmuyor , bağımlılıkları Rockbu düğümde listeleniyor.

Çıktı Ağacı Düzeni

Ağacın ASCII sanatı olarak nasıl temsil edilmesi gerektiğinden eminim (ve varsa bu bölümü atlamaktan çekinmeyin) ama tamamlık uğruna ...

Ʀooᴛ 'nun alt düğümleri, sırayla girintisiz olarak ayrı satırlara yazdırılır. Her düğümü derhal çocukları takip eder, varsa aynı şekilde yazdırılır, tekrarlı olarak sağa iki karakter girintili olarak yazılır. Çocuk sahibi olan her düğüm için, |(boru) karakterlerinden oluşan dikey bir çizgi, son alt düğümün çocukları dahil değil, son alt düğümün sırasına kadar, ilk düğümün hemen altındaki karakterden, son alt düğümün sırasına kadar uzanır. Bir düğümün girintisi sıfır değilse, bundan önce gelir +-(üst ile aynı girinti seviyesinde), yukarıda açıklanan dikey çizginin üzerine yazılır.

Giriş ve çıkış

Girişi STDIN aracılığıyla veya eşdeğer bir yöntem kullanarak okuyabilirsiniz . Sen bulunmadığını varsayalım olabilir boş satır ve o son satır biter geçmesi gerekebilir veya yeni satır karakteriyle, bitmez. Nesne adlarının yazdırılabilir ASCII karakterlerinden (boşluk içermeyen) oluştuğunu varsayabilirsiniz . Bir hedef tanımındaki nesnelerin tek bir boşluk karakteriyle ayrıldığını ve baştaki ya da sondaki boşluk olmadığını varsayabilirsiniz . Her hedefin en fazla bir defa tanımlanmış olduğunu ve bağımlılık listesinde tekrarlama olmadığını kabul edebilirsiniz .

Çıkışı STDOUT'a yazabilir veya eşdeğer bir yöntem kullanabilirsiniz . En uzun olanlar hariç tüm çıkış hatları sondaki boşlukları içerebilir. Son çıkış satırı yeni satır karakteriyle bitebilir veya bitmeyebilir.

Gol

Bu kod golfü . En kısa cevap bayt cinsinden kazanır.

Test Kılıfları

Programınız aşağıdaki test durumlarının her birini makul bir süre içinde işlemelidir.


Giriş

Depender Dependee
Independent

Çıktı

Depender
+-Dependee
Independent

Giriş

Earth Turtle
Turtle Turtle

Çıktı

Earth
+-Turtle
  +-Turtle ...

Giriş

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

Çıktı

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

Medeniyet V Teknoloji Ağacı

Giriş

Çıktı


Cygwin syslog-ng Paket Bağımlılık Grafiği

Giriş

Çıktı


GNU grep regex.cÇağrı Grafiği

Giriş

Çıktı (Hata! SE'nin üstesinden gelmek için çok uzun.)


5
İyi belirlenmiş!
Charles,

Düğüm sırası bölümündeki öz referans başımı ağrıtıyor.
özyinelemeli

Yanıtlar:


5

Haskell, 512 bayt

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'da çevrimiçi yayın


Tebrikler. Çok hoş!
Ell
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.