目前,我使用的是TCL 8.5。我有一个有规则分组的数字列表。如何按以下规则对其进行分组
{1 1 1 1} ==> "1*4"
{1 1 1 2 2 3} ==> "1*3,2*2,3"
{1 3 5 7 1 3 5 7} ==> "(1,3,5,7)*2"
由于
答案 0 :(得分:0)
这是一种方式:
proc rule list {
foreach item $list {
incr n($item)
}
join [lmap digit [lsort [array names n]] {
if {$n($digit) == 1} {
format %d $digit
} else {
format %d*%d $digit $n($digit)
}
}] ,
}
lmap
命令是Tcl 8.6,但它是backported到8.5。也可以在没有lmap
:
proc rule list {
foreach item $list {
incr n($item)
}
foreach digit [lsort [array names n]] {
if {$n($digit) == 1} {
lappend items [format %d $digit]
} else {
lappend items [format %d*%d $digit $n($digit)]
}
}
join $items ,
}
以上片段处理问题中的前两个案例。要处理所有情况,需要这样的事情:
proc rule list {
if {[llength $list] < 1} {
return
}
foreach item $list {
incr n($item)
}
foreach {item count} [array get n] {
lappend m($count) $item
}
foreach count [lsort -integer -decreasing [array names m]] {
if {[llength $m($count)] > 1} {
set item ([join [lsort $m($count)] ,])
} else {
set item $m($count)
}
if {$count > 1} {
append item *$count
}
lappend items $item
}
join $items ,
}
文档: < (operator), == (operator), > (operator), append, array, foreach, format, if, incr, join, lappend, list, llength, lmap (for Tcl 8.5), lmap, lsort, proc, return, set