This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;; P28 (**) Sorting a list of lists according to length of sublists | |
;; a) We suppose that a list contains elements that are lists themselves. The objective is to sort the elements of this list according to their length. E.g. short lists first, longer lists later, or vice versa. | |
;; Example: | |
;; * (lsort '((a b c) (d e) (f g h) (d e) (i j k l) (m n) (o))) | |
;; ((O) (D E) (D E) (M N) (A B C) (F G H) (I J K L)) | |
;; b) Again, we suppose that a list contains elements that are lists themselves. But this time the objective is to sort the elements of this list according to their length frequency; i.e., in the default, where sorting is done ascendingly, lists with rare lengths are placed first, others with a more frequent length come later. | |
;; Example: | |
;; * (lfsort '((a b c) (d e) (f g h) (d e) (i j k l) (m n) (o))) | |
;; ((i j k l) (o) (a b c) (f g h) (d e) (d e) (m n)) | |
;; Note that in the above example, the first two lists in the result have length 4 and 1, both lengths appear just once. The third and forth list have length 3 which appears twice (there are two list of this length). And finally, the last three lists have length 2. This is the most frequent length. | |
(define (lsort lst) | |
(sort lst (lambda (x y) | |
(< (length x) (length y))))) | |
(define (lfmark lst) | |
(let loop ((old lst) (acc '())) | |
(if (null? old) | |
(reverse acc) | |
(let ((head (car old))) | |
(loop (cdr old) | |
(cons | |
`(,(lfreq lst (length head)) | |
,head) | |
acc)))))) | |
(define (lfunmark lst) | |
(let loop ((lst lst) (acc '())) | |
(if (null? lst) | |
(reverse acc) | |
(loop (cdr lst) | |
(cons (second (car lst)) acc))))) | |
(define (lfreq lst len) | |
(let loop ((lst lst) (acc 0)) | |
(if (null? lst) | |
acc | |
(loop (cdr lst) | |
(+ (if (= (length (car lst)) len) | |
1 | |
0) acc))))) | |
(define (lfsort lst) | |
(let ((lst (lfmark lst))) | |
(lfunmark (sort lst (lambda (x y) | |
(< (car x) (car y))))))) |
0 件のコメント:
コメントを投稿