; 文字列を一度全て繋げる ; その後リストに矯正し group 化して最大個数を調べる ; 隣接する同一要素をまとめたリストをリスト化する ; (group '(1 2 2 1 2 2 1 1 1 1 2 2 1 2 2)) ; => ; ((1) (2 2) (1) (2 2) (1 1 1 1) (2 2) (1) (2 2)) (defun group (lst) (let ((result '()) (cur nil)) (dolist (c lst) (if (null cur) (setq cur (list c)) (if (equal c (car cur)) (push c cur) (progn (push (nreverse cur) result) (setq cur (list c)))))) (when cur (push (nreverse cur) result)) (nreverse result))) (defun main () ; 読み込んだ一行の文字列を組み合わせる (let* ((s (concatenate 'string (read-line) (read-line))) ; 休みがない場合は別に処理する ; このとき 0 を出力する (a (find #\o s))) (if a (princ ; リストの左から右へ2項ずつ最大値を求めながら走査していく (reduce #'max ; 各リストの長さを求める (map 'list #'length ; 平日のリストを除く (remove-if (lambda (cs) (char= (car cs) #\x)) ; 平日の連なりと休日の連なりを一つのリストにまとめ、それらをリスト化する関数 (group ; 文字列を強制的に一文字ずつのリストに変換する (coerce s 'list)))))) (princ 0))) (terpri)) (main)