用于打印所有字符排列和打印有意义单词的程序

时间:2013-10-08 11:11:28

标签: tcl permutation

我需要编写一个程序来制作给定字符的所有排列,然后只打印有意义的单词(根据字典)

操作系统:Linux(Centos5)

2 个答案:

答案 0 :(得分:3)

我通过形成不同的排列并且如果长度达到可能的长度来尝试这个...然后它在Linux中使用命令aspell检查字典中的单词

希望这是一个解决方案

set chars $argv
set ::len [llength $chars]
proc permutations items {
    set l [llength $items]
    if {[llength $items] < 2} {
        return $items
    } else {
        for {set j 0} {$j < $l} {incr j} {
            foreach subcomb [permutations [lreplace $items $j $j]] {
                lappend res [concat [lindex $items $j] $subcomb]
            }
        }
        foreach fe $res {
            if {[llength $fe] == $::len} {
                set wo [join $fe ""]
                set m [exec echo $wo | aspell -a]
                set m [split $m "\n"]
                if {[lindex $m 1] eq "*"} {
                    puts ">>>>>>>>>>>>>>> $wo"
                }
            }
        }
        return $res
    }
}

permutations $chars

答案 1 :(得分:2)

不要重新发明方向盘:tcllibstruct::list中有排列方法。

此外,通过将单个exec调用中的所有字词发送到aspell来优化性能。

package require struct::list

proc valid_words {words} {
    set aspell_results [lrange [split [exec aspell -a << $words] \n] 1 end-1]
    set ok {}
    for {set i 0} {$i < [llength $words]} {incr i} {
        if {[lindex $aspell_results $i] eq "*"} {
            lappend ok [lindex $words $i]
        }
    }
    return $ok 
}

set chars {t i m e}
set words [struct::list mapfor perm [struct::list permutations $chars] {join $perm ""}]
set valid [valid_words $words]
puts $valid                         ;# emit item mite time