【AtCoder】AtCoder Daily Training
EASY 2026/04/28 18:00start

関連記事

1. A – First Grit

2×2のグリッドなので、黒が3以上なら無条件で隣接します。
あとは、黒が2個で (0,0)と(1,1)が同じ色(白または黒)のときだけ隣接します。

(defun black-connected-p (lst)
  (or (>= (count #\# lst) 3)
      (char/= (elt lst 0) (elt lst 3))))


;; (char-list '("##" ".#"))
(defun char-list (lines)
  (loop for str in lines
	append (loop for ch across str
		     collect ch)))

(defun yesno (c)
  (if c "Yes" "No"))

(defun main()
  (let* ((lines (list (read-line) (read-line))))
    (princ (yesno (black-connected-p (char-list lines))))))

(main)Code language: Lisp (lisp)
1. A – First Grit

2. B – Similar String

似ている文字という条件を、condで表現しました。
対応リストにしたらもっとすっきり書けたかも。

(defun similar-char-p (a b)
  (cond ((eql a b))
	((eql a #\1) (eql b #\l))
	((eql a #\l) (eql b #\1))
	((eql a #\0) (eql b #\o))
	((eql a #\o) (eql b #\0))
	(t nil)))

;; (similar-string-p "hello" "he1l0")
(defun similar-string-p (sa sb)
  (loop for i below (length sa)
	always (similar-char-p (char sa i) (char sb i))))

(defun yesno (c)
  (if c "Yes" "No"))

(defun main ()
  (let* ((nn (read))
	 (ss (read-line))
	 (st (read-line)))
    (declare (ignore nn))
    (princ (yesno (similar-string-p ss st)))))

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

3. C – You’re a teapot

文字列ごとのt充填率を計算して、部分文字列全体で最大値を求めます。

(defun tea-rate (tt)
  (let* ((len (length tt)))
    (cond ((and (>= len 3)
		(char= #\t (char tt 0) (char tt (1- len))))
	   (float (/ (- (count #\t tt) 2) (- len 2))))
	  (t 0))))

(defun max-tea-rate (s)
  (loop for i below (length s)
	maximize (loop for j from (1+ i) to (length s)
		  maximize (tea-rate (subseq s i j)))))

(defun main ()
  (princ (max-tea-rate (read-line))))

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

ただし、これでは不正解 21でした。

3. C – You’re a teapot

3.1. コード2(倍精度小数点数)

どうも、floatでは、精度が足りていないようです。

出力された値と真の値との絶対誤差が 10−9 以下のとき、正答と判定される。

そこで、分数を倍精度小数点数に変換しました。
出力では、末尾にd0を付けないように format t “~f”を使いました。

(defun tea-rate (tt)
  (let* ((len (length tt)))
    (cond ((and (>= len 3)
		(char= #\t (char tt 0) (char tt (1- len))))
	   (coerce (/ (- (count #\t tt) 2) (- len 2)) 'double-float))
	  (t 0d0))))

(defun max-tea-rate (s)
  (loop for i below (length s)
	maximize (loop for j from (1+ i) to (length s)
		  maximize (tea-rate (subseq s i j)))))

(defun main ()
  (format t "~f" (max-tea-rate (read-line))))

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

時間切れになってしまいましたが、無事に正解しました。

3.1. コード2(倍精度小数点数)
3.1. コード2(倍精度小数点数)