challenge 重複する要素を取り除く

与えられたリストxsの中から、 2回以上出現するものを全部取り除いてください。

サンプル入力
[3, 1, 4, 1, 5, 9, 2, 6, 5]
サンプル出力
[3, 4, 9, 2, 6]

これはアレイのuniqの派生問題です。 リストとかアレイという言葉は言語によってまちまちの意味で使われているので、 「配列のようなもの」という漠然とした意味にとって構いません。

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)

Index

Feed

Other

Link

Pathtraq

loading...