Skip to content

Instantly share code, notes, and snippets.

@k16shikano
Created January 23, 2021 08:58
Show Gist options
  • Save k16shikano/7856953d0629658ebe29440b27607fe7 to your computer and use it in GitHub Desktop.
Save k16shikano/7856953d0629658ebe29440b27607fe7 to your computer and use it in GitHub Desktop.
昇順の整数のリストが複数あったとき、それらの共通部分を抜き出すやつ
; https://twitter.com/golden_lucky/status/1352094822148915201
(use srfi-1)
(define (intersection lss)
(let R ((as (car lss))
(bss (drop-less-all (caar lss) (cdr lss)))
(result '()))
(if (or (null? bss) (null? as))
(reverse result)
(R (cdr as)
(if (null? (cdr as))
'()
(drop-less-all (cadr as) bss))
(if (every (^a (= (car as) (car a))) bss)
(cons (car as) result)
result)))))
(define (drop-less-all target lss)
(define (drop-less ls)
(drop-while (^a (< a target)) ls))
(call/cc
(^b
(let R ((lss lss)
(result '()))
(if (null? lss)
(reverse result)
(let1 ds (drop-less (car lss))
(if (null? ds)
(b '())
(R (cdr lss)
(cons ds result)))))))))
(define l1 '(1 2 3 4 5 6 8))
(define l2 '(1 4 8))
(define l3 '(1 2 8))
(intersection `(,l1 ,l2 ,l3))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment