Letter frequency: Difference between revisions
Content added Content deleted
(→{{header|JavaScript}}: Added an ES6 variant, using the macOS 'Automation' lib for file access) |
|||
Line 2,073: | Line 2,073: | ||
=={{header|JavaScript}}== |
=={{header|JavaScript}}== |
||
===ES5=== |
|||
JavaScript is no longer used only in environments which are carefully isolated from file systems, but JavaScript standards still do not specify standard file-system functions. |
JavaScript is no longer used only in environments which are carefully isolated from file systems, but JavaScript standards still do not specify standard file-system functions. |
||
Leaving aside the particular and variable details of how files will be opened and read in environments like Node.js and OS X JavaScript for Automation etc., |
Leaving aside the particular and variable details of how files will be opened and read in environments like Node.js and OS X JavaScript for Automation etc., |
||
Line 2,115: | Line 2,115: | ||
["i", 44], ["j", 1], ["k", 3], ["l", 34], ["m", 11], ["n", 41], ["o", 40], ["p", 8], |
["i", 44], ["j", 1], ["k", 3], ["l", 34], ["m", 11], ["n", 41], ["o", 40], ["p", 8], |
||
["q", 2], ["r", 35], ["s", 39], ["t", 55], ["u", 20], ["v", 7], ["w", 17], ["x", 2], ["y", 16]]</lang> |
["q", 2], ["r", 35], ["s", 39], ["t", 55], ["u", 20], ["v", 7], ["w", 17], ["x", 2], ["y", 16]]</lang> |
||
===ES6=== |
|||
Using the 'JavaScript for Automation' embedding of a JSContext on macOS, for access to the file system: |
|||
<lang javascript>(() => { |
|||
'use strict'; |
|||
// charCounts :: String -> [(Char, Int)] |
|||
const charCounts = s => |
|||
sortBy(flip(comparing(snd)))( |
|||
Object.entries( |
|||
chars(s).reduce( |
|||
(a, c) => ( |
|||
a[c] = 1 + (a[c] || 0), |
|||
a |
|||
), {} |
|||
) |
|||
) |
|||
); |
|||
// ----------------------- TEST ----------------------- |
|||
// main :: IO () |
|||
const main = () => |
|||
either(msg => msg)( |
|||
compose(unlines, map(JSON.stringify), charCounts) |
|||
)(readFileLR('~/Code/charCount/miserables.txt')); |
|||
// -----------------GENERIC FUNCTIONS ----------------- |
|||
// Left :: a -> Either a b |
|||
const Left = x => ({ |
|||
type: 'Either', |
|||
Left: x |
|||
}); |
|||
// Right :: b -> Either a b |
|||
const Right = x => ({ |
|||
type: 'Either', |
|||
Right: x |
|||
}); |
|||
// chars :: String -> [Char] |
|||
const chars = s => |
|||
s.split(''); |
|||
// comparing :: (a -> b) -> (a -> a -> Ordering) |
|||
const comparing = f => |
|||
x => y => { |
|||
const |
|||
a = f(x), |
|||
b = f(y); |
|||
return a < b ? -1 : (a > b ? 1 : 0); |
|||
}; |
|||
// compose (<<<) :: (b -> c) -> (a -> b) -> a -> c |
|||
const compose = (...fs) => |
|||
fs.reduce( |
|||
(f, g) => x => f(g(x)), |
|||
x => x |
|||
); |
|||
// either :: (a -> c) -> (b -> c) -> Either a b -> c |
|||
const either = fl => |
|||
fr => e => 'Either' === e.type ? ( |
|||
undefined !== e.Left ? ( |
|||
fl(e.Left) |
|||
) : fr(e.Right) |
|||
) : undefined; |
|||
// flip :: (a -> b -> c) -> b -> a -> c |
|||
const flip = f => |
|||
1 < f.length ? ( |
|||
(a, b) => f(b, a) |
|||
) : (x => y => f(y)(x)); |
|||
// map :: (a -> b) -> [a] -> [b] |
|||
const map = f => |
|||
// The list obtained by applying f |
|||
// to each element of xs. |
|||
// (The image of xs under f). |
|||
xs => ( |
|||
Array.isArray(xs) ? ( |
|||
xs |
|||
) : xs.split('') |
|||
).map(f); |
|||
// readFileLR :: FilePath -> Either String IO String |
|||
const readFileLR = fp => { |
|||
const |
|||
e = $(), |
|||
ns = $.NSString |
|||
.stringWithContentsOfFileEncodingError( |
|||
$(fp).stringByStandardizingPath, |
|||
$.NSUTF8StringEncoding, |
|||
e |
|||
); |
|||
return ns.isNil() ? ( |
|||
Left(ObjC.unwrap(e.localizedDescription)) |
|||
) : Right(ObjC.unwrap(ns)); |
|||
}; |
|||
// snd :: (a, b) -> b |
|||
const snd = tpl => tpl[1]; |
|||
// sortBy :: (a -> a -> Ordering) -> [a] -> [a] |
|||
const sortBy = f => |
|||
xs => xs.slice() |
|||
.sort((a, b) => f(a)(b)); |
|||
// unlines :: [String] -> String |
|||
const unlines = xs => |
|||
// A single string formed by the intercalation |
|||
// of a list of strings with the newline character. |
|||
xs.join('\n'); |
|||
// MAIN --- |
|||
return main(); |
|||
})();</lang> |
|||
{{Out}} |
|||
<pre>[" ",516452] |
|||
["e",325769] |
|||
["t",222955] |
|||
["a",199774] |
|||
["o",180987] |
|||
["h",170234] |
|||
["n",166901] |
|||
["i",165221] |
|||
["s",157643] |
|||
["r",145136] |
|||
["d",106989] |
|||
["l",97091] |
|||
["\n",73828] |
|||
["u",67370] |
|||
["c",62760] |
|||
["m",56011] |
|||
["f",53438] |
|||
["w",53332] |
|||
[",",48784] |
|||
["g",46086] |
|||
["p",39958] |
|||
["y",37945] |
|||
["b",34313] |
|||
[".",30487] |
|||
["v",24058] |
|||
["€",21159] |
|||
["â",21155] |
|||
["k",14110] |
|||
["T",12571] |
|||
["I",10067] |
|||
["A",7359] |
|||
["œ",7121] |
|||
["",7033] |
|||
["H",6605] |
|||
["M",6208] |
|||
[";",5885] |
|||
["E",4969] |
|||
["-",4775] |
|||
["C",4594] |
|||
["S",4404] |
|||
["x",3694] |
|||
["™",3633] |
|||
["!",3539] |
|||
["R",3535] |
|||
["P",3429] |
|||
["O",3401] |
|||
["j",3392] |
|||
["B",3193] |
|||
["W",3181] |
|||
["”",3071] |
|||
["N",3053] |
|||
["?",2976] |
|||
["F",2768] |
|||
["G",2512] |
|||
[":",2463] |
|||
["L",2452] |
|||
["J",2448] |
|||
["q",2398] |
|||
["Ã",2296] |
|||
["V",2210] |
|||
["_",2068] |
|||
["z",1847] |
|||
["D",1758] |
|||
["©",1328] |
|||
["Y",1238] |
|||
["U",900] |
|||
["1",732] |
|||
["8",412] |
|||
["X",333] |
|||
["K",323] |
|||
["˜",298] |
|||
["¨",294] |
|||
["3",254] |
|||
["2",242] |
|||
["0",212] |
|||
["5",208] |
|||
["*",179] |
|||
["(",172] |
|||
[")",172] |
|||
["4",170] |
|||
["‰",146] |
|||
["6",143] |
|||
["7",140] |
|||
["Q",135] |
|||
["[",122] |
|||
["]",122] |
|||
["9",118] |
|||
["¦",107] |
|||
["ª",74] |
|||
["Z",59] |
|||
["¢",56] |
|||
["§",48] |
|||
["®",39] |
|||
["Å",38] |
|||
["¼",37] |
|||
["\"",37] |
|||
["“",35] |
|||
["´",34] |
|||
["|",24] |
|||
["¯",18] |
|||
["¹",18] |
|||
["/",12] |
|||
["†",10] |
|||
["»",9] |
|||
["'",8] |
|||
["ˆ",5] |
|||
["«",5] |
|||
["+",5] |
|||
["’",3] |
|||
["±",2] |
|||
["‡",2] |
|||
["$",2] |
|||
["#",1] |
|||
["&",1] |
|||
["Â",1] |
|||
["½",1] |
|||
["{",1] |
|||
["}",1] |
|||
["%",1] |
|||
["@",1]</pre> |
|||
=={{header|jq}}== |
=={{header|jq}}== |