2016 Update
This commit is contained in:
parent
948b86eafa
commit
dcf5d15da3
7965 changed files with 139854 additions and 31002 deletions
38
Task/Knuth-shuffle/JavaScript/knuth-shuffle-2.js
Normal file
38
Task/Knuth-shuffle/JavaScript/knuth-shuffle-2.js
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
(lst => {
|
||||
|
||||
// knuthShuffle :: [a] -> [a]
|
||||
let knuthShuffle = lst =>
|
||||
range(0, lst.length - 1)
|
||||
.reduceRight((a, i) => {
|
||||
let iRand = i ? randomInteger(0, i) : 0,
|
||||
tmp = a[iRand];
|
||||
|
||||
return iRand !== i ? (
|
||||
a[iRand] = a[i],
|
||||
a[i] = tmp,
|
||||
a
|
||||
) : a;
|
||||
}, lst),
|
||||
|
||||
// randomInteger :: Int -> Int -> Int
|
||||
randomInteger = (low, high) =>
|
||||
low + Math.floor(
|
||||
(Math.random() * ((high - low) + 1))
|
||||
),
|
||||
|
||||
// range :: Int -> Int -> Maybe Int -> [Int]
|
||||
range = (m, n, step) => {
|
||||
let d = (step || 1) * (n >= m ? 1 : -1);
|
||||
|
||||
return Array.from({
|
||||
length: Math.floor((n - m) / d) + 1
|
||||
}, (_, i) => m + (i * d));
|
||||
};
|
||||
|
||||
|
||||
return knuthShuffle(lst);
|
||||
|
||||
})(
|
||||
'alpha beta gamma delta epsilon zeta eta theta iota kappa lambda mu'
|
||||
.split(' ')
|
||||
);
|
||||
2
Task/Knuth-shuffle/JavaScript/knuth-shuffle-3.js
Normal file
2
Task/Knuth-shuffle/JavaScript/knuth-shuffle-3.js
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
["iota", "epsilon", "kappa", "theta", "gamma", "delta",
|
||||
"lambda", "eta", "zeta", "beta", "mu", "alpha"]
|
||||
56
Task/Knuth-shuffle/JavaScript/knuth-shuffle-4.js
Normal file
56
Task/Knuth-shuffle/JavaScript/knuth-shuffle-4.js
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
(lst => {
|
||||
|
||||
// knuthShuffle :: [a] -> [a]
|
||||
function knuthShuffle(lst) {
|
||||
let lng = lst.length;
|
||||
|
||||
return lng ? range(0, lng - 1)
|
||||
.reduceRight((a, i) => {
|
||||
let iRand = i > 0 ? randomInteger(0, i) : 0;
|
||||
|
||||
return i !== iRand ? swapped(a, i, iRand) : a;
|
||||
}, lst) : [];
|
||||
};
|
||||
|
||||
|
||||
// A non-mutating variant of swapped():
|
||||
|
||||
// swapped :: [a] -> Int -> Int -> [a]
|
||||
let swapped = (lst, iFrom, iTo) => {
|
||||
let [iLow, iHigh] = iTo > iFrom ? (
|
||||
[iFrom, iTo]
|
||||
) : [iTo, iFrom];
|
||||
|
||||
return iLow !== iHigh ? (
|
||||
[].concat(
|
||||
(iLow > 0 ? lst.slice(0, iLow) : []), // pre
|
||||
lst[iHigh], // DOWN
|
||||
lst.slice(iLow + 1, iHigh), // mid
|
||||
lst[iLow], // UP
|
||||
lst.slice(iHigh + 1) // post
|
||||
)
|
||||
) : lst.slice(0) // (unchanged copy)
|
||||
},
|
||||
|
||||
// randomInteger :: Int -> Int -> Int
|
||||
randomInteger = (low, high) =>
|
||||
low + Math.floor(
|
||||
(Math.random() * ((high - low) + 1))
|
||||
),
|
||||
|
||||
// range :: Int -> Int -> Maybe Int -> [Int]
|
||||
range = (m, n, step) => {
|
||||
let d = (step || 1) * (n >= m ? 1 : -1);
|
||||
|
||||
return Array.from({
|
||||
length: Math.floor((n - m) / d) + 1
|
||||
}, (_, i) => m + (i * d));
|
||||
};
|
||||
|
||||
|
||||
return knuthShuffle(lst);
|
||||
|
||||
})(
|
||||
'alpha beta gamma delta epsilon zeta eta theta iota kappa lambda mu'
|
||||
.split(' ')
|
||||
);
|
||||
2
Task/Knuth-shuffle/JavaScript/knuth-shuffle-5.js
Normal file
2
Task/Knuth-shuffle/JavaScript/knuth-shuffle-5.js
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
["mu", "theta", "beta", "eta", "delta", "epsilon",
|
||||
"kappa", "alpha", "gamma", "lambda", "zeta", "iota"]
|
||||
Loading…
Add table
Add a link
Reference in a new issue