Skip to content

Commit 417b368

Browse files
authored
Add Sleep Sort in Tcl (#5082)
1 parent d9949eb commit 417b368

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed

archive/t/tcl/sleep-sort.tcl

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package require Tcl 8.6
2+
3+
proc usage {} {
4+
puts stderr {Usage: please provide a list of at least two integers to sort in the format "1, 2, 3, 4, 5"}
5+
exit 1
6+
}
7+
8+
proc parseList {s} {
9+
set tokens [split [string trim $s] ","]
10+
if {[llength $tokens] < 2} { usage }
11+
12+
set result {}
13+
14+
set result {}
15+
foreach token $tokens {
16+
set t [string trim $token]
17+
if {$t eq "" || [catch {expr {int($t)}} val]} usage
18+
lappend result $val
19+
}
20+
return $result
21+
}
22+
23+
proc isSorted {lst} {
24+
set prev [lindex $lst 0]
25+
foreach x [lrange $lst 1 end] {
26+
if {$x < $prev} {return 0}
27+
set prev $x
28+
}
29+
return 1
30+
}
31+
32+
proc sleepSort {lst} {
33+
set ::sortedList {}
34+
set ::done 0
35+
36+
foreach num $lst {
37+
after [expr {$num * 10}] [list lappend ::sortedList $num]
38+
}
39+
40+
set max [lindex $lst 0]
41+
foreach n $lst {if {$n > $max} {set max $n}}
42+
43+
after [expr {$max * 10 + 50}] {set ::done 1}
44+
vwait ::done
45+
46+
return $::sortedList
47+
}
48+
49+
proc formatList {lst} { return [join $lst ", "] }
50+
51+
if {$argc != 1} { usage }
52+
53+
set numbers [parseList [lindex $argv 0]]
54+
set result [sleepSort $numbers]
55+
puts [formatList $result]
56+

0 commit comments

Comments
 (0)