Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x | import type { RatePair } from './types'
/** All rate pair definitions — the math/linguistic skeletons for word problems */
export const RATE_PAIRS: RatePair[] = [
// ── Existing (decomposed from original 6 frames) ──────────────
{
id: 'slices-dollars-cost',
category: 'money',
xNoun: { singular: 'slice', plural: 'slices' },
yNoun: { singular: 'dollar', plural: 'dollars' },
rateVerb: { base: 'cost', thirdPerson: 'costs', pastTense: 'cost', gerund: 'costing' },
xUnit: 'slices',
yUnit: '$',
xUnitPosition: 'suffix',
yUnitPosition: 'prefix',
xRole: 'acquired',
},
{
id: 'weeks-inches-grow',
category: 'growth',
xNoun: { singular: 'week', plural: 'weeks' },
yNoun: { singular: 'inch', plural: 'inches' },
rateVerb: { base: 'grow', thirdPerson: 'grows', pastTense: 'grew', gerund: 'growing' },
xUnit: 'weeks',
yUnit: 'inches',
xUnitPosition: 'suffix',
yUnitPosition: 'suffix',
xRole: 'elapsed',
},
{
id: 'hours-miles-travel',
category: 'distance',
xNoun: { singular: 'hour', plural: 'hours' },
yNoun: { singular: 'mile', plural: 'miles' },
rateVerb: {
base: 'travel',
thirdPerson: 'travels',
pastTense: 'traveled',
gerund: 'traveling',
},
xUnit: 'hours',
yUnit: 'miles',
xUnitPosition: 'suffix',
yUnitPosition: 'suffix',
xRole: 'elapsed',
},
{
id: 'weeks-dollars-save',
category: 'money',
xNoun: { singular: 'week', plural: 'weeks' },
yNoun: { singular: 'dollar', plural: 'dollars' },
rateVerb: { base: 'save', thirdPerson: 'saves', pastTense: 'saved', gerund: 'saving' },
xUnit: 'weeks',
yUnit: '$',
xUnitPosition: 'suffix',
yUnitPosition: 'prefix',
xRole: 'elapsed',
},
{
id: 'batches-cups-need',
category: 'cooking',
xNoun: { singular: 'batch', plural: 'batches' },
yNoun: { singular: 'cup', plural: 'cups' },
rateVerb: { base: 'need', thirdPerson: 'needs', pastTense: 'needed', gerund: 'needing' },
xUnit: 'batches',
yUnit: 'cups',
xUnitPosition: 'suffix',
yUnitPosition: 'suffix',
xRole: 'acquired',
},
{
id: 'bracelets-beads-use',
category: 'crafts',
xNoun: { singular: 'bracelet', plural: 'bracelets' },
yNoun: { singular: 'bead', plural: 'beads' },
rateVerb: { base: 'use', thirdPerson: 'uses', pastTense: 'used', gerund: 'using' },
xUnit: 'bracelets',
yUnit: 'beads',
xUnitPosition: 'suffix',
yUnitPosition: 'suffix',
xRole: 'acquired',
},
// ── New rate pairs ─────────────────────────────────────────────
{
id: 'tickets-dollars-cost',
category: 'money',
xNoun: { singular: 'ticket', plural: 'tickets' },
yNoun: { singular: 'dollar', plural: 'dollars' },
rateVerb: { base: 'cost', thirdPerson: 'costs', pastTense: 'cost', gerund: 'costing' },
xUnit: 'tickets',
yUnit: '$',
xUnitPosition: 'suffix',
yUnitPosition: 'prefix',
xRole: 'acquired',
},
{
id: 'laps-meters-run',
category: 'sports',
xNoun: { singular: 'lap', plural: 'laps' },
yNoun: { singular: 'meter', plural: 'meters' },
rateVerb: { base: 'run', thirdPerson: 'runs', pastTense: 'ran', gerund: 'running' },
xUnit: 'laps',
yUnit: 'meters',
xUnitPosition: 'suffix',
yUnitPosition: 'suffix',
xRole: 'acquired',
},
{
id: 'days-pages-read',
category: 'growth',
xNoun: { singular: 'day', plural: 'days' },
yNoun: { singular: 'page', plural: 'pages' },
rateVerb: { base: 'read', thirdPerson: 'reads', pastTense: 'read', gerund: 'reading' },
xUnit: 'days',
yUnit: 'pages',
xUnitPosition: 'suffix',
yUnitPosition: 'suffix',
xRole: 'elapsed',
},
{
id: 'games-points-score',
category: 'sports',
xNoun: { singular: 'game', plural: 'games' },
yNoun: { singular: 'point', plural: 'points' },
rateVerb: { base: 'score', thirdPerson: 'scores', pastTense: 'scored', gerund: 'scoring' },
xUnit: 'games',
yUnit: 'points',
xUnitPosition: 'suffix',
yUnitPosition: 'suffix',
xRole: 'elapsed',
},
{
id: 'stickers-dollars-cost',
category: 'money',
xNoun: { singular: 'sticker', plural: 'stickers' },
yNoun: { singular: 'dollar', plural: 'dollars' },
rateVerb: { base: 'cost', thirdPerson: 'costs', pastTense: 'cost', gerund: 'costing' },
xUnit: 'stickers',
yUnit: '$',
xUnitPosition: 'suffix',
yUnitPosition: 'prefix',
xRole: 'acquired',
},
{
id: 'days-centimeters-grow',
category: 'growth',
xNoun: { singular: 'day', plural: 'days' },
yNoun: { singular: 'centimeter', plural: 'centimeters' },
rateVerb: { base: 'grow', thirdPerson: 'grows', pastTense: 'grew', gerund: 'growing' },
xUnit: 'days',
yUnit: 'cm',
xUnitPosition: 'suffix',
yUnitPosition: 'suffix',
xRole: 'elapsed',
},
{
id: 'scoops-dollars-cost',
category: 'money',
xNoun: { singular: 'scoop', plural: 'scoops' },
yNoun: { singular: 'dollar', plural: 'dollars' },
rateVerb: { base: 'cost', thirdPerson: 'costs', pastTense: 'cost', gerund: 'costing' },
xUnit: 'scoops',
yUnit: '$',
xUnitPosition: 'suffix',
yUnitPosition: 'prefix',
xRole: 'acquired',
},
]
/** Registry: look up a rate pair by id */
export const RATE_PAIR_REGISTRY = new Map<string, RatePair>(RATE_PAIRS.map((p) => [p.id, p]))
|