Range expansion: Difference between revisions

→‎JavaScript ES6: Tidied, updated primitives.
(Added solution for Action!)
(→‎JavaScript ES6: Tidied, updated primitives.)
Line 2,134:
 
====ES6====
<lang JavaScriptjavascript>(strTest() => {
"use strict";
 
// ----------------- RANGE EXPANSION -----------------
 
<lang JavaScript>(strTest => {
// expansion :: String -> [Int]
letconst expansion = strExprrangeString =>
// A list of integers parsed from a
// comma-delimited string which may include
// (rising) hyphenated ranges.
.map(x => xrangeString.split('-'",")
[].concat.applymap([],x => strExprx.split(','"-")
.reduce((a, s, i, lxs) =>
Boolean(s) :? [+s] : a, [])(
s.length0 ?< i ? a.concat(
parseInt(l[i - 1].length ? s :
'xs[i -' +1].length s,? 10)(
let d = (step || 1) * (n >= m ? 1 : -1); s
) : `-${s}`,
length: Math.floor((n - m) / d) + 1 10
)
) : [Number(s)]
range = (m, n, step ) =>: {a,
[]
)
)
.flatMap(
ns => 2 === ns.length ? (
uncurry(enumFromTo)(ns)
) : ns
);
 
// concat map yields flattened output list
[].concat.apply([], strExpr.split(',')
.map(x => x.split('-')
.reduce((a, s, i, l) =>
 
// ---------------------- TEST -----------------------
// negative (after item 0) if preceded by an empty string
// main :: IO ()
// (i.e. a hyphen-split artefact, otherwise ignored)
const main = () =>
s.length ? i ? a.concat(
}) expansion('"-6,-3--1,3-5,7-11,14,15,17-20'");</lang>
parseInt(l[i - 1].length ? s :
'-' + s, 10)
) : [+s] : a, [])
 
// two-number lists are interpreted as ranges
)
.map(r => r.length > 1 ? range.apply(null, r) : r)),
 
// --------------------- GENERIC ---------------------
 
// rangeenumFromTo :: Int -> Int -> Maybe Int -> [Int]
const enumFromTo = m =>
n => Array.from({
length: 1 + n - m
}, (_, i) => m + i);
 
// range :: Int -> Int -> Maybe Int -> [Int]
range = (m, n, step) => {
let d = (step || 1) * (n >= m ? 1 : -1);
 
// uncurry :: (a -> b -> c) return-> Array.from({(a, b) -> c)
const uncurry = f =>
length: Math.floor((n - m) / d) + 1
// A function over },a (_pair, i) => m + (i * d));derived
// from a curried function.
(...args) => {
const [x, y] = Boolean(args.length % 2) ? (
args[0]
) : args;
 
return f(x)(y);
};
 
 
// MAIN ---
 
return expansionJSON.stringify(strTestmain());
})();</lang>
 
})('-6,-3--1,3-5,7-11,14,15,17-20');</lang>
 
{{Out}}
<lang JavaScriptpre>[-6, -3, -2, -1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20]</langpre>
 
=={{header|jq}}==
9,655

edits