87 lines
1.8 KiB
Plaintext
87 lines
1.8 KiB
Plaintext
bracketReport
|
|
=LAMBDA(bracketPair,
|
|
LAMBDA(s,
|
|
LET(
|
|
depths, SCANLCOLS(
|
|
LAMBDA(depth, charDelta,
|
|
depth + charDelta
|
|
)
|
|
)(0)(
|
|
codesFromBrackets(bracketPair)(
|
|
MID(s,
|
|
SEQUENCE(1, LEN(s), 1, 1),
|
|
1
|
|
)
|
|
)
|
|
),
|
|
overClosePosn, IFNA(MATCH(-1, depths, 0), 0),
|
|
|
|
IF(0 <> overClosePosn,
|
|
"Overclosed at char " & (overClosePosn - 1),
|
|
IF(0 <> LASTCOL(depths),
|
|
"Underclosed by end",
|
|
"OK"
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
|
|
testRandomBrackets
|
|
=LAMBDA(bracketPair,
|
|
LAMBDA(n,
|
|
LET(
|
|
sample, CONCAT(
|
|
bracketFromCode(bracketPair)(
|
|
RANDARRAY(1, n, -1, 1, TRUE)
|
|
)
|
|
),
|
|
|
|
APPENDCOLS(sample)(
|
|
bracketReport(bracketPair)(sample)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
|
|
bracketFromCode
|
|
=LAMBDA(bracketPairString,
|
|
LAMBDA(c,
|
|
IF(0 <> c,
|
|
IF(0 < c,
|
|
MID(bracketPairString, 1, 1),
|
|
MID(bracketPairString, 2, 1)
|
|
),
|
|
"x"
|
|
)
|
|
)
|
|
)
|
|
|
|
|
|
codesFromBrackets
|
|
=LAMBDA(bracketPair,
|
|
LAMBDA(s,
|
|
LAMBDA(c,
|
|
LET(
|
|
posn, IFERROR(
|
|
FIND(c, bracketPair),
|
|
0
|
|
),
|
|
|
|
rem, "0 for non-bracket chars, (1, -1) for (open, close)",
|
|
IF(0 <> posn,
|
|
IF(1 < posn, -1, 1),
|
|
0
|
|
)
|
|
)
|
|
)(
|
|
MID(s,
|
|
SEQUENCE(1, LEN(s), 1, 1),
|
|
1
|
|
)
|
|
)
|
|
)
|
|
)
|