For a language whose brevity is much praised, this solution -
especially compared to the Perl one - is a bit long.  I suppose the
problem size has a lot to do with it.

On 11/3/06, Levi Pearson <[EMAIL PROTECTED]> wrote:
Someone wanted to see a Lisp solution.  Well, here's one:

;;;; A solution in Common Lisp to the mozy.com Deathmatch sample
question

(defun split-string (string char)
   "Returns a list of substrings of string delimited by the given
character"
   (loop for i = 0 then (1+ j)
         as j = (position char string :start i)
         collect (subseq string i j)
         while j))

(defun check (list)
   "Given a list of strings representing integers, return t when the
difference between every two adjacent integers has a magnitude
greater than 0 and less than the length of the list, and nil otherwise"
   (let ((n (length list)))
     (catch 'fail
       (reduce (lambda (x y)
                (let ((diff (abs (- (parse-integer x)
                                    (parse-integer y)))))
                  (unless (and (> diff 0)
                               (< diff n))
                    (throw 'fail nil))
                  y))
              list)
       t)))

(defun check-line (line)
   "Given a line of input, print 'match' if it matches the criteria
of the check predicate and 'not a match' otherwise"
   (if (check (split-string line #\Space))
       (format t "match~%")
       (format t "not a match~%")))

;; Check lines until the program is terminated
(loop (check-line (read-line)))


/*
PLUG: http://plug.org, #utah on irc.freenode.net
Unsubscribe: http://plug.org/mailman/options/plug
Don't fear the penguin.
*/


/*
PLUG: http://plug.org, #utah on irc.freenode.net
Unsubscribe: http://plug.org/mailman/options/plug
Don't fear the penguin.
*/

Reply via email to