干净,544个 506字节
转义用于避免SE / TIO上的无效UTF-8,但由于它们是有效的文字,因此被计为一个字节
import StdEnv,Data.List;::T=I Int|L[T];$l#m= @l#k=map maxList(transpose m)=flatlines[[last[' ':[(\_|v<0|w<[j]|q>hd w|q<last w|any((==)q)w|q==j='\305'='\302'|q==j='\301'='\304'='\277'='\332'='\263'=toChar v+'0')0\\[v,r,j:w]<-m|r/2==p&&q>=hd w&&q<=last w]]\\q<-[0..k!!3]]\\p<-[0..k!!1]];@(L l)#p=twice(\p=[[v,r+1:[e+sum([2\\[v:_]<-i|0<=v]++zipWith(\c j=j!!2-c!!3)t(takeWhile(\[z:_]=v+z< -1)(tl t)))-x!!1\\e<-x]]\\i<-inits p&t<-tails p&[v,r:x]<-p])(concatMap@l)#g=[g\\[_,2,g:_]<-p]=[[-1,0,(hd g+last g)/2:g]:p];@(I i)=[[i,0,0,0]];
在线尝试!
以以下格式输入 L[I 3, L[I 4, I 5], I 2]..
从下至上,从左到右连接树,然后从右到左调整距离。
美化,排序:
import StdEnv, Data.List;
:: T = I Int | L [T];
$ l
#m = @l
#k = map maxList (transpose m)
= flatlines [
[
last[
' ':
[
if(v < 0)
if(w < [j])
if(q > hd w)
if(q < last w)
if(any ((==) q) w)
(
if(q == j)
'\305'
'\302'
)(
if(q == j)
'\301'
'\304'
)
'\277'
'\332'
'\263'
(toChar v + '0')
\\ [v, r, j: w] <- m
| r/2 == p && q >= hd w && q <= last w
]
]
\\ q <- [0..k!!3]
]
\\p<-[0..k!!1]
];
@ (L l)
#p = twice
( \p
= [
[
v, r + 1:
map
(
(+)
(
sum [2 \\ [v: _] <- i| 0 <= v]
+ sum (
zipWith
(
\[_, _, _, c: _] [_, _, j: _] = j - c
)
t
(
takeWhile (\[v: _] = v < 0) (tl t)
)
) * (1 - sign (v + 1))
- x!!1
)
)
x
]
\\ i <- inits p
& t <- tails p
& [v, r: x] <- p
]
)
(concatMap @ l)
#g = [g \\ [_, 2, g: _] <- p]
=[[-1, 0, (hd g + last g)/2: g]: p];
@ (I i) = [[i, 0, 0, 0]];
[1,[[[2,3],4],5]]
可能是一个有趣的测试用例,因为它需要人为地扩展根,以便右子树不会与左子树发生冲突。