【AtCoder ADT】
文字列・浮動小数点・二次元配列
(EASY 2026/04/21 16:00)
(Common
Lisp)

関連記事

1. A – Append s

(defun solve (S)
  (concatenate 'string S "s"))

(defun main()
  (princ (solve (read-line))))

#-swank(main)
Code language: Lisp (lisp)
1. A – Append s

2. B – Horizon

精度を上げるために、double-floatにして計算し、出力時には末尾の d0 をなくすように、”~f”のフォーマットを使いました。

(defun horizon (x)
  (declare (type number x))
  (sqrt (* x (+ 12800000d0 x))))

(defun main ()
  (format t "~f" (horizon (read))))

#-swank(main)
Code language: Lisp (lisp)
2. B – Horizon

3. C – Vacation Together

縦に比較できるように、まずは二次元配列にデータを入れて、それから連続日数を取得しました。
いったん、連続日数をリストにしてから最大値を求めました。

(defun make-ok-days-2d (Sn)
  (declare (type list Sn))
  (let ((vec2d (make-array (list (length Sn) (length (car Sn)))
			    :element-type 'boolean
			    :initial-element t)))
    (loop for str in Sn
	  for mem from 0
	  do (loop for ch across str
		   for day from 0
		   do (setf (aref vec2d mem day)
			    (if (char= ch #\o) t nil)))
	  finally (return vec2d))))

(defun maximum-continual-ok-days (vec2d)
  (reduce #'max 
	  (loop for day below (array-dimension vec2d 1)
		with continued = 0
		if (loop for mem below (array-dimension vec2d 0)
			 always (aref vec2d mem day))
		  collect (incf continued)
		else
		  collect (setf continued 0))))

(defun main ()
  (let* ((N (read))
	 (D (read))
	 (Sn (loop repeat N collect (read-line))))
    (declare (ignore D))
    (princ (maximum-continual-ok-days
	     (make-ok-days-2d Sn)))))

#-swank(main)
#+swank(defparameter *Sn* '("xooox" "oooxx" "oooxo"))
Code language: PHP (php)
3. C – Vacation Together