Unique characters: Difference between revisions
Add two StandardML versions
(insert →Pascal) |
(Add two StandardML versions) |
||
(25 intermediate revisions by 16 users not shown) | |||
Line 13:
{{Template:Strings}}
<br><br>
=={{header|11l}}==
<syntaxhighlight lang="11l">DefaultDict[Char, Int] d
L(s) [‘133252abcdeeffd’, ‘a6789798st’, ‘yxcdfgxcyz’]
L(c) s
d[c]++
L(k) sorted(d.keys())
I d[k] == 1
print(k, end' ‘’)</syntaxhighlight>
{{out}}
<pre>
156bgstz
</pre>
=={{header|8080 Assembly}}==
<
TERM: equ '$' ; CP/M string terminator
org 100h
Line 71 ⟶ 86:
;;; Memory
upage: equ ($/256)+1 ; Workspace for 'unique'
outbuf: equ (upage+1)*256 ; Output </
{{out}}
<pre>156bgstz</pre>
=={{header|8086 Assembly}}==
<
org 100h
puts: equ 9 ; MS-DOS syscall to print a string
Line 127 ⟶ 141:
section .bss
uniqws: resb 256
outbuf: resb 256</
{{out}}
<pre>156bgstz</pre>
=={{header|Action!}}==
<syntaxhighlight lang="action!">DEFINE MAX="128"
CHAR ARRAY counts(MAX)
BYTE FUNC GetCount(CHAR ARRAY s CHAR c)
BYTE count,i
count=0
FOR i=1 TO s(0)
DO
IF s(i)=c THEN
count==+1
FI
OD
RETURN (count)
PROC UpdateCounts(CHAR ARRAY s)
BYTE i,c
FOR i=1 TO s(0)
DO
c=s(i)
counts(c)==+GetCount(s,c)
OD
RETURN
PROC Main()
DEFINE PTR="CARD"
DEFINE CNT="3"
PTR ARRAY l(CNT)
INT i
l(0)="133252abcdeeffd"
l(1)="a6789798st"
l(2)="yxcdfgxcyz"
SetBlock(counts,MAX,0)
FOR i=0 TO CNT-1
DO
UpdateCounts(l(i))
OD
FOR i=0 TO MAX-1
DO
IF counts(i)=1 THEN
Put(i) Put(32)
FI
OD
RETURN</syntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Unique_characters.png Screenshot from Atari 8-bit computer]
<pre>
1 5 6 b g s t z
</pre>
=={{header|Ada}}==
<
procedure Unique_Characters is
Line 162 ⟶ 230:
Count ("yxcdfgxcyz");
Put_Only_Once;
end Unique_Characters;</
{{out}}
<pre>1 5 6 b g s t z</pre>
Line 168 ⟶ 236:
=={{header|ALGOL 68}}==
Case sensitive. This assumes a small character set (e.g. ASCII where max abs char is 255). Would probably need some work if CHAR is Unicode.
<
# returns the characters that occur only once in the elements of s #
OP UNIQUE = ( []STRING s )STRING:
Line 189 ⟶ 257:
# task test case #
print( ( UNIQUE []STRING( "133252abcdeeffd", "a6789798st", "yxcdfgxcyz" ), newline ) )
END</
{{out}}
<pre>
Line 199 ⟶ 267:
The filtering here is case sensitive, the sorting dependent on locale.
<
set astid to AppleScript's text item delimiters
set AppleScript's text item delimiters to ""
Line 211 ⟶ 279:
return (mutableSet's sortedArrayUsingDescriptors:({sortDescriptor})) as list
end uniqueCharacters</
{{output}}
<
===Core language only===
This isn't quite as fast as the ASObjC solution above, but it can be case-insensitive if required. (Simply leave out the 'considering case' statement round the call to the handler). The requirement for AppleScript 2.3.1 is just for the 'use' command which loads the "Heap Sort" script. If "Heap Sort"'s loaded differently or compiled directly into the code, this script will work on systems at least as far back as Mac OS X 10.5 (Leopard) and possibly earlier. Same output as above.
<
use sorter : script "Heap Sort" -- <https://www.rosettacode.org/wiki/Sorting_algorithms/Heapsort#AppleScript>
Line 253 ⟶ 321:
considering case
return uniqueCharacters({"133252abcdeeffd", "a6789798st", "yxcdfgxcyz"})
end considering</
Line 260 ⟶ 328:
Composing a solution from existing generic primitives, for speed of drafting and refactoring, and for high levels of code reuse.
<
Line 413 ⟶ 481:
((current application's NSArray's arrayWithArray:xs)'s ¬
sortedArrayUsingSelector:"compare:") as list
end sort</
{{Out}}
<pre>{"1", "5", "6", "b", "g", "s", "t", "z"}</pre>
=={{header|APL}}==
<
{{out}}
<pre> uniques '133252abcdeeffd' 'a6789798st' 'yxcdfgxcyz'
Line 425 ⟶ 493:
=={{header|Arturo}}==
<
str: join arr
print sort select split str 'ch -> 1 = size match str ch</
{{out}}
Line 435 ⟶ 503:
=={{header|AWK}}==
<syntaxhighlight lang="awk">
# syntax: GAWK -f UNIQUE_CHARACTERS.AWK
#
Line 461 ⟶ 529:
exit(0)
}
</syntaxhighlight>
{{out}}
<pre>
Line 471 ⟶ 539:
=={{header|BASIC}}==
<
20 DIM C(255)
30 READ A$: IF A$="" GOTO 90
Line 486 ⟶ 554:
140 DATA "a6789798st"
150 DATA "yxcdfgxcyz"
160 DATA ""</
{{out}}
<pre>156bgstz</pre>
=={{header|BCPL}}==
<
let uniques(strings, out) be
Line 519 ⟶ 587:
uniques(strings, out)
writef("%S*N", out)
$)</
{{out}}
<pre>156bgstz</pre>
=={{header|BQN}}==
<
{{out}}
Line 533 ⟶ 601:
=={{header|C}}==
<
#include <string.h>
Line 565 ⟶ 633:
printf("%s\n", uniques(strings, buf));
return 0;
}</
{{out}}
<pre>156bgstz</pre>
=={{header|C++}}==
<
#include <map>
Line 585 ⟶ 653:
}
std::cout << '\n';
}</
{{out}}
Line 591 ⟶ 659:
156bgstz
</pre>
=={{header|Delphi}}==
{{works with|Delphi|6.0}}
{{libheader|SysUtils,StdCtrls}}
<syntaxhighlight lang="Delphi">
var SA: array [0..2] of string = ('133252abcdeeffd', 'a6789798st', 'yxcdfgxcyz');
function CharsAppearingOnce(S: string): string;
{Return all character that only occur once}
var SL: TStringList;
var I,Inx: integer;
begin
SL:=TStringList.Create;
try
{Store each character and store a count}
{of the number of occurances in the object}
for I:=1 to Length(S) do
begin
{Check to see if letter is already in list}
Inx:=SL.IndexOf(S[I]);
{Increment the count if it is, otherwise store it}
if Inx>=0 then SL.Objects[Inx]:=Pointer(Integer(SL.Objects[Inx])+1)
else SL.AddObject(S[I],Pointer(1));
end;
{Sort the list}
SL.Sort;
{Now return letters with a count of one}
Result:='';
for I:=0 to SL.Count-1 do
if integer(SL.Objects[I])<2 then Result:=Result+SL[I];
finally SL.Free; end;
end;
procedure ShowUniqueChars(Memo: TMemo);
var I: integer;
var S: string;
begin
{Concatonate all strings}
S:='';
for I:=0 to High(SA) do S:=S+SA[I];
{Get all characters that appear once}
S:=CharsAppearingOnce(S);
Memo.Lines.Add(S);
end;
</syntaxhighlight>
{{out}}
<pre>
156bgstz
Elapsed Time: 0.959 ms.
</pre>
=={{header|Factor}}==
{{works with|Factor|0.99 build 2074}}
<
{ "133252abcdeeffd" "a6789798st" "yxcdfgxcyz" }
concat non-repeating natural-sort print</
{{out}}
<pre>
156bgstz
</pre>
=={{header|FreeBASIC}}==
<syntaxhighlight lang="freebasic">Dim As Integer c(255), i, a
Dim As String s
Do
Read s
For i = 1 To Len(s)
a = Asc(Mid(s,i,1))
c(a) += 1
Next i
Loop Until s = ""
For i = 1 To 255
If c(i) = 1 Then s &= Chr(i)
Next i
Print s
Data "133252abcdeeffd", "a6789798st", "yxcdfgxcyz", ""
Sleep</syntaxhighlight>
{{out}}
<pre>156bgstz</pre>
=={{header|FutureBasic}}==
<syntaxhighlight lang="futurebasic">window 1, @"Unique characters"
void local fn DoIt
CountedSetRef set = fn CountedSetWithCapacity(0)
CFArrayRef array = @[@"133252abcdeeffd",@"a6789798st",@"yxcdfgxcyz"]
CFStringRef string, chr
long index
CFMutableArrayRef mutArray = fn MutableArrayWithCapacity(0)
for string in array
for index = 0 to len(string) - 1
CountedSetAddObject( set, mid(string,index,1) )
next
next
for chr in set
if ( fn CountedSetCountForObject( set, chr ) == 1 )
MutableArrayAddObject( mutArray, chr )
end if
next
MutableArraySortUsingSelector( mutArray, @"compare:" )
print fn ArrayComponentsJoinedByString( mutArray, @"" )
end fn
fn DoIt
HandleEvents</syntaxhighlight>
{{out}}
<pre>156bgstz</pre>
=={{header|Go}}==
<
import (
Line 627 ⟶ 808:
sort.Slice(chars, func(i, j int) bool { return chars[i] < chars[j] })
fmt.Println(string(chars))
}</
{{out}}
Line 635 ⟶ 816:
=={{header|Haskell}}==
<
uniques :: [String] -> String
Line 648 ⟶ 829:
"a6789798st",
"yxcdfgxcyz"
]</
{{Out}}
<pre>156bgstz</pre>
Line 654 ⟶ 835:
Or folding the strings down to a hash of character frequencies:
<
--------- UNIQUE CHARACTERS FROM A LIST OF STRINGS -------
Line 677 ⟶ 858:
"a6789798st",
"yxcdfgxcyz"
]</
{{Out}}
<pre>156bgstz</pre>
=={{header|JavaScript}}==
<
"use strict";
Line 732 ⟶ 913:
// MAIN ---
return JSON.stringify(main());
})();</
{{Out}}
<pre>["1","5","6","b","g","s","t","z"]</pre>
Line 739 ⟶ 920:
Or, folding the strings (with Array.reduce) down to a hash of character frequencies:
<
"use strict";
Line 768 ⟶ 949:
return JSON.stringify(main());
})();</
{{Out}}
<pre>["1","5","6","b","s","t","g","z"]</pre>
=={{header|J}}==
The simple approach here is to merge the argument strings and find characters which occur exactly once in that intermediate result:
<syntaxhighlight lang="j">uniques=: ~.#~1=#/.~</syntaxhighlight>
In other words, <code>~.</code> finds the distinct characters, <code>#/.~</code> finds the corresponding counts of those characters, so <code>1=#/.~</code> is true for the characters which occur exactly once, and <code>#~</code> filters the distinct characters based on those truth values.
{{out}}
<pre> uniques
156bgstz</pre>
Here, <code>;</code> as a separator between quoted strings builds a list of the strings, and <code>;</code> as a prefix of that list merges the contents of the strings of that list into a single string. We could just as easily have formed a single string, but that's not what the task asked for. (Since <code>uniques</code> is a verb (aka a "function"), it's not a list element in this context.)
=={{header|jq}}==
Line 782 ⟶ 967:
'''Works with gojq, the Go implementation of jq'''
The following "bag-of-words" solution is quite efficient as it takes advantage of the fact that jq implements JSON objects as a hash.<
# bag of words
def bow(stream):
Line 791 ⟶ 976:
def in_one_just_once:
bow( .[] | explode[] | [.] | implode) | with_entries(select(.value==1)) | keys;
</syntaxhighlight>
'''The task'''
<
| in_one_just_once</
{{out}}
<pre>
Line 801 ⟶ 986:
=={{header|Julia}}==
<
function is_once_per_all_strings_in(a::Vector{String})
Line 810 ⟶ 995:
println(is_once_per_all_strings_in(list))
</
['1', '5', '6', 'b', 'g', 's', 't', 'z']
</pre>
One might think that the method above suffers from too many passes through the text with one pass per count, but with a small text length the dictionary lookup takes more time. Compare times for a single pass version:
<
counts = Dict{Char, Int}()
for c in prod(list)
Line 828 ⟶ 1,013:
@btime is_once_per_all_strings_in(list)
@btime uniquein(list)
</
['1', '5', '6', 'b', 'g', 's', 't', 'z']
1.740 μs (28 allocations: 3.08 KiB)
Line 835 ⟶ 1,020:
This can be rectified (see Phix entry) if we don't save the counts as we go but just exclude entries with duplicates:
<
s = sort(collect(prod(list)))
l = length(s)
Line 844 ⟶ 1,029:
@btime uniquein2(list)
</
['1', '5', '6', 'b', 'g', 's', 't', 'z']
1.010 μs (14 allocations: 1.05 KiB)
</pre>
=={{header|Lua}}==
<syntaxhighlight lang="lua">local strings = {"133252abcdeeffd", "a6789798st", "yxcdfgxcyz"}
unpack = unpack or table.unpack -- compatibility for all Lua versions
local map = {}
for i, str in ipairs (strings) do
for i=1, string.len(str) do
local char = string.sub(str,i,i)
if map[char] == nil then
map[char] = true
else
map[char] = false
end
end
end
local list = {}
for char, bool in pairs (map) do
if bool then
table.insert (list, char)
end
end
table.sort (list)
print (unpack (list))</syntaxhighlight>
{{out}}<pre>1 5 6 b g s t z</pre>
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<
{{out}}
<pre>{"1", "5", "6", "b", "g", "s", "t", "z"}</pre>
Line 857 ⟶ 1,071:
One solution, but others are possible, for instance concatenating the strings and building the count table from it rather than merging several count tables. And to build the last sequence, we could have used something like <code>sorted(toSeq(charCount.pairs).filterIt(it[1] == 1).mapIt(it[0]))</code>, which is a one liner but less readable and less efficient than our solution using “collect”.
<
var charCount: CountTable[char]
Line 868 ⟶ 1,082:
if count == 1: ch
echo sorted(uniqueChars)</
{{out}}
Line 875 ⟶ 1,089:
=={{header|Pascal}}==
{{works with|Extended Pascal}}
<
type
Line 931 ⟶ 1,145:
writeLn
end.</
{{out}}
<pre>156bgstz</pre>
Line 937 ⟶ 1,151:
=={{header|Perl}}==
{{trans|Raku}}
<
use strict;
Line 949 ⟶ 1,163:
"133252abcdeeffd", "a6789798st", "yxcdfgxcyz", "AАΑSäaoö٥🤔👨👩👧👧";
my $uca = Unicode::Collate->new();
print $uca->sort ( grep { $seen{$_} == 1 } keys %seen )</
{{out}}
<pre>
Line 956 ⟶ 1,170:
=={{header|Phix}}==
<!--<
<span style="color: #008080;">function</span> <span style="color: #000000;">once</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">ch</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">string</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">l</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
Line 966 ⟶ 1,180:
<span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">filter</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sort</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #000000;">set</span><span style="color: #0000FF;">,</span><span style="color: #008000;">""</span><span style="color: #0000FF;">)),</span><span style="color: #000000;">once</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"found %d unique characters: %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">),</span><span style="color: #000000;">res</span><span style="color: #0000FF;">})</span>
<!--</
{{out}}
<pre>
Line 973 ⟶ 1,187:
=={{header|PicoLisp}}==
<
(let R NIL
(mapc
Line 991 ⟶ 1,205:
"133252abcdeeffd"
"a6789798st"
"yxcdfgxcyz" ) ) )</
{{out}}
<pre>
Line 998 ⟶ 1,212:
=={{header|PL/M}}==
<
BDOS: PROCEDURE (FN, ARG); DECLARE FN BYTE, ARG ADDRESS; GO TO 5; END BDOS;
EXIT: PROCEDURE; CALL BDOS(0,0); END EXIT;
Line 1,046 ⟶ 1,260:
CALL PRINT(.BUFFER);
CALL EXIT;
EOF</
{{out}}
<pre>156BGSTZ</pre>
=={{header|Python}}==
<
from itertools import chain, groupby
Line 1,085 ⟶ 1,299:
# MAIN ---
if __name__ == '__main__':
main()</
{{Out}}
<pre>['1', '5', '6', 'b', 'g', 's', 't', 'z']</pre>
Or reducing the given strings down to a hash of character frequencies:
<
from functools import reduce
Line 1,131 ⟶ 1,345:
# MAIN ---
if __name__ == '__main__':
main()</
{{Out}}
<pre>['1', '5', '6', 'b', 'g', 's', 't', 'z']</pre>
=={{header|Quackery}}==
<syntaxhighlight lang="Quackery"> [ [] swap
witheach join
[] 0 128 of
rot witheach
[ 2dup peek
1+ unrot poke ]
witheach
[ 1 = if
[ i^ join ] ] ] is task ( [ --> $ )
[]
$ "133252abcdeeffd" nested join
$ "a6789798st" nested join
$ "yxcdfgxcyz" nested join
task echo$</syntaxhighlight>
{{out}}
<pre>156bgstz</pre>
=={{header|Raku}}==
One has to wonder where the digits 0 through 9 come in the alphabet... 🤔 For that matter, What alphabet should they be in order of? Most of these entries seem to presuppose ASCII order but that isn't specified anywhere. What to do with characters outside of ASCII (or Latin-1)? Unicode ordinal order? Or maybe DUCET Unicode collation order? It's all very vague.
<syntaxhighlight lang="raku"
for @list, (@list, 'AАΑSäaoö٥🤔👨👩👧👧') {
Line 1,145 ⟶ 1,382:
"\n (DUCET) Unicode collation order: ",
.map( *.comb ).Bag.grep( *.value == 1 )».key.collate.join, "\n";
}</
{{out}}
<pre>133252abcdeeffd a6789798st yxcdfgxcyz
Line 1,165 ⟶ 1,402:
On an '''EBCDIC''' machine, the lowercase letters and the uppercase letters aren't contiguous.
<
parse arg $ /*obtain optional arguments from the CL*/
if $='' | $="," then $= '133252abcdeeffd' "a6789798st" 'yxcdfgxcyz' /*use defaults.*/
Line 1,183 ⟶ 1,420:
say 'unique characters are: ' @ /*display the unique characters found. */
say
say 'Found ' L " unique characters." /*display the # of unique chars found. */</
{{out|output|text= when using the default inputs:}}
<pre>
Line 1,192 ⟶ 1,429:
=={{header|Ring}}==
<
see "working..." + nl
see "Unique characters are:" + nl
Line 1,225 ⟶ 1,462:
end
return sum
</syntaxhighlight>
{{out}}
<pre>
Line 1,233 ⟶ 1,470:
Found 8 unique characters
done...
</pre>
=={{header|RPL}}==
{{works with|Halcyon Calc|4.2.7}}
≪ DUP SIZE → string length
≪ 1 length '''FOR''' n
string n DUP SUB
'''NEXT'''
length 1 '''FOR''' n
1 n 1 - START
'''IF''' DUP2 ≥ '''THEN''' SWAP '''END'''
n ROLLD
'''NEXT'''
n ROLLD
-1 '''STEP'''
2 length '''START''' + '''NEXT'''
≫ ≫
‘SORTS’ STO
≪ DUP 1 DUP SUB → str char1
≪ str SIZE
'''IF''' DUP 1 >
'''THEN'''
DROP 1
'''WHILE''' str OVER 1 + DUP SUB char1 == '''REPEAT''' 1 + '''END'''
'''END'''
char1
≫ ≫
‘OCHST’ STO
≪ "" 1 3 PICK SIZE '''FOR''' j
OVER j GET +
'''NEXT'''
SWAP DROP
SORTS "" SWAP 1
'''WHILE''' OVER SIZE OVER ≥ '''REPEAT'''
DUP2 OVER SIZE SUB OCHST
'''IF''' OVER 1 ==
'''THEN''' 5 ROLL SWAP + 4 ROLLD
'''ELSE''' DROP
'''END'''
+
'''END'''
DROP2
≫
‘UNCHR’ STO
===Shorter code but increased memory requirements===
≪ → strings
≪ { 255 } 0 CON 1 strings SIZE '''FOR''' j
strings j GET 1 OVER SIZE '''FOR''' k
DUP k DUP SUB NUM ROT SWAP DUP2 GET 1 + PUT SWAP
'''NEXT'''
DROP
'''NEXT'''
≫
"" 1 255 '''FOR''' j
'''IF''' OVER j GET 1 == '''THEN''' j CHR + '''END'''
'''NEXT'''
SWAP DROP
≫
‘UNCHR’ STO
{"133252abcdeeffd", "a6789798st", "yxcdfgxcyz"} UNCHR
{{out}}
<pre>
1: "156bgstz"
</pre>
=={{header|Ruby}}==
<syntaxhighlight lang="ruby">words = ["133252abcdeeffd", "a6789798st", "yxcdfgxcyz"]
counter = words.inject({}){|h, word| word.chars.tally(h)}
puts counter.filter_map{|char, count| char if count == 1}.sort.join
</syntaxhighlight>
{{out}}
<pre>
156bgstz
</pre>
=={{header|Transd}}==
<syntaxhighlight lang="Scheme">#lang transd
MainModule: {
v: ["133252abcdeeffd", "a6789798st", "yxcdfgxcyz"],
_start: (λ
(for p in (group-by (split (join v "") "")) do
(if (== (size (snd p)) 1) (textout (fst p))))
)
}</syntaxhighlight>
{{out}}
<pre>
156bgstz
</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)}}==
<syntaxhighlight lang="v (vlang)">
fn main() {
strings := ["133252abcdeeffd", "a6789798st", "yxcdfgxcyz"]
mut m := map[rune]int{}
for s in strings {
for c in s {
m[c]++
}
}
mut chars := []rune{}
for k, v in m {
if v == 1 {chars << k}
}
chars.sort_with_compare(fn(i &rune, j &rune) int {
if *i < *j {return -1}
if *i > *j {return 1}
return 0
})
println(chars.string())
}
</syntaxhighlight>
{{out}}
<pre>
156bgstz
</pre>
Line 1,238 ⟶ 1,643:
{{libheader|Wren-seq}}
{{libheader|Wren-sort}}
<
import "./sort" for Sort
var strings = ["133252abcdeeffd", "a6789798st","yxcdfgxcyz"]
Line 1,246 ⟶ 1,651:
Sort.insertion(uniqueChars)
System.print("Found %(uniqueChars.count) unique character(s), namely:")
System.print(uniqueChars.join(" "))</
{{out}}
Line 1,253 ⟶ 1,658:
1 5 6 b g s t z
</pre>
=={{header|Yabasic}}==
{{trans|FreeBASIC}}
<syntaxhighlight lang="yabasic">dim c(255)
data "133252abcdeeffd", "a6789798st", "yxcdfgxcyz", ""
repeat
read s$
for i = 1 to len(s$)
a = asc(mid$(s$,i,1))
c(a) = c(a) + 1
next i
until s$ = ""
for i = 1 to 255
if c(i) = 1 then s$ = s$ + chr$(i) : fi
next i
print s$
end</syntaxhighlight>
{{out}}
<pre>
Igual que la entrada de FreeBASIC.
</pre>
=={{header|XPL0}}==
<
char Tbl(128), Str;
string 0;
Line 1,271 ⟶ 1,699:
for I:= 0 to 127 do
if Tbl(I) = 1 then ChOut(0, I);
]</
{{out}}
|