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