1. A – ABC400 Party
割り切れるかどうかを判定し、割り切れるなら商を、そうでなければ -1 を返します。
(defun party-p (n a)
(if (= (mod n a) 0)
(floor n a)
-1))
(defun main ()
(princ (party-p 400 (read))))
#-swank(main)Code language: Lisp (lisp)

2. B – Contest Result
配点と解いた問題の一覧から、総得点を計算しました。
(defun total-point (An Bm)
(loop for i across (remove-duplicates Bm)
sum (aref An (1- i))))
(defun read-fixnums (N)
(loop with vec = (make-array N :element-type 'fixnum)
for i below N
do (setf (aref vec i) (read))
finally (return vec)))
(defun main ()
(let* ((N (read))
(M (read))
(An (read-fixnums N))
(Bm (read-fixnums M)))
(princ (total-point An Bm))))
#-swank(main)
Code language: Lisp (lisp)

3. C – log2(N) (WA2)
整数値での対数を計算します。
(defun log2n (n)
(floor (log n 2)))
(defun main ()
(princ (log2n (read))))
#-swank(main)Code language: Lisp (lisp)

3.1. 整数で計算した
小数誤差の問題があったようなので、整数値で計算しました。
(defun log2n/time (n)
(loop with x = n
for i from 0
while (> x 1)
do (setf x (floor x 2))
finally (return i)
))
(defun main ()
(princ (log2n/time (read))))
#-swank(main)Code language: Lisp (lisp)

4. D – Fibonacci Reversed
数字の各桁を逆転させる操作があります。
(defun f-rev (n)
(list->num (reverse (num->list n))))
(defun num->list (n)
(loop with x = n
while (> x 0)
collect (mod x 10)
do (setf x (floor x 10))))
(defun list->num (lst)
(loop for n in lst
for i from 0
sum (* n (expt 10 i))))
(defun fib-rev (n dp x y)
(cond ((gethash n dp))
((= n 1) x)
((= n 2) y)
(t (setf (gethash n dp)
(f-rev (+ (fib-rev (- n 1) dp x y)
(fib-rev (- n 2) dp x y)))))))
(defun main ()
(princ (fib-rev 10 (make-hash-table) (read) (read))))
#-swank(main)
Code language: Lisp (lisp)

5. E – Many Balls
数字を + 1 と * 2 を組み合わせて作る問題です。
2進数表示にしてから、操作順序を決めます。
(defun num->bits (n)
(loop with x = n
while (> x 0)
collect (mod x 2)
do (setf x (floor x 2))))
(defun big-endian-bits (n)
(reverse (num->bits n)))
(defun magic-list (n)
(loop for bit in (big-endian-bits n)
with stack = nil
when (= bit 1)
do (push #\A stack)
do (push #\B stack)
finally (pop stack)
(return (coerce (reverse stack) 'string)) ))
(defun main ()
(princ (magic-list (read))))Code language: Lisp (lisp)

最後は7分オーバーの時間切れで、4問正解でした。

