Wednesday, August 26, 2009

Euler Project 112


Working from left-to-right if no digit is exceeded by the digit to its left it is called an increasing number; for example, 134468.
Similarly if no digit is exceeded by the digit to its right it is called a decreasing number; for example, 66420.
We shall call a positive integer that is neither increasing nor decreasing a "bouncy" number; for example, 155349.
Clearly there cannot be any bouncy numbers below one-hundred, but just over half of the numbers below one-thousand (525) are bouncy. In fact, the least number for which the proportion of bouncy numbers first reaches 50% is 538.
Surprisingly, bouncy numbers become more and more common and by the time we reach 21780 the proportion of bouncy numbers is equal to 90%.
Find the least number for which the proportion of bouncy numbers is exactly 99%.

My Solution

(defun IsBouncyNumber(n)
  (let* ((numberstr (format nil "~a" n))
          (strlength (- (length numberstr) 2))
          (IsUp NIL)
          (IsDown NIL))
    (loop for i from 0 to strlength
           do(progn (if (> (char-int (elt numberstr i))
                                 (char-int (elt numberstr (+ i 1))))
                        (setq IsDown T)
                        (progn (if (< (char-int (elt numberstr i))
                                       (char-int (elt numberstr (+ i 1))))
                                  (setq IsUp T))))))
    (if (and IsDown IsUp)
        T
        NIL)))
(defun Euler112(n)
  (let ((constnum 99)
         (num 0)
         (currentnum 0))
    (loop for i from 100 to n
            do(progn (if (IsBouncyNumber i)
                              (progn (incf num)
                                        (setq currentnum i)))
                          (if (= 99 (/ (* num 100) i))
                              (return currentnum))))))

No comments:

Post a Comment