İkili ağacın en derin düğümünü bulun


9

İkili ağacı girdi olarak alan ve en derin düğümü ve derinliğini çıkaran bir program yazın. Bir kravat varsa, ilgili tüm düğümleri ve derinliklerini yazdırın. Her düğüm şu şekilde temsil edilir:

T(x,x)

T(x)

T

burada Tbir veya daha fazla alfasayısal karakterin tanımlayıcısı ve her xbiri başka bir düğümdür.

İşte bir ikili ağacın basit bir tanımı:

  • İkili ağacın başında bir düğüm bulunur.
  • İkili ağaçtaki bir düğümün en fazla iki çocuğu vardır.

Örneğin, giriş A(B(C,D(E)))(aşağıda) çıkacaktır 3:E.

Ağaç 1

Aşağıdaki ağaç 5, 11 ve 4 arasında üç yönlü bir bağ ve derinlikleri de 3'tür (0'dan başlayarak):

Giriş 2(7(2,6(5,11)),5(9(4)))(aşağıda) çıkacaktır 3:5,11,4.

Ağaç 2

Bu kod golf, bu nedenle bayt cinsinden ölçülen en kısa kod kazanır.


@ yakın seçmen: Ne hakkında net değilsiniz?
Jwosty

3
Belki de hiçbir girdi veya çıktı belirtimi veya bu girdiler ve çıktılar için test senaryoları olmaması.
Kapı tokmağı

Düzeltmeye çalışıyorum ama telefonum berbat ...: P ama olsa daha iyidir.
Jwosty

3
İlk ağaç A (B (C, D (E))
olmamalı

1
@ bakerg doğru, benim hatam. Sabit.
Jwosty

Yanıtlar:


6

CJam, 49 47

0q')/{'(/):U;,+:TW>{T:W];}*TW={U]',*}*T(}/;W':@

 

0                 " Push 0 ";
q                 " Read the whole input ";
')/               " Split the input by ')' ";
{                 " For each item ";
  '(/             " Split by '(' ";
  )               " Extract the last item of the array ";
  :U;             " Assign the result to U, and discard it ";
  ,               " Get the array length ";
  +               " Add the top two items of the stack, which are the array length and the number initialized to 0 ";
  :T              " Assign the result to T ";
  W>{             " If T>W, while W is always initialized to -1 ";
    T:W];         " Set T to W, and empty the stack ";
  }*
  TW={            " If T==W ";
    U]',*         " Push U and add a ',' between everything in the stack, if there were more than one ";
  }*
  T(              " Push T and decrease by one ";
}/
;                 " Discard the top item, which should be now -1 ";
W                 " Push W ";
':                " Push ':' ";
@                 " Rotate the 3rd item to the top ";

Çıktı biçiminde tutarlı ve daha az belirsiz hale getirmek için küçük bir değişiklik yaptım, ancak çok fazla rahatsızlık vermemeli.
Jwosty

@Jwosty Eğer bu kod-golf değilse yapmamalı.
jimmy23013 26:14

Eh, bu ise :) kod golf ... Ama yine de, güzel gönderme
Jwosty

Bunun nasıl çalıştığını açıklayabilir misiniz?
Jerry Jeremiah

@JerryJeremiah Düzenlendi.
jimmy23013

5

Haskell, 186 bayt

p@(n,s)%(c:z)=maybe((n,s++[c])%z)(\i->p:(n+i,"")%z)$lookup c$zip"),("[-1..1];p%_=[p]
(n,w)&(i,s)|i>n=(i,show i++':':s)|i==n=(n,w++',':s);p&_=p
main=interact$snd.foldl(&)(0,"").((0,"")%)

Tam program, ağaç alır stdin, spesifikasyon çıktı formatı üretir stdout:

& echo '2(7(2,6(5,11)),5(9(4)))' | runhaskell 32557-Deepest.hs 
3:5,11,4

& echo 'A(B(C,D(E)))' | runhaskell 32557-Deepest.hs 
3:E

Golf'd kodu kılavuzu (daha iyi adlar, tip imzaları, yorumlar ve bazı alt ifadeler çıkarıldı ve adlandırıldı - ancak aksi takdirde aynı kod; bir ungolf'd sürümü numaralandırma ile düğümlere girmeyi veya en derinleri bulmayı karıştırmaz. çıktı biçimlendirmesi ile.) :

type Label = String         -- the label on a node
type Node = (Int, Label)    -- the depth of a node, and its label

-- | Break a string into nodes, counting the depth as we go
number :: Node -> String -> [Node]
number node@(n, label) (c:cs) =
    maybe addCharToNode startNewNode $ lookup c adjustTable
  where
    addCharToNode = number (n, label ++ [c]) cs
        -- ^ append current character onto label, and keep numbering rest

    startNewNode adjust = node : number (n + adjust, "") cs
        -- ^ return current node, and the number the rest, adjusting the depth

    adjustTable = zip "),(" [-1..1]
        -- ^ map characters that end node labels onto depth adjustments
        -- Equivalent to [ (')',-1), (',',0), ('(',1) ]

number node _ = [node]      -- default case when there is no more input

-- | Accumulate into the set of deepest nodes, building the formatted output
deepest :: (Int, String) -> Node -> (Int, String)
deepest (m, output) (n, label)
    | n > m     = (n, show n ++ ':' : label)    -- n is deeper tham what we have
    | n == m    = (m, output ++ ',' : label)    -- n is as deep, so add on label
