; word sets

(define (alpha-set cs)
  (let ((s (make-vector 26 #f)))
    (do ((cs cs (cdr cs)))
        ((null? cs) s)
      (let ((t (- (char->integer (car cs)) 97)))
        (vector-set! s t #t)))))

(define (word-set s word)
  (let loop ((cs (string->list word)))
    (if (null? cs) #t
      (let ((t (- (char->integer (car cs)) 97)))
        (if (vector-ref s t) (loop (cdr cs)) #f)))))

(define s (alpha-set '(#\a #\c #\t)))
(display (word-set s "act")) (newline)
(display (word-set s "tact")) (newline)
(display (word-set s "stop")) (newline)

(define (alpha-count cs)
  (let ((c (make-vector 26 0)))
    (do ((cs cs (cdr cs)))
        ((null? cs) c)
      (let ((t (- (char->integer (car cs)) 97)))
        (vector-set! c t (+ (vector-ref c t) 1))))))

(define (word-count c word)
  (let ((c (vector-copy c)))
    (let loop ((cs (string->list word)))
      (if (null? cs) #t
        (let ((t (- (char->integer (car cs)) 97)))
          (vector-set! c t (- (vector-ref c t) 1))
          (if (negative? (vector-ref c t)) #f
            (loop (cdr cs))))))))

(define c (alpha-count '(#\a #\c #\t)))
(display (word-count c "act")) (newline)
(display (word-count c "tact")) (newline)
(display (word-count c "stop")) (newline)