Add anagram.lisp.
This commit is contained in:
		
							parent
							
								
									b4192e562a
								
							
						
					
					
						commit
						dcdacde831
					
				| 
						 | 
					@ -0,0 +1,41 @@
 | 
				
			||||||
 | 
					;;; anagram.lisp
 | 
				
			||||||
 | 
					;;; 2018-01-31
 | 
				
			||||||
 | 
					;;;
 | 
				
			||||||
 | 
					;;; Lisp implementation of this tweet:
 | 
				
			||||||
 | 
					;;;     https://twitter.com/fermatslibrary/status/958700402647674880.
 | 
				
			||||||
 | 
					;;;
 | 
				
			||||||
 | 
					;;; Fun fact: this uses the prime list generated by
 | 
				
			||||||
 | 
					;;;     (prime-numbers 26 3)
 | 
				
			||||||
 | 
					;;; using prime.rkt in the par/ toplevel directory. Why start at 3? It
 | 
				
			||||||
 | 
					;;; was a typo.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(defpackage #:anagram
 | 
				
			||||||
 | 
					  (:use #:cl)
 | 
				
			||||||
 | 
					  (:export #:anagram-p))
 | 
				
			||||||
 | 
					(in-package #:anagram)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(defun deconstruct (w)
 | 
				
			||||||
 | 
					  "Convert a string into a list of characters (instead of an array of
 | 
				
			||||||
 | 
					characters)."
 | 
				
			||||||
 | 
					  (loop for c across w collect c))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(defparameter *mapping*
 | 
				
			||||||
 | 
					  (pairlis
 | 
				
			||||||
 | 
					   (deconstruct "abcdefghijklmnopqrstuvwxyz")
 | 
				
			||||||
 | 
					   '(3 5 7 11 13 17 19 23 29 31 37 41 43 47
 | 
				
			||||||
 | 
					     53 59 61 67 71 73 79 83 89 97 101 103)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(defun lookup (c)
 | 
				
			||||||
 | 
					  "A hack to convert a character to its relevant prime."
 | 
				
			||||||
 | 
					  (cdr (assoc c *mapping*)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(defun word-number (word)
 | 
				
			||||||
 | 
					  "Convert a word to a number by multiplying the associated prime
 | 
				
			||||||
 | 
					number for all the letters in the word."
 | 
				
			||||||
 | 
					  (apply #'* (mapcar #'lookup
 | 
				
			||||||
 | 
							     (deconstruct (string-downcase word)))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(defun anagram-p (&rest words)
 | 
				
			||||||
 | 
					  "Given a list of words, return T if they are all anagrams of each
 | 
				
			||||||
 | 
					other."
 | 
				
			||||||
 | 
					   (apply #'= (mapcar #'word-number words)))
 | 
				
			||||||
		Loading…
	
		Reference in New Issue