2014/05/21
リストをn回コピー
手頃なお題だったのでまたネタにさせていただく。
やりたいのは、こういうこと。↓
(0 1 2 3 4) → (0 1 2 3 4 0 1 2 3 4 0 1 2 3 4) ; 3回コピー(長さが3倍)
標準+srfi-1 ならこれが短い
(define (dupn-1 lis k) (concatenate (make-list lis k)))
kが非常に大きくて、中間リストを作るのが嫌なら、 ソースを循環リストにして必要な要素数だけtakeするという手もある。
(define (dupn-2 lis k) (take (apply circular-list lis) (* k (length lis))))
srfi-42が使えるならさらに短い
(define (dupn-3 lis k) (append-ec (: _ k) lis))
ちなみにCommon Lispだと上記dupn-1
とdupn-3
はそれぞれこんな感じ。
(defun dupn-cl1 (lis k) (apply #'concatenate 'list (make-list k :initial-element lis))) (defun dupn-cl3 (lis k) (loop for n below k append lis))
Kei (2014/05/22 07:02:40):
shiro (2014/05/22 07:57:46):
Kei (2014/05/22 08:58:03):
shiro (2014/05/22 09:17:45):