(define input (string->list "rwbrwbrwb"))
(define (dnf1 cs)
(define (char->num c)
(case c
((#\r) 1)
((#\w) 2)
((#\b) 3)
(else 0)))
(sort cs (lambda (c1 c2)
(< (char->num c1)
(char->num c2)))))
(define (dnf2 cs)
(let loop ((rest cs)
(rs '())
(ws '())
(bs '()))
(cond ((null? rest)
(append rs ws bs))
(else
(let ((c (car rest)))
(case c
((#\r) (loop (cdr rest)
(cons c rs)
ws
bs))
((#\w) (loop (cdr rest)
rs
(cons c ws)
bs))
((#\b) (loop (cdr rest)
rs
ws
(cons c bs)))
(else (loop (cdr rest)
rs
ws
bs))))))))
;The codepad.org Scheme lacks the sort function
;(write (dnf1 input))
;(newline)
(write (dnf2 input))
(newline)