我需要编写一个程序来制作给定字符的所有排列,然后只打印有意义的单词(根据字典)
操作系统:Linux(Centos5)
答案 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)
不要重新发明方向盘: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