我需要编写一个程序来对给定字符进行所有排列,然后只打印有意义的单词(根据字典)
操作系统:Linux (Centos5)
我通过形成不同的排列来尝试这个,如果长度达到可能的长度..然后它在 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
不要重新发明轮子:tcllib包struct::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