$10K coding deathmatch

Daniel C. dcrookston at gmail.com
Fri Nov 3 10:03:40 MST 2006


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 <levi at cold.org> 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.
> */
>



More information about the PLUG mailing list