12節すべてを印刷する人気のホリデーソング。
12時までに詩つまり、歌の中で歌われている各行の繰り返し、つまり
第一節: クリスマスの最初の日に、私の愛する人は梨の木にいたヤマウズラを私にくれました。
第二節 クリスマスの二日目に、私の愛する人は梨の木に二羽のキジバトと一羽のヤマウズラをくれました。
...
詩 N: クリスマスの n 日目に私の愛する人が私にくれたもの (詩 N-1 の最初の行なし) (詩 N に追加された行)
ベストアンサー1
コモンリスプ:
(mapc #'princ
(reverse (maplist #'(lambda(l)
(format nil
"On the ~:R day of Christmas my true love gave to me~%~{~a~%~}~%"
(length l) l))
'("twelve drummers drumming,"
"eleven pipers piping,"
"ten lords a-leaping,"
"nine ladies dancing,"
"eight maids a-milking,"
"seven swans a-swimming,"
"six geese a-laying,"
"five gold rings,"
"four calling birds,"
"three french hens,"
"two turtle doves, and"
"a partridge in a pear tree."))))
編集:
上記は空白を除くと 412 文字になります。
これです:
(let ((g))
(dotimes (i 12)
(format t
"On the ~:R day of Christmas my true love gave to me~%~{~R ~:*~
~[~;~;turtle doves and~;french hens,~;calling birds,~;gold rings,~
~;geese a-laying,~;swans a-swimming,~;maids a-milking,~
~;ladies dancing,~;lords a-leaping,~;pipers piping,~
~;drummers drumming,~]~%~}a partridge in a pear tree~2%"
(1+ i) g)
(push (+ i 2) g)))
フォーマット文字列から空白と ~ で囲まれた改行を取り除くと、344 文字になります。
(let((g))(dotimes(i 12)(format t"On the ~:R day of Christmas my true love gave to me~%~{~R ~:*~[~;~;turtle doves and~;french hens,~;calling birds,~;gold rings,~;geese a-laying,~;swans a-swimming,~;maids a-milking,~;ladies dancing,~;lords a-leaping,~;pipers piping,~;drummers drumming,~]~%~}a partridge in a pear tree~2%"(1+ i)g)(push(+ i 2)g)))
編集:
質問はもう終わりのようで、サイト側は私に回答を受け入れるようしつこく勧めています。私が見る限り、これが一番短いようです。私が自分の回答を受け入れたらサイト側がどうするか、少し不安です。おそらくナルシストかマスターベーターのバッジを授与されるでしょう。
自分の答えを受け入れることはできないのですね。まあいいでしょう。オープンにしておきます。回答してくださった皆さんに感謝します。