在LispWorks中进行编程20:字谜
Category:UI界面编写字谜
在这个项目中,我们编写了一个解字谜的工具,用于解决填字游戏和其他文字游戏。
它允许您输入一个单词或一组字母:
然后显示这些字母的所有字谜:
完整列表
描述
我们的出发点是英国英语单词的免费字典。其中一些可在网上获得; 我选择的那个包含60388个单词,包括复数,但不是缩写或专有名词,如地名。
字典开始:
(“aah” “aardvark” “aardvarks” “abacus” “abacuses” “abalone” …
并结束于:
… “zooms” “zoos” “zucchini” “zucchinis” “zydeco” “zygote” “zygotes”)
你可以在这里下载:
我们使用以下例程将字典读入变量wordlist:
(defparameter wordlist (with-open-file (stream (capi:prompt-for-file “Wordlist:” :operation :open)) (read stream)))
制作哈希表- make-hash-table
anagram程序将使用一种新类型的Lisp对象,称为哈希表。这是一种存储数据的有效方式,由称为密钥的值索引。密钥可以是任何类型的Lisp对象,例如数字或字符串,并指定用于比较哈希表中的键的测试。
在这个应用程序中,键将是字符串,我们使用以下命令定义名为dict的哈希表:
(defparameter dict (make-hash-table :test ‘string=))
这指定应使用string =函数来比较密钥 。
读取和更改哈希表条目- gethash
我们可以通过写入来从哈希表中读取“cat”条目的值:
CL-USER > (gethash “cat” dict)NILNIL
两个NIL值用于区分空条目和已设置为NIL的条目。
要更改“cat”的哈希表条目,我们会写:
CL-USER > (setf (gethash “cat” dict) “maiou”)”maiou”
我们可以查看它的新值:
CL-USER > (gethash “cat” dict)”maiou”T
anagram程序如何运作
anagram程序将首先使用排序字程序对每个单词进行排序,使其字母按字母顺序排列:
(defun sorted (word) (sort (copy-seq word) ‘char<))
请注意,排序 过程具有破坏性,因此我们必须使用copy-seq在排序之前复制我们要排序的单词。我们使用的比较是char <,字符串等效于string <。
这样做的原因是两个字谜将具有相同的排序表示:
CL-USER > (sorted “orchestra”)”acehorrst”CL-USER > (sorted “carthorse”)”acehorrst”
我们将使用每个单词的排序版本作为关键字将单词列表中的所有单词存储到散列表中。因此,在关键字“acehorrst”下将是具有该排序表示的单词列表:
CL-USER > (gethash “acehorrst” dict)(“orchestra” “carthorse”)T
这是向anagram字典添加单词的过程:
(defun add-word (word) (let* ((sword (sorted word))) (setf (gethash sword dict) (cons word (gethash sword dict)))))
它使用cons将单词添加到已存储在排序键下的任何单词上。
我们这样称它来创建字典:
(defun add-words-to-dict (wlist) (if (null wlist) nil (let ((word (first wlist))) (add-word word) (add-words-to-dict (rest wlist)))))
这就像我们在定义程序中写 的例行总结列表。它沿着列表wlist,将每个单词添加到哈希表dict中。要调用它,我们执行:
(add-words-to-dict wordlist)
使用anagram-solving工具
现在我们准备使用anagram字典来解决字谜了。首先是一个解决字谜的程序:
(defun find-anagram (word) (gethash (sorted word) dict))
最后,一个提示输入字符串的交互式工具,然后显示一个字谜列表:
(defun anagram () (capi:prompt-with-list (find-anagram (capi:prompt-for-string “Find anagram:”)) “Anagrams”))
我们运行这个:
(anagram)
扩展项目
您还可以使用anagram字典来编写单词游戏,如Countdown,找到具有最多字谜的单词,或查找整个短语的字谜。
http://mip.i3geek.com