diff options
| -rw-r--r-- | docs/bqn.js | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/docs/bqn.js b/docs/bqn.js index 88492d59..c294878d 100644 --- a/docs/bqn.js +++ b/docs/bqn.js @@ -573,19 +573,26 @@ let rand = (() => { let r = x ? (()=>randnat(x)) : Math.random; return has(w) ? list(Array(w).fill().map(r)) : r(); }; - let deal = (x,w) => { - reqnat("Deal: π©", x); + let iota = x => Array(x).fill().map((_,i)=>i); + let deal_err = e => (x,w) => { + reqnat(e+": π©", x); if (!has(w)) w=x; else { - reqnat("Deal: π¨", w); if (w>x) throw Error("β’rand.Deal: π¨ must be less than or equal to π©"); + reqnat(e+": π¨", w); if (w>x) throw Error("β’rand."+e+": π¨ must be less than or equal to π©"); } - let r = Array(x).fill().map((_,i)=>i); + let r = iota(x); for (let i=0; i<w; i++) { let j = i + randnat(x-i); let t=r[i]; r[i]=r[j]; r[j]=t; } r.length = w; return list(r); }; - return makens(["Range", "Deal"], [range, deal]); + let deal = deal_err("Deal"); + let subset = (x,w) => { + reqnat("Subset: π©", x); + if (!has(w)) return list(iota(x).filter(_=>Math.random()<0.5)); + return deal_err("Subset")(x,w).sort(); + }; + return makens(["range", "deal", "subset"], [range, deal, subset]); })(); let sysvals = { |
