Unique characters in each string: Difference between revisions

→‎{{header|JavaScript}}: Added a version in JavaScript
(→‎{{header|JavaScript}}: Added a version in JavaScript)
Line 287:
"3ycxdb1fgxa2yz"
]</lang>
{{Out}}
<pre>123abc</pre>
 
=={{header|JavaScript}}==
<lang javascript>(() => {
"use strict";
 
// onceInEach :: [String] -> String
const onceInEach = ws =>
// Characters which occur exactly once
// in each word in the list.
0 < ws.length ? (() => {
const
wordCount = ws.length,
charFreqs = charCounts(ws.join("")),
shared = ws.slice(1).reduce(
(a, x) => intersect(a)(new Set([...x])),
new Set([...ws[0]])
);
 
return sort(
[...shared].filter(
c => wordCount === charFreqs[c]
)
).join("");
})() : "";
 
 
// ---------------------- TEST -----------------------
const main = () =>
onceInEach([
"1a3c52debeffd",
"2b6178c97a938stf",
"3ycxdb1fgxa2yz"
]);
 
// --------------------- GENERIC ---------------------
 
// charCounts :: String -> Dict Char Int
const charCounts = cs =>
// Dictionary of chars, with the
// frequency of each in cs.
[...cs].reduce(
(a, c) => Object.assign(
a, {
[c]: 1 + (a[c] || 0)
}
), {}
);
 
 
// intersect :: Set -> Set -> Set
const intersect = a =>
// The intersection of two sets.
b => new Set([...a].filter(i => b.has(i)));
 
 
// sort :: Ord a => [a] -> [a]
const sort = xs =>
// An A-Z sorted copy of xs.
[...xs].slice().sort(
(a, b) => a < b ? -1 : (a > b ? 1 : 0)
);
 
// MAIN ---
return main();
})();</lang>
{{Out}}
<pre>123abc</pre>
9,655

edits