Topological sort/Extracted top item: Difference between revisions

Content added Content deleted
m (→‎{{header|REXX}}: added/changed comments and whitespace, split a DO group statement.)
(Added Wren)
Line 1,229: Line 1,229:
round 3: des1
round 3: des1
round 4: top2
round 4: top2
</pre>

=={{header|Wren}}==
{{trans|Kotlin}}
{{libheader|Wren-llist}}
{{libheader|Wren-seq}}
<lang ecmascript>import "/llist" for DLinkedList
import "/seq" for Lst

var s = "top1, top2, ip1, ip2, ip3, ip1a, ip2a, ip2b, ip2c, ipcommon, des1, " +
"des1a, des1b, des1c, des1a1, des1a2, des1c1, extra1"

var deps = [
[ 0, 10], [ 0, 2], [ 0, 3],
[ 1, 10], [ 1, 3], [ 1, 4],
[ 2, 17], [ 2, 5], [ 2, 9],
[ 3, 6], [ 3, 7], [ 3, 8], [ 3, 9],
[10, 11], [10, 12], [10, 13],
[11, 14], [11, 15],
[13, 16], [13, 17],
]

var files = ["top1", "top2", "ip1"]

class Graph {
construct new(s, edges) {
_vertices = s.split(", ")
var nv = _vertices.count
_adjacency = List.filled(nv, null)
for (i in 0...nv) _adjacency[i] = List.filled(nv, false)
for (edge in edges) _adjacency[edge[0]][edge[1]] = true
_numVertices = nv
}

topLevels {
var result = []
// look for empty columns
for (c in 0..._numVertices) {
var outer = false
for (r in 0..._numVertices) {
if (_adjacency[r][c]) {
outer = true
break
}
}
if (!outer) result.add(_vertices[c])
}
return result
}

compileOrder(item) {
var result = DLinkedList.new()
var queue = DLinkedList.new()
queue.add(Lst.indexOf(_vertices, item))
while (!queue.isEmpty) {
var r = queue.removeAt(0)
for (c in 0..._numVertices) {
if (_adjacency[r][c] && !queue.contains(c)) queue.add(c)
}
result.prepend(_vertices[r])
}
return Lst.distinct(result.toList)
}
}

var g = Graph.new(s, deps)
System.print("Top levels: %(g.topLevels)")
for (f in files) System.print("\nCompile order for %(f): %(g.compileOrder(f))")</lang>

{{out}}
<pre>
Top levels: [top1, top2]

Compile order for top1: [extra1, des1c1, des1a2, des1a1, des1c, des1b, des1a, ip2c, ip2b, ip2a, ipcommon, ip1a, des1, ip2, ip1, top1]

Compile order for top2: [extra1, des1c1, des1a2, des1a1, des1c, des1b, des1a, ipcommon, ip2c, ip2b, ip2a, des1, ip3, ip2, top2]

Compile order for ip1: [extra1, ipcommon, ip1a, ip1]
</pre>
</pre>