[ create a new paste ] login | about

Project: programmingpraxis
Link: http://programmingpraxis.codepad.org/yNXZMJsj    [ raw code | output | fork ]

programmingpraxis - Scheme, pasted on Apr 27:
; first unrepeated character in a string

(define (f str)
  (let ((len (string-length str)) (x (make-vector 256 -1)))
    (do ((i 0 (+ i 1))) ((= i len))
      (let ((c (char->integer (string-ref str i))))
        (cond ((= (vector-ref x c) -1) (vector-set! x c i))
              ((< -1 (vector-ref x c)) (vector-set! x c -2)))))
    (let loop ((c 0) (i (+ len 1)))
      (cond ((= c 256)
              (if (< i len)
                  (values i (string-ref str i))
                  (error 'f "no unrepeated character")))
            ((and (< -1 (vector-ref x c)) (< (vector-ref x c) i))
              (loop (+ c 1) (vector-ref x c)))
            (else (loop (+ c 1) i))))))

(call-with-values
  (lambda () (f "aaab"))
  (lambda (idx chr)
    (display idx) (display " ")
    (display chr) (newline)))

(call-with-values
  (lambda () (f "aaabbbcddd"))
  (lambda (idx chr)
    (display idx) (display " ")
    (display chr) (newline)))

(call-with-values
  (lambda () (f "aaaebbbcddd"))
  (lambda (idx chr)
    (display idx) (display " ")
    (display chr) (newline)))

(call-with-values
  (lambda () (f "aabbcc"))
  (lambda (idx chr)
    (display idx) (display " ")
    (display chr) (newline)))


Output:
1
2
3
4
3 b
6 c
3 e
f: no unrepeated character


Create a new paste based on this one


Comments: