Best shuffle: Difference between revisions

→‎{{header|Common Lisp}}: new version using simple loops
(→‎{{header|Common Lisp}}: DEFUN is not there to define self recursive local functions. Use LABELS.)
(→‎{{header|Common Lisp}}: new version using simple loops)
Line 1,011:
 
=={{header|Common Lisp}}==
<lang lisp>(defun count-equal-chars (string1 string2)
(loop for c1 across string1 and c2 across string2
count (char= c1 c2)))
 
(defun shuffle (string)
(let ((length (length string))
(result (copy-seq string)))
(dotimes (i length)
(dotimes (j length)
(when (and (/= i j)
(char/= (aref string i) (aref result j))
(char/= (aref string j) (aref result i)))
(rotatef (aref result i) (aref result j)))))
result))
(defun best-shuffle (list)
(dolist (string list)
(let ((shuffled (shuffle string)))
(format t "~%~a ~a (~a)"
string
shuffled
(count-equal-chars string shuffled)))))
 
(best-shuffle '("abracadabra" "seesaw" "elk" "grrrrrr" "up" "a"))</lang>
Output:
abracadabra caadrbabaar (0)
seesaw ewaess (0)
elk kel (0)
grrrrrr rgrrrrr (5)
up pu (0)
a a (1)
 
===Version 2===
 
<lang lisp>(defun all-best-shuffles (str)
(let (tbl out (shortest (length str)) (s str))
Line 1,057 ⟶ 1,091:
(dolist (s (list "abracadabra" "seesaw" "elk" "grrrrrr" "up" "a"))
(format t "~A: ~A~%" s (best-shuffle s)))
 
</lang>
Output:
Anonymous user