Island Life

< 小学校の教科内容 | プリンタなおった >

2014/05/21

リストをn回コピー

手頃なお題だったのでまたネタにさせていただく。

(リストを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-1dupn-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))

Tags: Scheme, Gauche

Past comment(s)

Kei (2014/05/22 07:02:40):

標準だけでもそれなりに短く。 (define (dupn-1 lis k) (apply append (make-list k lis)))

shiro (2014/05/22 07:57:46):

make-listはR5RSには入ってないのです。

Kei (2014/05/22 08:58:03):

R7RSが出て結構経ちますし、そろそろそっちを標準にしてもいいかなぁとは思うのですが。

shiro (2014/05/22 09:17:45):

まあ確かに、今現在で「標準」といったらそうすべきですね。

Post a comment

Name: