Unique characters: Difference between revisions
Content added Content deleted
m (→{{header|Wren}}: Minor tidy) |
(Add two StandardML versions) |
||
Line 1,563: | Line 1,563: | ||
156bgstz |
156bgstz |
||
</pre> |
</pre> |
||
=={{header|Standard ML}}== |
|||
Using an Array: |
|||
<syntaxhighlight lang="sml"> |
|||
fun uniqueChars xs = |
|||
let |
|||
val arr = Array.array(256, 0) |
|||
val inc = (fn c => Array.update(arr, ord c, Array.sub(arr, ord c)+1)) |
|||
val _ = List.app inc (List.concat (List.map String.explode xs)) |
|||
val ex1 = (fn (i,n,a) => if n=1 then (chr i)::a else a) |
|||
in |
|||
String.implode (Array.foldri ex1 [] arr) |
|||
end |
|||
</syntaxhighlight> |
|||
{{out}} |
|||
<pre> |
|||
- uniqueChars ["133252abcdeeffd","a6789798st","yxcdfgxcyz"]; |
|||
val it = "156bgstz" : string |
|||
</pre> |
|||
A different approach: |
|||
<syntaxhighlight lang="sml"> |
|||
(* |
|||
group [1,1,2,4,4,4,2,2,2,1,1,1,3] |
|||
=> [[1,1], [2], [4,4,4], [2,2,2], [1,1,1], [3]] |
|||
*) |
|||
fun group xs = |
|||
let |
|||
fun collectGroups(a,[]) = [[a]] |
|||
| collectGroups(a,b::bs) = if a = (hd b) then (a::b)::bs else [a]::b::bs |
|||
in |
|||
List.foldr collectGroups [] xs |
|||
end |
|||
fun uniqueChars2 xs = |
|||
let |
|||
(* turn the strings into one big list of characters *) |
|||
val cs = List.concat (List.map String.explode xs) |
|||
(* sort the big list of characters *) |
|||
val scs = ListMergeSort.sort Char.> cs |
|||
(* collect the groups *) |
|||
val gs = group scs |
|||
(* filter out groups with more than one member *) |
|||
val os = List.filter (fn a => null (tl a)) gs |
|||
in |
|||
String.implode (List.concat os) |
|||
end |
|||
</syntaxhighlight> |
|||
=={{header|V (Vlang)}}== |
=={{header|V (Vlang)}}== |