Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
|
|
@ -0,0 +1,47 @@
|
|||
import sequtils, strutils
|
||||
|
||||
type
|
||||
Kind = enum kValue, kList
|
||||
Node = ref object
|
||||
case kind: Kind
|
||||
of kValue: value: int
|
||||
of kList: list: seq[Node]
|
||||
|
||||
|
||||
proc newTree(s: varargs[int]): Node =
|
||||
## Build a tree from a list of level values.
|
||||
var level = 1
|
||||
result = Node(kind: kList)
|
||||
var stack = @[result]
|
||||
for n in s:
|
||||
if n <= 0:
|
||||
raise newException(ValueError, "expected a positive integer, got " & $n)
|
||||
let node = Node(kind: kValue, value: n)
|
||||
if n < level:
|
||||
# Unstack lists.
|
||||
stack.setLen(n)
|
||||
level = n
|
||||
else:
|
||||
while n > level:
|
||||
# Create intermediate lists.
|
||||
let newList = Node(kind: kList)
|
||||
stack[^1].list.add newList
|
||||
stack.add newList
|
||||
inc level
|
||||
# Add value.
|
||||
stack[^1].list.add node
|
||||
|
||||
|
||||
proc `$`(node: Node): string =
|
||||
## Display a tree using a nested lists representation.
|
||||
if node.kind == kValue: $node.value
|
||||
else: '[' & node.list.mapIt($it).join(", ") & ']'
|
||||
|
||||
|
||||
for list in [newSeq[int](), # Empty list (== @[]).
|
||||
@[1, 2, 4],
|
||||
@[3, 1, 3, 1],
|
||||
@[1, 2, 3, 1],
|
||||
@[3, 2, 1, 3],
|
||||
@[3, 3, 3, 1, 1, 3, 3, 3]]:
|
||||
echo ($list).align(25), " → ", newTree(list)
|
||||
Loading…
Add table
Add a link
Reference in a new issue