Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
34
Task/Range-expansion/JavaScript/range-expansion-1.js
Normal file
34
Task/Range-expansion/JavaScript/range-expansion-1.js
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
#!/usr/bin/env js
|
||||
|
||||
function main() {
|
||||
print(rangeExpand('-6,-3--1,3-5,7-11,14,15,17-20'));
|
||||
}
|
||||
|
||||
function rangeExpand(rangeExpr) {
|
||||
|
||||
function getFactors(term) {
|
||||
var matches = term.match(/(-?[0-9]+)-(-?[0-9]+)/);
|
||||
if (!matches) return {first:Number(term)};
|
||||
return {first:Number(matches[1]), last:Number(matches[2])};
|
||||
}
|
||||
|
||||
function expandTerm(term) {
|
||||
var factors = getFactors(term);
|
||||
if (factors.length < 2) return [factors.first];
|
||||
var range = [];
|
||||
for (var n = factors.first; n <= factors.last; n++) {
|
||||
range.push(n);
|
||||
}
|
||||
return range;
|
||||
}
|
||||
|
||||
var result = [];
|
||||
var terms = rangeExpr.split(/,/);
|
||||
for (var t in terms) {
|
||||
result = result.concat(expandTerm(terms[t]));
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
main();
|
||||
39
Task/Range-expansion/JavaScript/range-expansion-2.js
Normal file
39
Task/Range-expansion/JavaScript/range-expansion-2.js
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
(function (strTest) {
|
||||
'use strict';
|
||||
|
||||
// s -> [n]
|
||||
function expansion(strExpr) {
|
||||
|
||||
// concat map yields flattened output list
|
||||
return [].concat.apply([], strExpr.split(',')
|
||||
.map(function (x) {
|
||||
return x.split('-')
|
||||
.reduce(function (a, s, i, l) {
|
||||
|
||||
// negative (after item 0) if preceded by an empty string
|
||||
// (i.e. a hyphen-split artefact, otherwise ignored)
|
||||
return s.length ? i ? a.concat(
|
||||
parseInt(l[i - 1].length ? s :
|
||||
'-' + s, 10)
|
||||
) : [+s] : a;
|
||||
}, []);
|
||||
|
||||
// two-number lists are interpreted as ranges
|
||||
})
|
||||
.map(function (r) {
|
||||
return r.length > 1 ? range.apply(null, r) : r;
|
||||
}));
|
||||
}
|
||||
|
||||
|
||||
// [m..n]
|
||||
function range(m, n) {
|
||||
return Array.apply(null, Array(n - m + 1))
|
||||
.map(function (x, i) {
|
||||
return m + i;
|
||||
});
|
||||
}
|
||||
|
||||
return expansion(strTest);
|
||||
|
||||
})('-6,-3--1,3-5,7-11,14,15,17-20');
|
||||
1
Task/Range-expansion/JavaScript/range-expansion-3.js
Normal file
1
Task/Range-expansion/JavaScript/range-expansion-3.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
[-6, -3, -2, -1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20]
|
||||
64
Task/Range-expansion/JavaScript/range-expansion-4.js
Normal file
64
Task/Range-expansion/JavaScript/range-expansion-4.js
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
(() => {
|
||||
"use strict";
|
||||
|
||||
// ----------------- RANGE EXPANSION -----------------
|
||||
|
||||
// rangeExpansion :: String -> [Int]
|
||||
const rangeExpansion = rangeString =>
|
||||
// A list of integers parsed from a
|
||||
// comma-delimited string which may include
|
||||
// (rising) hyphenated ranges.
|
||||
rangeString.split(",")
|
||||
.flatMap(x => {
|
||||
const ns = x.split("-")
|
||||
.reduce((a, s, i, xs) =>
|
||||
Boolean(s) ? (
|
||||
0 < i ? a.concat(
|
||||
parseInt(
|
||||
xs[i - 1].length ? (
|
||||
s
|
||||
) : `-${s}`,
|
||||
10
|
||||
)
|
||||
) : [Number(s)]
|
||||
) : a,
|
||||
[]
|
||||
);
|
||||
|
||||
return 2 === ns.length ? (
|
||||
uncurry(enumFromTo)(ns)
|
||||
) : ns;
|
||||
});
|
||||
|
||||
|
||||
// ---------------------- TEST -----------------------
|
||||
// main :: IO ()
|
||||
const main = () =>
|
||||
rangeExpansion("-6,-3--1,3-5,7-11,14,15,17-20");
|
||||
|
||||
|
||||
// --------------------- GENERIC ---------------------
|
||||
|
||||
// enumFromTo :: Int -> Int -> [Int]
|
||||
const enumFromTo = m =>
|
||||
n => Array.from({
|
||||
length: 1 + n - m
|
||||
}, (_, i) => m + i);
|
||||
|
||||
|
||||
// uncurry :: (a -> b -> c) -> ((a, b) -> c)
|
||||
const uncurry = f =>
|
||||
// A function over a pair, derived
|
||||
// from a curried function.
|
||||
(...args) => {
|
||||
const [x, y] = Boolean(args.length % 2) ? (
|
||||
args[0]
|
||||
) : args;
|
||||
|
||||
return f(x)(y);
|
||||
};
|
||||
|
||||
|
||||
// MAIN ---
|
||||
return JSON.stringify(main());
|
||||
})();
|
||||
Loading…
Add table
Add a link
Reference in a new issue