UNPKG

bridge-scorer

Version:

collection of duplicate bridge scoring algorithms.

145 lines (131 loc) 3.89 kB
'use strict'; var imps = [ { diff: 0, imps: 0}, { diff: 20, imps: 1}, { diff: 50, imps: 2}, { diff: 90, imps: 3}, { diff: 130, imps: 4}, { diff: 170, imps: 5}, { diff: 220, imps: 6}, { diff: 270, imps: 7}, { diff: 320, imps: 8}, { diff: 370, imps: 9}, { diff: 430, imps: 10}, { diff: 500, imps: 11}, { diff: 600, imps: 12}, { diff: 750, imps: 13}, { diff: 900, imps: 14}, { diff: 1100, imps: 15}, { diff: 1300, imps: 16}, { diff: 1500, imps: 17}, { diff: 1750, imps: 18}, { diff: 2000, imps: 19}, { diff: 2250, imps: 20}, { diff: 2500, imps: 21}, { diff: 3000, imps: 22}, { diff: 3500, imps: 23}, { diff: 4000, imps: 24}, ]; function toImps(diff) { var n = imps.length - 1; var sign = 1; if (diff < 0) { sign = -1; diff = 0 - diff; } for (var i = 0; i < n; ++i) { if (imps[i].diff <= diff && diff < imps[i+1].diff) { return imps[i].imps * sign; } } return 24 * sign; } function crossImps(games) { var i, j, game, score, imps; // Get the played games var played = []; for (i = 0; i < games.length; ++i) { game = games[i]; if (game.score === 0) { game.impsNS = { value: -1}; game.impsEW = { value: -1}; played.push({ game: game, scoreNS: 0 }); } else if (game.contract && game.contract.declaror && game.score) { game.impsNS = { value: -1}; game.impsEW = { value: -1}; var playedGame = { game: game, scoreNS: (game.contract.declaror === 'N' || game.contract.declaror === 'S') ? game.score : -game.score }; played.push(playedGame); } } // Assign imps for (i = 0; i < played.length; ++i) { score = played[i].scoreNS; imps = 0; for (j = 0; j < played.length; ++j) { if (i !== j){ imps += toImps(score - played[j].scoreNS); } } played[i].game.impsNS.value = imps / (played.length - 1); played[i].game.impsEW.value = -played[i].game.impsNS.value; } } function pairsDatum(games, f) { var i, game, score, imps; // Get the played games var played = []; for (i = 0; i < games.length; ++i) { game = games[i]; if (game.score === 0) { game.impsNS = { value: -1}; game.impsEW = { value: -1}; played.push({ game: game, scoreNS: 0 }); } else if (game.contract && game.contract.declaror && game.score) { game.impsNS = { value: -1}; game.impsEW = { value: -1}; var playedGame = { game: game, scoreNS: (game.contract.declaror === 'N' || game.contract.declaror === 'S') ? game.score : -game.score }; played.push(playedGame); } } // Determine the datum var datum = f(played); // Assign imps for (i = 0; i < played.length; ++i) { score = played[i].scoreNS; imps = toImps(score - datum); played[i].game.impsNS.value = imps; played[i].game.impsEW.value = -imps; } return datum; } function butler (games) { var datum = function(g) { if (g.length > 3) { g.sort(function (a,b) { return b.scoreNS - a.scoreNS; }); var drops = Math.ceil((g.length - 10) / 15) + 1; g = g.slice(drops, -drops); } var sum = g.reduce(function (a, e) { return a + e.scoreNS; }, 0); return Math.round((sum / g.length) / 10) * 10; }; return pairsDatum(games, datum); } module.exports = { toImps: toImps, crossImps: crossImps, butler: butler };