Determine if a string has all unique characters: Difference between revisions

Line 261:
 
=={{header|Factor}}==
<lang factor>USING: accessors formatting fry generalizations io kernel math.parser
math.parser regexp sequences sets strings ;
 
: repeated ( elt seq -- )
: >dup-char< ( str n -- char hex first-index second-index )
1string tuck [ dup first >hex over ] 2dipdip <regexp>indices first2
[" >dup-char< "'%sc' (0x%s) at indices %d and %d.\n" printf ];
all-matching-slices first2 [ from>> ] bi@ ;
 
: duplicateuniqueness-info.report ( str -- )
dup dup length "%u — length %d — contains " printf dup
dup[ duplicates ] keep over empty?
[ >dup-char< "'%s' (0x%s) at indices %d and %d.\n" printf ]
all-unique? [ drop2drop "all unique characters." print nl ]
with each nl ;
[ "duplicaterepeated characters:" print duplicate-info.'[ _ repeated ] each ] if ;
 
: uniqueness-report. ( str -- )
dup dup length "%u — length %d — contains " printf dup
all-unique? [ drop "all unique characters." print nl ]
[ "duplicate characters:" print duplicate-info. ] if ;
 
""
Line 283 ⟶ 279:
"XYZ ZYX"
"1234567890ABCDEFGHIJKLMN0PQRSTUVWXYZ"
[ uniqueness-report. nl ] 5 napply</lang>
{{out}}
<pre>
Line 292 ⟶ 288:
"abcABC" — length 6 — contains all unique characters.
 
"XYZ ZYX" — length 7 — contains duplicaterepeated characters:
'Z' (0x5a) at indices 2 and 4.
'Y' (0x59) at indices 1 and 5.
'X' (0x58) at indices 0 and 6.
 
"1234567890ABCDEFGHIJKLMN0PQRSTUVWXYZ" — length 36 — contains duplicaterepeated characters:
'0' (0x30) at indices 9 and 24.
</pre>
 
1,827

edits