1

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

操作系统:Linux (Centos5)

4

2 回答 2

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
于 2013-10-08T11:19:03.707 回答
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 
于 2013-10-08T14:39:30.343 回答