; distinct characters
(define (distinct? str)
(call-with-current-continuation
(lambda (return)
(let ((cs (string->list str)))
(do ((cs cs (cdr cs))) ((null? cs) #t)
(do ((ds (cdr cs) (cdr ds))) ((null? ds))
(when (char=? (car cs) (car ds))
(return #f))))))))
(display (distinct? "Programming")) (display " ")
(display (distinct? "Praxis")) (newline)
(define (distinct? str)
(let loop ((cs (sort (string->list str) char<?)))
(if (null? (cdr cs)) #t
(if (char=? (car cs) (cadr cs)) #f
(loop (cdr cs))))))
(display (distinct? "Programming")) (display " ")
(display (distinct? "Praxis")) (newline)
(define (distinct? str)
(let ((letters (make-hash-table)))
(let loop ((cs (string->list str)))
(if (null? cs) #t
(if (hash-ref letters (car cs) #f) #f
(begin (hash-set! letters (car cs) 1)
(loop (cdr cs))))))))
(display (distinct? "Programming")) (display " ")
(display (distinct? "Praxis")) (newline)
OyBkaXN0aW5jdCBjaGFyYWN0ZXJzCgooZGVmaW5lIChkaXN0aW5jdD8gc3RyKQogIChjYWxsLXdpdGgtY3VycmVudC1jb250aW51YXRpb24KICAgIChsYW1iZGEgKHJldHVybikKICAgICAgKGxldCAoKGNzIChzdHJpbmctPmxpc3Qgc3RyKSkpCiAgICAgICAgKGRvICgoY3MgY3MgKGNkciBjcykpKSAoKG51bGw/IGNzKSAjdCkKICAgICAgICAgIChkbyAoKGRzIChjZHIgY3MpIChjZHIgZHMpKSkgKChudWxsPyBkcykpCiAgICAgICAgICAgICh3aGVuIChjaGFyPT8gKGNhciBjcykgKGNhciBkcykpCiAgICAgICAgICAgICAgKHJldHVybiAjZikpKSkpKSkpCgooZGlzcGxheSAoZGlzdGluY3Q/ICJQcm9ncmFtbWluZyIpKSAoZGlzcGxheSAiICIpCihkaXNwbGF5IChkaXN0aW5jdD8gIlByYXhpcyIpKSAobmV3bGluZSkKCihkZWZpbmUgKGRpc3RpbmN0PyBzdHIpCiAgKGxldCBsb29wICgoY3MgKHNvcnQgKHN0cmluZy0+bGlzdCBzdHIpIGNoYXI8PykpKQogICAgKGlmIChudWxsPyAoY2RyIGNzKSkgI3QKICAgICAgKGlmIChjaGFyPT8gKGNhciBjcykgKGNhZHIgY3MpKSAjZgogICAgICAgIChsb29wIChjZHIgY3MpKSkpKSkKCihkaXNwbGF5IChkaXN0aW5jdD8gIlByb2dyYW1taW5nIikpIChkaXNwbGF5ICIgIikKKGRpc3BsYXkgKGRpc3RpbmN0PyAiUHJheGlzIikpIChuZXdsaW5lKQoKKGRlZmluZSAoZGlzdGluY3Q/IHN0cikKICAobGV0ICgobGV0dGVycyAobWFrZS1oYXNoLXRhYmxlKSkpCiAgICAobGV0IGxvb3AgKChjcyAoc3RyaW5nLT5saXN0IHN0cikpKQogICAgICAoaWYgKG51bGw/IGNzKSAjdAogICAgICAgIChpZiAoaGFzaC1yZWYgbGV0dGVycyAoY2FyIGNzKSAjZikgI2YKICAgICAgICAgIChiZWdpbiAoaGFzaC1zZXQhIGxldHRlcnMgKGNhciBjcykgMSkKICAgICAgICAgICAgICAgICAobG9vcCAoY2RyIGNzKSkpKSkpKSkKCihkaXNwbGF5IChkaXN0aW5jdD8gIlByb2dyYW1taW5nIikpIChkaXNwbGF5ICIgIikKKGRpc3BsYXkgKGRpc3RpbmN0PyAiUHJheGlzIikpIChuZXdsaW5lKQ==