Let's write β

プログラミング中にできたことか、思ったこととか

ICPC2012 Problem B

さて、ひきつづき、問題Bです。
こちらも、乱暴な事ができるLispの出番です。

(defun convert-to-zero-filled-str (num len)
  (format nil "~v,'0,,D" len num))

(defun next-num (num len)
  (let*
      ((num-str (convert-to-zero-filled-str num len))
       (max-num (parse-integer (sort num-str #'> :key #'char-code)))
       (mix-num  (parse-integer (sort num-str #'< :key #'char-code))))
    (- max-num mix-num)))

(defun find-min-i (num len)
  (labels
      ((%find-min-i (num len i acc)
	 (if (member num acc)
	     (let ((j (position num (reverse acc))))
	       `(,j ,num ,(- i j)))
	     (%find-min-i (next-num num len) len (1+ i) (cons num acc)))))
    (%find-min-i num len 0 ())))

(defun main ()
  (loop
     for a0 = (read)
     for L  =  (read)
     until (and (zerop a0) (zerop L))
     do
       (format t "~{~A~^ ~}~%" (find-min-i a0 L))))

うん、こんな感じですかね。formatの制御文字がおもしろいのはいつもどおりですかね。