【AtCoder】AtCoder Daily Training
EASY 2026/04/27 16:00start

関連記事

1. A – When?

Dateオブジェクトのようなものがあるかわからなかったので、雑にコンスセルで実装しました。
100までだから答えられますが、もっと数字が多いとダメですね。

(defun solve (k)
  (cons (+ 21 (floor k 60)) (mod k 60)))

(defun write-time (pair)
  (format t "~2,'0d:~2,'0d" (car pair) (cdr pair)))

(defun main ()
  (let ((k (read)))
    (write-time (solve k))))

#-swank(main)Code language: PHP (php)
1. A – When?

2. B – Balloon Trip

これは、切り捨ての割り算と未満の条件を比較すれば、すぐに解けました。

(defun main ()
  (let* ((W (read))
	 (B (read)))
    (princ (balloon-trip W B))))

(defun balloon-trip (W B)
  (let* ((Wg (* 1000 W))
	 (n (floor Wg B)))
    (cond ((< Wg (* n B)) n)
	  (t (1+ n)))))

#-swank(main)
Code language: CSS (css)
2. B – Balloon Trip

3. C – Grid Rotation

まず、文字列からグリッドを作ります。
. -> 0 # -> 1 に対応させた二次元配列にします。

(defun make-grid (N Sn)
  (let ((grid (make-array (list N N)
			    :element-type 'bit
			    :initial-element 0)))
    (loop for line in Sn
	  for row below N
	  do (loop for ch across line
		   for col below N
		   when (eql ch #\#)
		     do (setf (aref grid row col) 1))
	  finally (return grid)) ))Code language: Lisp (lisp)

2つのグリッドの違いをそのままカウントします。

(defun difference-of-grids (N G1 G2)
  (loop for row below N
	summing (loop for col below N
		      count (/= (aref G1 row col)
				(aref G2 row col)))))Code language: Lisp (lisp)

グリッドを右に90度反転させます。
図で書いて確認すると (row, col) <- (N-col-1, row) に対応していました。

(defun rotate-right-grids (N grid)
  (let ((result (make-array (list N N)
			    :element-type 'bit
			    :initial-element 0)))
    (loop for row below N
	  do (loop for col below N
		   do (setf (aref result row col)
			    (aref grid (- N col 1) row)))
	  finally (return result))))Code language: Lisp (lisp)

最後は、最小の操作回数ですが、これはもっとも差が小さい回転を選んでから、あとは差の分を変換するので、3回転して、最小のケースを求めます。
このときに、回転もカウントされるので、その分は足しています。

(defun best-rotation (N G1 G2)
  (loop for r from 1 to 3
	with result = (difference-of-grids N G1 G2)
	with Gx = (rotate-right-grids N G1)
	do (progn
	     (setf result
		   (min (+ r (difference-of-grids N Gx G2))
			result))
	     (setf Gx (rotate-right-grids N Gx)))
	finally (return result)))

(defun main ()
  (let* ((N (read))
	 (Sn (loop repeat N collect (read-line)))
	 (Tn (loop repeat N collect (read-line)))
	 (G1 (make-grid N Sn))
	 (G2 (make-grid N Tn))
	 )
    (princ (best-rotation N G1 G2))))

#-swank(main)
Code language: Lisp (lisp)
3. C – Grid Rotation

Cは、時間切れでした。
Aで時間を使い過ぎましたね。

3. C – Grid Rotation