Haskell、186バイト
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,"")%)
完全なプログラムは、ツリーをに取りstdin
、以下に指定された出力フォーマットを生成します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
ゴルフ用のコードへのガイド(より適切な名前、型のシグネチャ、コメント、およびいくつかの部分式が追加され、名前が付けられていますが、それ以外は同じコードです。ゴルフされていないバージョンでは、ノードへの分割が番号付けと混同されることはなく、最も深い検索も行われません。出力フォーマットあり。):
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