【AtCoder ABC375B】Traveling Takahashi Problem(Common Lisp)

関連記事

1. 問題

2. コード

点(x, y)を表すデータ構造をリスト ‘(x y) にします。
移動コストは、差の2乗の和の平方根です。

;; p, q are points (x y) (x y)
(defun move-cost (p q)
  (declare (type list p q))
  (sqrt (+ (square (- (car p) (car q)))
	   (square (- (cadr p) (cadr q)))
	   0.0l0)))

(defun square (x)
  (* x x))Code language: Lisp (lisp)

リストから分配束縛で順に2つの点を取って、計算していきます。
最初と最後には、(0, 0)の点を追加しておきます。

(defun total-move-cost (lst)
  (loop for (p q) on lst
	until (null q)
	sum (move-cost p q)))

(defun main ()
  (let* ((n (read))
	 (lst (loop for i from 0 to (1+ n)
		    if (or (= i 0) (= i (1+ n)))
		      collect (list 0 0)
		    else
		      collect (list (read) (read)))))
    (format t "~f" (total-move-cost lst))))

#-swank(main)Code language: Lisp (lisp)

全体は、