我對Common Lisp和Lisp是一個全新的概念。我有一個使用Common Lisp編寫的任務,甚至無法知道如何開始。我的程序將從1到9的字符串格式的數字,他們將有一個字拼寫錯誤,但正確的長度;例如:在Common Lisp中將拼寫錯誤的文本轉換爲整數?
too -> 2
threa -> 3
等等。當我給出錯誤的文本時,我需要打印整數,我真的不知道如何開始。任何幫助,將不勝感激。
在此先感謝。
我對Common Lisp和Lisp是一個全新的概念。我有一個使用Common Lisp編寫的任務,甚至無法知道如何開始。我的程序將從1到9的字符串格式的數字,他們將有一個字拼寫錯誤,但正確的長度;例如:在Common Lisp中將拼寫錯誤的文本轉換爲整數?
too -> 2
threa -> 3
等等。當我給出錯誤的文本時,我需要打印整數,我真的不知道如何開始。任何幫助,將不勝感激。
在此先感謝。
聽起來很有趣:-)
讓我們做平常Lisp的方式 - 通過增長語言來解決問題。
問題是:將字符串與字典進行匹配,以至多允許一個拼寫錯誤。
這裏是字典:
(defparameter *dictionary*
(loop for i from 1 to 9 collect (cons (format nil "~R" i) i)))
這一切意味着什麼,兩個字符串相匹配?
(defun diff (s1 s2)
"Count the number of differences in the shortest common start."
(loop for c1 across s1
for c2 across s2
sum (if (char= c1 c2) 0 1)))
(diff "abc" "abcde")
==> 0
(diff "abc" "aba")
==> 1
現在匹配:
(defun matchp (s1 s2)
"Two strings match iff they have the same length and 1 different character."
(and (= (length s1)
(length s2))
(= 1 (diff s1 s2))))
(matchp "a" "b")
==> T
(matchp "too" "two")
==> T
(matchp "one" "one")
==> NIL
最後,找到字符串中的詞典:
(defun parse-string (s)
(loop for (name . number) in *dictionary*
if (matchp name s) return number))
(parse-string "one")
==> NIL ; not found
(parse-string "onn")
==> 1
(parse-string "too")
==> 2
(parse-string "thre3")
==> 3
(parse-string "foor")
==> 4
(parse-string "fivv")
==> 5
(parse-string "sis")
==> 6
(parse-string "sever")
==> 7
(parse-string "aight")
==> 8
(parse-string "nane")
==> 9
PS。我使用了相當先進的loop
工具:如果這是家庭作業,您可能不會使用它,所以您將不得不使用更簡單的成語來重寫我的代碼。
好的入門書免費下載PDF版:https://www.cs.cmu.edu/~dst/LispBook/ –
我稍後會看看這本書。感謝您的推薦 – plank223