deepest best _ = best                           -- otherwise, not as deep

main' :: IO ()
main' = interact $ getOutput . findDeepest . numberNodes
  where
    numberNodes :: String -> [Node]
    numberNodes = number (0, "")

    findDeepest :: [Node] -> (Int, String)
    findDeepest = foldl deepest (0, "")

    getOutput :: (Int, String) -> String
    getOutput = snd

1
Bu kod beni korkutuyor.
seequ

Genişletilmiş açıklayıcı kod eklendi! Terörün seni güçlendirmesine izin ver !!
MtnViewMark

Bunun için + 1'i hak ediyorsun.
seequ

Aman tanrım, ve listelerle mücadele ediyorum: P
Artur Trapp

4

GolfScript (75 karakter)

Özellikle rekabetçi değil, ancak biraz ilgisi olduğu konusunda yeterince bükülmüş:

{.48<{"'^"\39}*}%','-)](+0.{;.@.@>-\}:^;@:Z~{2$2$={@@.}*;}:^;Z~\-])':'@','*

Kodun üç aşaması vardır. Öncelikle giriş dizesini önceden işleriz:

# In regex terms, this is s/([ -\/])/'^\1'/g
{.48<{"'^"\39}*}%
# Remove all commas
','-
# Rotate the ' which was added after the closing ) to the start
)](+

Biz örneğin dönüştürdü ettik A(B(C,D(E)))için 'A'^('B'^('C'^'D'^('E'^)''^)''^). Eğer uygun bir blok atarsak, dizeyi değerlendirmek için ^kullanarak faydalı işlemler yapabiliriz ~.

İkincisi, maksimum derinliği buluyoruz:

0.
# The block we assign to ^ assumes that the stack is
#   max-depth current-depth string
# It discards the string and updates max-depth
{;.@.@>-\}:^;
@:Z~

Sonunda en derin düğümleri seçip çıktıyı oluşturuyoruz:

# The block we assign to ^ assumes that the stack is
#   max-depth current-depth string
# If max-depth == current-depth it pushes the string under them on the stack
# Otherwise it discards the string
{2$2$={@@.}*;}:^;
# Eval
Z~
# The stack now contains
#   value1 ... valuen max-depth 0
# Get a positive value for the depth, collect everything into an array, and pop the depth
\-])
# Final rearranging for the desired output
':'@','*

1

Perl 5-85

Karakter sayısını düzeltmek için lütfen bu gönderiyi düzenlemekten çekinmeyin. Kullandığım sayözelliği, ama açıklanmadan doğru çalışmasını sağlamak için bayraklar hakkında bilmiyorum use 5.010;.

$_=$t=<>,$i=0;$t=$_,$i++while s/\w+(\((?R)(,(?R))?\))?/$1/g,/\w/;@x=$t=~/\w+/gs;say"$i:@x"

İdeone hakkında demo

Çıktı virgülle ayrılmış yerine boşlukla ayrılmıştır.

Kod, ormandaki ağaçların kökünü kaldırmak mümkün olmayana kadar özyinelemeli normal ifadeyi kullanır. Sonra sondan önceki dize tüm yaprak düğümlerini en derin düzeyde içerecektir.

Örnek çalışmalar

2
0:2

2(3(4(5)),6(7))
3:5

2(7(2,6(5,11)),5(9(4)))
3:5 11 4

1(2(3(4,5),6(7,8)),9(10(11,12),13(14,15)))
3:4 5 7 8 11 12 14 15

1

VB.net

Function FindDeepest(t$) As String
  Dim f As New List(Of String)
  Dim m = 0
  Dim d = 0
  Dim x = ""
  For Each c In t
    Select Case c
      Case ","
        If d = m Then f.Add(x)
        x = ""
      Case "("
        d += 1
        If d > m Then f.Clear() :
        m = d
        x = ""
      Case ")"
        If d = m Then f.Add(x) : x = ""
        d -= 1
      Case Else
        x += c
    End Select
  Next
  Return m & ":" & String.Join(",", f)
End Function

Varsayım: Düğüm Değerler içeremez ,, (,)


1
Bu hiç golf gibi görünmüyor. O boşlukların çoğunu kaldıramıyor musunuz (VB bilmiyorum)?
seequ

Beyaz alanın bir kısmına bağlı olarak önemlidir.
Adam Speight

1

Javascript (E6) 120

Yinelemeli sürüm

m=d=0,n=[''];
prompt().split(/,|(\(|\))/).map(e=>e&&(e=='('?m<++d&&(n[m=d]=''):e==')'?d--:n[d]+=' '+e));
alert(m+':'+n[m])

Kurtulmamış ve test edilebilir

F= a=> (
    m=d=0,n=[''],
    a.split(/,|(\(|\))/)
    .map(e=>e && (e=='(' ? m < ++d && (n[m=d]='') : e==')' ? d-- : n[d]+=' '+e)),
    m+':'+n[m]
)

Firefox konsolunda test et :

['A', '2(7(2,6(5,11)),5(9(4)))', 'A(B(C,D(E)))']
.map(x => x + ' --> ' + F(x)).join('\n')

Çıktı

"A -> 0: A

2 (7 (2,6 (5,11)), 5 (9 (4))) -> 3: 5 11 4

A (B (C, D (E))) -> 3: E "

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.