diff options
author | Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com> | 2017-08-30 16:36:40 -0400 |
---|---|---|
committer | Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com> | 2017-08-30 16:36:40 -0400 |
commit | a7b971ef64f09a21902f34b6078b01d78dcf73e7 (patch) | |
tree | f3ed0e97fe3f31e8c7ca58e18a5835290e66c755 | |
parent | 5b77a409c912f7251da8c170bd4a3aa8826d989b (diff) |
Implement threshold under
-rw-r--r-- | __tests__/dice.test.js | 23 | ||||
-rw-r--r-- | __tests__/lexer.test.js | 10 | ||||
-rw-r--r-- | __tests__/parser.test.js | 10 | ||||
-rw-r--r-- | index.js | 2 | ||||
-rw-r--r-- | src/dice.js | 16 | ||||
-rw-r--r-- | src/lexer.js | 1 | ||||
-rw-r--r-- | src/parser.js | 1 |
7 files changed, 62 insertions, 1 deletions
diff --git a/__tests__/dice.test.js b/__tests__/dice.test.js index 272f436..fb8a155 100644 --- a/__tests__/dice.test.js +++ b/__tests__/dice.test.js @@ -13,7 +13,8 @@ const { keepLow, again, againUnder, - threshold + threshold, + thresholdLow } = require('../src/dice.js') const defaultNumberRolls = 500 @@ -625,4 +626,24 @@ describe('threshold', () => { } }) }) + + describe('4t3d10', () => { + const die = thresholdLow(constant(4), d(constant(3), constant(10))) + + testDie(die, { + diceCount: 3, + average: { + average: 1.2 + }, + variance: { + variance: 0.72 + }, + bounds: { + low: 0, + high: 3, + expectLow: true, + expectHigh: true + } + }) + }) }) diff --git a/__tests__/lexer.test.js b/__tests__/lexer.test.js index 25ef816..b51c0f9 100644 --- a/__tests__/lexer.test.js +++ b/__tests__/lexer.test.js @@ -225,5 +225,15 @@ describe('lex', () => { { type: 'constant', value: 10 } ]) }) + + test('8t3d10', () => { + expect(lex('8t3d10')).toEqual([ + { type: 'constant', value: 8 }, + { type: 't' }, + { type: 'constant', value: 3 }, + { type: 'd' }, + { type: 'constant', value: 10 } + ]) + }) }) }) diff --git a/__tests__/parser.test.js b/__tests__/parser.test.js index ad67fc4..6e575b6 100644 --- a/__tests__/parser.test.js +++ b/__tests__/parser.test.js @@ -241,6 +241,16 @@ describe('parse', () => { right: { type: 'constant', value: 8 } } }) + + expect(parse('7t4d8')).toEqual({ + type: 't', + left: { type: 'constant', value: 7 }, + right: { + type: 'd', + left: { type: 'constant', value: 4 }, + right: { type: 'constant', value: 8 } + } + }) }) describe('parsing parentheses', () => { @@ -21,6 +21,8 @@ const interpret = tree => { return D.againUnder(interpret(tree.left), interpret(tree.right)) case 'T': return D.threshold(interpret(tree.left), interpret(tree.right)) + case 't': + return D.thresholdLow(interpret(tree.left), interpret(tree.right)) case 'add': return D.add(interpret(tree.left), interpret(tree.right)) case 'subtract': diff --git a/src/dice.js b/src/dice.js index e580c9d..53d337d 100644 --- a/src/dice.js +++ b/src/dice.js @@ -214,6 +214,21 @@ const threshold = (die1, die2) => { } } +const thresholdLow = (die1, die2) => { + return () => { + const cutoff = roll(die1) + + return die2().map(die => { + return () => { + if (die() <= cutoff) { + return 1 + } else { + return 0 + } + } + }) + } +} exports.pool = pool exports.roll = roll @@ -231,3 +246,4 @@ exports.keepLow = keepLow exports.again = again exports.againUnder = againUnder exports.threshold = threshold +exports.thresholdLow = thresholdLow diff --git a/src/lexer.js b/src/lexer.js index f33dc87..ba3d3a5 100644 --- a/src/lexer.js +++ b/src/lexer.js @@ -29,6 +29,7 @@ newLexemeType('k', 'k') newLexemeType('A', 'A') newLexemeType('a', 'a') newLexemeType('T', 'T') +newLexemeType('t', 't') const lex = (expressionString) => { let lexemes = [] diff --git a/src/parser.js b/src/parser.js index f8e2a5b..adb4b9b 100644 --- a/src/parser.js +++ b/src/parser.js @@ -67,6 +67,7 @@ newDieOperation('k') newDieOperation('A') newDieOperation('a') newDieOperation('T') +newDieOperation('t') newInfix('bigPlus', 20, { type: 'add' }) newInfix('bigMinus', 20, { type: 'subtract' }) |