重複する要素を取り除く
Posted feedbacks - Scheme
Schemeの解がでていなかったので投稿(Gaucheに特化していますが)。 あと長いリストだとapplyでエラーになることがあります。
1 2 3 4 | (use gauche.collection)
(define (only-unique lst)
(apply append (filter (compose (cut = 1 <>) length) (group-collection lst))))
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | (define (remove-elem l e result)
(if (= (length l) 0)
result
(if (= (car l) e)
(remove-elem (cdr l) e result)
(remove-elem (cdr l) e (append result (list (car l)))))))
(define (has-elem? l e)
(if (= (length l) 0)
#f
(if (= (car l) e)
#t
(has-elem? (cdr l) e))))
(define (uniq-only-inner l all result)
(if (= (length l) 0)
result
(if (has-elem? all (car l))
(uniq-only-inner (cdr l) all (remove-elem result (car l) ()))
(uniq-only-inner (cdr l) (append all (list (car l))) (append result (list (car l)))))))
(define (uniq-only l)
(uniq-only-inner l () ()))
(display (uniq-only '(3 1 4 1 5 9 2 6 5))) ;; (3 4 9 2 6)
(display (uniq-only '(1 2 1 2 3 1 2 3 4))) ;; (4)
(display (uniq-only '(3 1 4 1 5 9 2 6 5 3 5 8 9 7 9))) ;; (4 2 6 8 7)
|


にしお
#3412()
Rating1/1=1.00
これはアレイのuniqの派生問題です。 リストとかアレイという言葉は言語によってまちまちの意味で使われているので、 「配列のようなもの」という漠然とした意味にとって構いません。
[ reply ]