TCL集团按规则列出的号码

时间:2016-11-15 14:28:28

标签: algorithm tcl

目前,我使用的是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"

由于

1 个答案:

答案 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)appendarrayforeachformatifincrjoinlappendlistllengthlmap (for Tcl 8.5)lmaplsortprocreturnset