UNPKG

base-building

Version:

Calculator to help runners increase their weekly base mileage in a consistent fashion

270 lines (228 loc) 7.99 kB
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ // Convert weeks to a more appropriate timescale function makeWeeksHuman(weeks) { if (Math.round(weeks) === 1) { return '1 week'; } if (weeks < 13.035) { return Math.round(weeks) + ' weeks'; } else if (weeks < 52) { return Math.round(weeks / 4.345) + ' months'; } else { return Math.round(10 * weeks / 52) / 10 + ' years'; } } // Calculate the number of miles to run during a specific week of // a training level function mileageAtWeek(week, startingMileage) { // Subtract one from the week to make it zero-based var mod = (week - 1) % 5; if (mod === 0) { return startingMileage; } else if (mod === 1) { return startingMileage * 0.90; } else if (mod === 2) { return startingMileage * 0.85; } else if (mod === 3) { return startingMileage * 0.90; } else if (mod === 4) { return startingMileage; } } // How many weeks to train at a given mileage before adding more? function weeksAtMileage(currentMileage) { var func; // Find the right training level for the current mileage if (currentMileage < 3) { func = lessThan3; } else if (currentMileage < 10) { func = lessThan10; } else if (currentMileage < 20) { func = lessThan20; } else { func = moreThan20; } // Simulate the current training level return func(currentMileage); } // Given a starting and ending mileage, calculate training time function weeksToGoal(currentMileage, goalMileage) { var weekCount = 0; while (currentMileage < goalMileage) { // Simulate the current training level var state = weeksAtMileage(currentMileage); weekCount += state.weeksAtThisLevel; currentMileage = state.milesAtNextLevel; } return weekCount; } // Never prescribe weekly mileage lower than 3 mpw function lessThan3(currentMileage) { return { milesAtNextLevel: 3, weeksAtThisLevel: 1 }; } // Increase weekly mileage by 1 until hitting 10 mpw function lessThan10(currentMileage) { return { milesAtNextLevel: currentMileage + 1, weeksAtThisLevel: 1 }; } // Increase weekly mileage by 10% per week until hitting 20 mpw function lessThan20(currentMileage) { return { milesAtNextLevel: currentMileage * 1.1, weeksAtThisLevel: 1 }; } // Increase weekly mileage at increasingly slow intervals after 20 mpw function moreThan20(currentMileage) { return { milesAtNextLevel: currentMileage * 1.1, weeksAtThisLevel: 9.32002 * Math.log(0.0556632 * currentMileage) }; } module.exports = { weeksToGoal: weeksToGoal, mileageAtWeek: mileageAtWeek, weeksAtMileage: weeksAtMileage, makeWeeksHuman: makeWeeksHuman }; },{}],2:[function(require,module,exports){ var Training = require('../index'); QUnit.test('How long at 2 miles per week?', function(assert) { var duration = Training.makeWeeksHuman( Training.weeksAtMileage(2).weeksAtThisLevel ); assert.equal(duration, '1 week', 'Passed!'); }); QUnit.test('How long at 3 miles per week?', function(assert) { var duration = Training.makeWeeksHuman( Training.weeksAtMileage(3).weeksAtThisLevel ); assert.equal(duration, '1 week', 'Passed!'); }); QUnit.test('How long at 10 miles per week?', function(assert) { var duration = Training.makeWeeksHuman( Training.weeksAtMileage(10).weeksAtThisLevel ); assert.equal(duration, '1 week', 'Passed!'); }); QUnit.test('How long at 20 miles per week?', function(assert) { var duration = Training.makeWeeksHuman( Training.weeksAtMileage(20).weeksAtThisLevel ); assert.equal(duration, '1 week', 'Passed!'); }); QUnit.test('How long at 30 miles per week?', function(assert) { var duration = Training.makeWeeksHuman( Training.weeksAtMileage(30).weeksAtThisLevel ); assert.equal(duration, '5 weeks', 'Passed!'); }); QUnit.test('How long at 40 miles per week?', function(assert) { var duration = Training.makeWeeksHuman( Training.weeksAtMileage(40).weeksAtThisLevel ); assert.equal(duration, '7 weeks', 'Passed!'); }); QUnit.test('How long at 50 miles per week?', function(assert) { var duration = Training.makeWeeksHuman( Training.weeksAtMileage(50).weeksAtThisLevel ); assert.equal(duration, '10 weeks', 'Passed!'); }); QUnit.test('How long at 60 miles per week?', function(assert) { var duration = Training.makeWeeksHuman( Training.weeksAtMileage(60).weeksAtThisLevel ); assert.equal(duration, '11 weeks', 'Passed!'); }); QUnit.test('How long at 70 miles per week?', function(assert) { var duration = Training.makeWeeksHuman( Training.weeksAtMileage(70).weeksAtThisLevel ); assert.equal(duration, '13 weeks', 'Passed!'); }); QUnit.test('How long at 80 miles per week?', function(assert) { var duration = Training.makeWeeksHuman( Training.weeksAtMileage(80).weeksAtThisLevel ); assert.equal(duration, '3 months', 'Passed!'); }); QUnit.test('How long at 90 miles per week?', function(assert) { var duration = Training.makeWeeksHuman( Training.weeksAtMileage(90).weeksAtThisLevel ); assert.equal(duration, '3 months', 'Passed!'); }); QUnit.test('How long at 100 miles per week?', function(assert) { var duration = Training.makeWeeksHuman( Training.weeksAtMileage(100).weeksAtThisLevel ); assert.equal(duration, '4 months', 'Passed!'); }); QUnit.test('How long to train from 0-100 miles per week?', function(assert) { var duration = Training.makeWeeksHuman( Training.weeksToGoal(0, 100) ); assert.equal(duration, '3.2 years', 'Passed!'); }); QUnit.test('How long to train from 0-75 miles per week?', function(assert) { var duration = Training.makeWeeksHuman( Training.weeksToGoal(0, 75) ); assert.equal(duration, '2.3 years', 'Passed!'); }); QUnit.test('How long to train from 0-50 miles per week?', function(assert) { var duration = Training.makeWeeksHuman( Training.weeksToGoal(0, 50) ); assert.equal(duration, '1.2 years', 'Passed!'); }); QUnit.test('How long to train from 0-25 miles per week?', function(assert) { var duration = Training.makeWeeksHuman( Training.weeksToGoal(0, 25) ); assert.equal(duration, '5 months', 'Passed!'); }); QUnit.test('How long to train from 25-50 miles per week?', function(assert) { var duration = Training.makeWeeksHuman( Training.weeksToGoal(25, 50) ); assert.equal(duration, '11 months', 'Passed!'); }); QUnit.test('How long to train from 50-75 miles per week?', function(assert) { var duration = Training.makeWeeksHuman( Training.weeksToGoal(50, 75) ); assert.equal(duration, '1.1 years', 'Passed!'); }); QUnit.test('What mileage at week 1 of 80 miles per week?', function(assert) { var mileage = Training.mileageAtWeek(1, 80); assert.equal(mileage, 80); }); QUnit.test('What mileage at week 2 of 80 miles per week?', function(assert) { var mileage = Training.mileageAtWeek(2, 80); assert.equal(mileage, 72); }); QUnit.test('What mileage at week 3 of 80 miles per week?', function(assert) { var mileage = Training.mileageAtWeek(3, 80); assert.equal(mileage, 68); }); QUnit.test('What mileage at week 4 of 80 miles per week?', function(assert) { var mileage = Training.mileageAtWeek(4, 80); assert.equal(mileage, 72); }); QUnit.test('What mileage at week 5 of 80 miles per week?', function(assert) { var mileage = Training.mileageAtWeek(5, 80); assert.equal(mileage, 80); }); QUnit.test('What mileage at week 6 of 80 miles per week?', function(assert) { var mileage = Training.mileageAtWeek(6, 80); assert.equal(mileage, 80); }); },{"../index":1}]},{},[2]);