Check for duplicates
Detect duplicate characters in strings and duplicate items in lists using Clarity
;; Check for duplicate characters in a string(define-read-only (has-duplicate-chars? (input (string-ascii 200)))(is-none (fold dup input (slice? (concat input "|END") u1 (+ (len input) u4)))))(define-private (dup (ch (string-ascii 1)) (out (optional (string-ascii 204))))(match out out_some(match (index-of? (unwrap-panic (slice? out_some u0 (- (len out_some) u4))) ch)found none(slice? out_some u1 (len out_some)))out));; Example usage(has-duplicate-chars? "hello") ;; Returns true (duplicate 'l')(has-duplicate-chars? "world") ;; Returns false (no duplicates)
Use cases
- Validating usernames for uniqueness of characters
- Checking NFT trait uniqueness in collections
- Preventing duplicate entries in voting systems
- Ensuring unique identifiers in lists
Key concepts
The duplicate detection uses different strategies:
- Strings: Uses
fold
withindex-of?
to find repeated characters - Lists: Checks if elements appear again in the remaining list
- Optimization: Early exit on first duplicate found