(defparameter +alpha-chars+ "ABCDEFGHIJKLMNOPQRSTUVWXIZabcdefghijklmnopqrstuvwxiz") (defun odai-pt11-206 (s s-repeat fn &optional (preserve-newlines-p t)) (let ((s (format nil "~v@{~A~:*~}" s-repeat s)) (result '())) (do* ((n 1 (1+ n)) (col 1 (if (char= chr #\Newline) 1 (1+ col))) (chr #1=(and (< (1- n) (length s)) (char s (1- n))) #1#)) ((null chr) (concatenate 'string (nreverse result))) (let ((x (funcall fn n col chr))) (push (cond ((and (char= chr #\Newline) preserve-newlines-p) #\Newline) ((zerop (mod x 3)) (char +alpha-chars+ (random (1- (length +alpha-chars+))))) ((evenp x) (char-downcase chr)) (t (char-upcase chr))) result))))) (progn (format t "~ 206: ID:hUDFoTxj 2018/05/02(水) 05:46:42.10 <sage> お題:Hello, World!を10回出力してください。 ただし、偶数文字を小文字、奇数文字を大文字にすること。 さらに3の倍数の文字をランダムな英字にすること。 ") (format t "~%;; 文字コード~%~A~&" (odai-pt11-206 (format nil "Hello, World!~%") 10 (lambda (n col ch) (declare (ignorable n col ch)) (char-code ch)) nil)) (format t "~%;; 通算 n 文字目~%~A~&" (odai-pt11-206 (format nil "Hello, World!~%") 10 (lambda (n col ch) (declare (ignorable n col ch)) n) nil)) (format t "~%;; 各行 n 文字目~%~A~&" (odai-pt11-206 (format nil "Hello, World!~%") 10 (lambda (n col ch) (declare (ignorable n col ch)) col) nil)))
Standard input is empty
206: ID:hUDFoTxj 2018/05/02(水) 05:46:42.10 <sage>
お題:Hello, World!を10回出力してください。
ただし、偶数文字を小文字、奇数文字を大文字にすること。
さらに3の倍数の文字をランダムな英字にすること。
;; 文字コード
cEusf, Fhrjdl
EEafQ, nkZhdR
qESIZ, ccNxdu
HEptr, IMPAdF
MEtmb, GCNudu
iELSn, ZCwwdC
kEkJZ, JahHdu
BEIUo, mDrMdS
JEOIL, qIHodw
ZERqs, nQFQdW
;; 通算 n 文字目
HehlOU wIrLo!
DeLSO,jwOFLdj
HjLlJ, nOrBd!WHePlOh wqrLu!
beLKO,CwOELdt
HmLlq, KOrkd!vHeKlOD warLV!
neLcO,hwOqLdK
HdLlF, fOrnd!XHePlOf wKrLW!
;; 各行 n 文字目
HeolOC wxrLQ!
HeAlOE wBrLj!
HeTlOf wdrLe!
HeQlOe wCrLw!
HemlOB wLrLw!
HeklOZ wirLO!
HeZlOj wXrLH!
HeNlOW wtrLI!
HeVlOw wfrLh!
HeIlOC whrLE!