y-ary 0.0.2 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -66,6 +66,81 @@ var arrayWithBankNums = (bankNums, dims, extraRules) => {
66
66
  }
67
67
  return flatArray;
68
68
  };
69
+ function shuffleArray(array) {
70
+ for (let i = array.length - 1; i > 0; i--) {
71
+ const j = Math.floor(Math.random() * (i + 1));
72
+ [array[i], array[j]] = [array[j], array[i]];
73
+ }
74
+ return array;
75
+ }
76
+ var orderedArrayWithBankNums = (bankNums, dims, extraRules) => {
77
+ const is2D = dims.length === 2;
78
+ const rowSize = is2D ? dims[1] : dims[0];
79
+ const totalElements = is2D ? dims[0] * dims[1] : dims[0];
80
+ const sortedNumbers = Object.keys(bankNums).map(Number).sort((a, b) => a - b);
81
+ function solve(flatArray, usageCount) {
82
+ if (flatArray.length === totalElements) {
83
+ return flatArray;
84
+ }
85
+ const posInRow = flatArray.length % rowSize;
86
+ const minValue = posInRow === 0 ? -Infinity : flatArray[flatArray.length - 1];
87
+ const candidates = sortedNumbers.filter((num) => {
88
+ const usage = usageCount[num] || 0;
89
+ return usage < bankNums[num] && num > minValue;
90
+ });
91
+ const shuffled = shuffleArray([...candidates]);
92
+ for (const num of shuffled) {
93
+ if (extraRules && !extraRules(num, flatArray, rowSize)) {
94
+ continue;
95
+ }
96
+ const newArray = [...flatArray, num];
97
+ const newUsage = { ...usageCount, [num]: (usageCount[num] || 0) + 1 };
98
+ const result2 = solve(newArray, newUsage);
99
+ if (result2 !== null) {
100
+ return result2;
101
+ }
102
+ }
103
+ return null;
104
+ }
105
+ let result = null;
106
+ for (let attempt = 0; attempt < 50 && result === null; attempt++) {
107
+ result = solve([], {});
108
+ }
109
+ if (result === null) {
110
+ console.warn("Could not generate valid array with given constraints");
111
+ result = [];
112
+ }
113
+ if (is2D && result.length > 0) {
114
+ const matrix = [];
115
+ const cols = dims[1];
116
+ for (let row = 0; row < dims[0]; row++) {
117
+ const rowArray = [];
118
+ for (let col = 0; col < cols; col++) {
119
+ const index = row * cols + col;
120
+ if (index < result.length) {
121
+ rowArray.push(result[index]);
122
+ }
123
+ }
124
+ if (rowArray.length > 0) {
125
+ matrix.push(rowArray);
126
+ }
127
+ }
128
+ return matrix;
129
+ }
130
+ return result;
131
+ };
132
+ var decompressRow = (compressedRow, size) => {
133
+ const result = new Array(size).fill(false);
134
+ for (const index of compressedRow) {
135
+ if (index >= 1 && index <= size) {
136
+ result[index - 1] = true;
137
+ }
138
+ }
139
+ return result;
140
+ };
141
+ var decompressMatrix = (compressedMatrix, rowSize) => {
142
+ return compressedMatrix.map((row) => decompressRow(row, rowSize));
143
+ };
69
144
 
70
145
  // src/algorithms/arrayRules.ts
71
146
  var onlyEven = (num) => num % 2 === 0;
@@ -232,6 +307,8 @@ exports.ascending = ascending;
232
307
  exports.averageInRange = averageInRange;
233
308
  exports.balanceEvenOdd = balanceEvenOdd;
234
309
  exports.byPosition = byPosition;
310
+ exports.decompressMatrix = decompressMatrix;
311
+ exports.decompressRow = decompressRow;
235
312
  exports.descending = descending;
236
313
  exports.different = different;
237
314
  exports.divisibleBy = divisibleBy;
@@ -254,6 +331,7 @@ exports.onlyOdd = onlyOdd;
254
331
  exports.onlyPrimes = onlyPrimes;
255
332
  exports.onlySquares = onlySquares;
256
333
  exports.or = or;
334
+ exports.orderedArrayWithBankNums = orderedArrayWithBankNums;
257
335
  exports.sumGreaterThan = sumGreaterThan;
258
336
  exports.sumLessThan = sumLessThan;
259
337
  exports.valueAtPositions = valueAtPositions;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/formulas/formulaInterpreter.ts","../src/algorithms/arrayGens.ts","../src/algorithms/arrayRules.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * Interprets a mathematical formula by replacing variables with their values\r\n * @param formula - Mathematical formula as a string (e.g., 'x/1 + y')\r\n * @param where - Object mapping variable names to their numeric values (e.g., {x: 4, y: 6})\r\n * @returns The evaluated result of the formula\r\n */\r\nexport const formulaInterpreter = (formula: string, where: { [key: string]: number }): number => {\r\n // Replace each variable in the formula with its value from the where object\r\n let processedFormula = formula;\r\n\r\n for (const [variable, value] of Object.entries(where)) {\r\n // Use regex with word boundaries to replace only complete variable names\r\n const regex = new RegExp(`\\\\b${variable}\\\\b`, 'g');\r\n processedFormula = processedFormula.replace(regex, String(value));\r\n }\r\n\r\n // Evaluate the mathematical expression\r\n // Using Function constructor is safer than eval for mathematical expressions\r\n try {\r\n const result = new Function(`return ${processedFormula}`)();\r\n return result;\r\n } catch (error) {\r\n throw new Error(`Invalid formula or evaluation error: ${error instanceof Error ? error.message : String(error)}`);\r\n }\r\n}","/**\r\n * Generates an array or matrix by randomly selecting numbers from a bank with occurrence limits.\r\n * \r\n * @param bankNums - Object where keys are the numbers to use and values are the maximum \r\n * number of times each number can appear in the array.\r\n * Example: { 1: 3, 2: 3, 3: 3 } means number 1 can appear up to 3 times,\r\n * number 2 can appear up to 3 times, etc.\r\n * \r\n * @param dims - Array dimensions:\r\n * - [length]: Creates a 1D array with the specified length\r\n * - [rows, cols]: Creates a 2D array (matrix) with the specified rows and columns\r\n * \r\n * @param extraRules - Optional validation callback that receives:\r\n * - candidateNum: The number being considered for addition\r\n * - currentArray: The flattened array built so far (for 2D arrays, this is all elements)\r\n * Returns true to allow the number, false to reject it and try another.\r\n * \r\n * @returns A 1D array or 2D array (matrix) of numbers randomly selected from bankNums,\r\n * respecting occurrence limits and any extra validation rules.\r\n * \r\n * @example\r\n * // Generate 1D array of length 5\r\n * const result1D = arrayWithBankNums(\r\n * { 1: 3, 2: 3, 3: 3, 4: 3, 5: 3, 6: 3, 7: 3, 8: 3, 9: 3, 10: 3 },\r\n * [5]\r\n * );\r\n * // Possible result: [3, 7, 1, 9, 2]\r\n * \r\n * @example\r\n * // Generate 2D array (matrix) of 3 rows x 4 columns\r\n * const result2D = arrayWithBankNums(\r\n * { 1: 3, 2: 3, 3: 3, 4: 3, 5: 3, 6: 3 },\r\n * [3, 4]\r\n * );\r\n * // Possible result: [[1, 3, 2, 5], [4, 1, 6, 3], [2, 5, 4, 6]]\r\n * \r\n * @example\r\n * // With extraRules: only allow even numbers\r\n * const result = arrayWithBankNums(\r\n * { 1: 3, 2: 3, 3: 3, 4: 3, 5: 3, 6: 3 },\r\n * [4],\r\n * (num, arr) => num % 2 === 0\r\n * );\r\n * // Possible result: [2, 4, 6, 2]\r\n */\r\nconst arrayWithBankNums = (\r\n bankNums: { [n: number]: number },\r\n dims: number[],\r\n extraRules?: (candidateNum: number, currentArray: number[]) => boolean\r\n): number[] | number[][] => {\r\n // Determine if we're creating a 1D or 2D array\r\n const is2D = dims.length === 2;\r\n const totalElements = is2D ? dims[0] * dims[1] : dims[0];\r\n\r\n const flatArray: number[] = [];\r\n\r\n // Track how many times each number has been used\r\n const usageCount: { [n: number]: number } = {};\r\n\r\n // Get available numbers from bankNums\r\n const availableNumbers = Object.keys(bankNums).map(Number);\r\n\r\n // Build flat array up to the total number of elements needed\r\n for (let i = 0; i < totalElements; i++) {\r\n let candidateNum: number | null = null;\r\n let attempts = 0;\r\n const maxAttempts = 1000; // Prevent infinite loops\r\n\r\n // Try to find a valid number\r\n while (candidateNum === null && attempts < maxAttempts) {\r\n attempts++;\r\n\r\n // Select a random number from available numbers\r\n const randomIndex = Math.floor(Math.random() * availableNumbers.length);\r\n const selectedNum = availableNumbers[randomIndex];\r\n\r\n // Check if this number hasn't exceeded its limit\r\n const currentUsage = usageCount[selectedNum] || 0;\r\n const maxUsage = bankNums[selectedNum];\r\n\r\n if (currentUsage >= maxUsage) {\r\n continue; // This number is exhausted, try another\r\n }\r\n\r\n // Apply extra rules if provided\r\n const passesExtraRules = extraRules ? extraRules(selectedNum, flatArray) : true;\r\n\r\n if (passesExtraRules) {\r\n candidateNum = selectedNum;\r\n }\r\n }\r\n\r\n // If we found a valid number, add it to the array\r\n if (candidateNum !== null) {\r\n flatArray.push(candidateNum);\r\n usageCount[candidateNum] = (usageCount[candidateNum] || 0) + 1;\r\n } else {\r\n // Could not find a valid number after max attempts\r\n console.warn(`Could not find valid number at position ${i} after ${maxAttempts} attempts`);\r\n break;\r\n }\r\n }\r\n\r\n // If 2D array requested, reshape the flat array into a matrix\r\n if (is2D) {\r\n const rows = dims[0];\r\n const cols = dims[1];\r\n const matrix: number[][] = [];\r\n\r\n for (let row = 0; row < rows; row++) {\r\n const rowArray: number[] = [];\r\n for (let col = 0; col < cols; col++) {\r\n const index = row * cols + col;\r\n if (index < flatArray.length) {\r\n rowArray.push(flatArray[index]);\r\n }\r\n }\r\n matrix.push(rowArray);\r\n }\r\n\r\n return matrix;\r\n }\r\n\r\n // Return 1D array\r\n return flatArray;\r\n};\r\n\r\nexport { arrayWithBankNums };","/**\r\n * Array Rules - Colección de funciones de validación para usar con arrayWithBankNums\r\n * \r\n * Estas funciones pueden ser usadas como el parámetro `extraRules` en arrayWithBankNums\r\n * para aplicar restricciones adicionales durante la generación del array.\r\n */\r\n\r\n/**\r\n * Type definition for array rule functions\r\n */\r\nexport type ArrayRule = (candidateNum: number, currentArray: number[]) => boolean;\r\n\r\n// ============================================================================\r\n// REGLAS BÁSICAS DE PARIDAD\r\n// ============================================================================\r\n\r\n/**\r\n * Solo permite números pares\r\n * @example arrayWithBankNums(bankNums, [5], onlyEven)\r\n */\r\nexport const onlyEven: ArrayRule = (num) => num % 2 === 0;\r\n\r\n/**\r\n * Solo permite números impares\r\n * @example arrayWithBankNums(bankNums, [5], onlyOdd)\r\n */\r\nexport const onlyOdd: ArrayRule = (num) => num % 2 !== 0;\r\n\r\n// ============================================================================\r\n// REGLAS DE RANGO\r\n// ============================================================================\r\n\r\n/**\r\n * Crea una regla que solo permite números dentro de un rango específico\r\n * @param min - Valor mínimo (inclusivo)\r\n * @param max - Valor máximo (inclusivo)\r\n * @example arrayWithBankNums(bankNums, [5], inRange(1, 5))\r\n */\r\nexport const inRange = (min: number, max: number): ArrayRule => {\r\n return (num) => num >= min && num <= max;\r\n};\r\n\r\n/**\r\n * Crea una regla que excluye números dentro de un rango específico\r\n * @param min - Valor mínimo a excluir (inclusivo)\r\n * @param max - Valor máximo a excluir (inclusivo)\r\n * @example arrayWithBankNums(bankNums, [5], notInRange(3, 7))\r\n */\r\nexport const notInRange = (min: number, max: number): ArrayRule => {\r\n return (num) => num < min || num > max;\r\n};\r\n\r\n// ============================================================================\r\n// REGLAS DE REPETICIÓN\r\n// ============================================================================\r\n\r\n/**\r\n * No permite números consecutivos repetidos\r\n * @example arrayWithBankNums(bankNums, [5], noConsecutiveRepeats)\r\n */\r\nexport const noConsecutiveRepeats: ArrayRule = (num, arr) => {\r\n if (arr.length === 0) return true;\r\n return arr[arr.length - 1] !== num;\r\n};\r\n\r\n/**\r\n * No permite que un número aparezca más de N veces en el array\r\n * @param maxCount - Número máximo de veces que puede aparecer\r\n * @example arrayWithBankNums(bankNums, [10], maxOccurrences(2))\r\n */\r\nexport const maxOccurrences = (maxCount: number): ArrayRule => {\r\n return (num, arr) => {\r\n const count = arr.filter(n => n === num).length;\r\n return count < maxCount;\r\n };\r\n};\r\n\r\n/**\r\n * No permite duplicados en el array (cada número solo puede aparecer una vez)\r\n * @example arrayWithBankNums(bankNums, [5], noDuplicates)\r\n */\r\nexport const noDuplicates: ArrayRule = (num, arr) => {\r\n return !arr.includes(num);\r\n};\r\n\r\n/**\r\n * No permite que el mismo número aparezca en las últimas N posiciones\r\n * @param positions - Número de posiciones a verificar\r\n * @example arrayWithBankNums(bankNums, [10], noRepeatInLast(3))\r\n */\r\nexport const noRepeatInLast = (positions: number): ArrayRule => {\r\n return (num, arr) => {\r\n const lastN = arr.slice(-positions);\r\n return !lastN.includes(num);\r\n };\r\n};\r\n\r\n// ============================================================================\r\n// REGLAS DE SUMA Y PROMEDIO\r\n// ============================================================================\r\n\r\n/**\r\n * Solo permite números que mantengan la suma total por debajo de un límite\r\n * @param maxSum - Suma máxima permitida\r\n * @example arrayWithBankNums(bankNums, [5], sumLessThan(20))\r\n */\r\nexport const sumLessThan = (maxSum: number): ArrayRule => {\r\n return (num, arr) => {\r\n const currentSum = arr.reduce((sum, n) => sum + n, 0);\r\n return currentSum + num < maxSum;\r\n };\r\n};\r\n\r\n/**\r\n * Solo permite números que mantengan la suma total por encima de un límite\r\n * @param minSum - Suma mínima requerida\r\n * @example arrayWithBankNums(bankNums, [5], sumGreaterThan(10))\r\n */\r\nexport const sumGreaterThan = (minSum: number): ArrayRule => {\r\n return (num, arr) => {\r\n const currentSum = arr.reduce((sum, n) => sum + n, 0);\r\n return currentSum + num > minSum;\r\n };\r\n};\r\n\r\n/**\r\n * Solo permite números que mantengan el promedio dentro de un rango\r\n * @param min - Promedio mínimo\r\n * @param max - Promedio máximo\r\n * @example arrayWithBankNums(bankNums, [5], averageInRange(3, 7))\r\n */\r\nexport const averageInRange = (min: number, max: number): ArrayRule => {\r\n return (num, arr) => {\r\n if (arr.length === 0) return true;\r\n const newSum = arr.reduce((sum, n) => sum + n, 0) + num;\r\n const newAverage = newSum / (arr.length + 1);\r\n return newAverage >= min && newAverage <= max;\r\n };\r\n};\r\n\r\n// ============================================================================\r\n// REGLAS DE SECUENCIA Y PATRÓN\r\n// ============================================================================\r\n\r\n/**\r\n * Solo permite números que sean mayores que el último número en el array (orden ascendente)\r\n * @example arrayWithBankNums(bankNums, [5], ascending)\r\n */\r\nexport const ascending: ArrayRule = (num, arr) => {\r\n if (arr.length === 0) return true;\r\n return num > arr[arr.length - 1];\r\n};\r\n\r\n/**\r\n * Solo permite números que sean menores que el último número en el array (orden descendente)\r\n * @example arrayWithBankNums(bankNums, [5], descending)\r\n */\r\nexport const descending: ArrayRule = (num, arr) => {\r\n if (arr.length === 0) return true;\r\n return num < arr[arr.length - 1];\r\n};\r\n\r\n/**\r\n * Solo permite números que sean diferentes del último número (no estrictamente ascendente/descendente)\r\n * @example arrayWithBankNums(bankNums, [5], different)\r\n */\r\nexport const different: ArrayRule = (num, arr) => {\r\n if (arr.length === 0) return true;\r\n return num !== arr[arr.length - 1];\r\n};\r\n\r\n/**\r\n * Alterna entre números pares e impares\r\n * @example arrayWithBankNums(bankNums, [6], alternateEvenOdd)\r\n */\r\nexport const alternateEvenOdd: ArrayRule = (num, arr) => {\r\n if (arr.length === 0) return true;\r\n const lastWasEven = arr[arr.length - 1] % 2 === 0;\r\n const currentIsEven = num % 2 === 0;\r\n return lastWasEven !== currentIsEven;\r\n};\r\n\r\n// ============================================================================\r\n// REGLAS DE DIVISIBILIDAD\r\n// ============================================================================\r\n\r\n/**\r\n * Solo permite números divisibles por un divisor específico\r\n * @param divisor - El divisor\r\n * @example arrayWithBankNums(bankNums, [5], divisibleBy(3))\r\n */\r\nexport const divisibleBy = (divisor: number): ArrayRule => {\r\n return (num) => num % divisor === 0;\r\n};\r\n\r\n/**\r\n * Solo permite números que NO sean divisibles por un divisor específico\r\n * @param divisor - El divisor\r\n * @example arrayWithBankNums(bankNums, [5], notDivisibleBy(5))\r\n */\r\nexport const notDivisibleBy = (divisor: number): ArrayRule => {\r\n return (num) => num % divisor !== 0;\r\n};\r\n\r\n// ============================================================================\r\n// REGLAS DE POSICIÓN\r\n// ============================================================================\r\n\r\n/**\r\n * Aplica diferentes reglas según la posición en el array\r\n * @param rules - Objeto que mapea índices a reglas\r\n * @example arrayWithBankNums(bankNums, [5], byPosition({ 0: onlyEven, 1: onlyOdd }))\r\n */\r\nexport const byPosition = (rules: { [index: number]: ArrayRule }): ArrayRule => {\r\n return (num, arr) => {\r\n const position = arr.length;\r\n const rule = rules[position];\r\n return rule ? rule(num, arr) : true;\r\n };\r\n};\r\n\r\n/**\r\n * Aplica una regla solo en posiciones pares (0, 2, 4, ...)\r\n * @param rule - La regla a aplicar\r\n * @example arrayWithBankNums(bankNums, [6], onEvenPositions(onlyEven))\r\n */\r\nexport const onEvenPositions = (rule: ArrayRule): ArrayRule => {\r\n return (num, arr) => {\r\n const position = arr.length;\r\n return position % 2 === 0 ? rule(num, arr) : true;\r\n };\r\n};\r\n\r\n/**\r\n * Aplica una regla solo en posiciones impares (1, 3, 5, ...)\r\n * @param rule - La regla a aplicar\r\n * @example arrayWithBankNums(bankNums, [6], onOddPositions(onlyOdd))\r\n */\r\nexport const onOddPositions = (rule: ArrayRule): ArrayRule => {\r\n return (num, arr) => {\r\n const position = arr.length;\r\n return position % 2 !== 0 ? rule(num, arr) : true;\r\n };\r\n};\r\n\r\n// ============================================================================\r\n// COMBINADORES DE REGLAS\r\n// ============================================================================\r\n\r\n/**\r\n * Combina múltiples reglas con AND (todas deben cumplirse)\r\n * @param rules - Array de reglas a combinar\r\n * @example arrayWithBankNums(bankNums, [5], and([onlyEven, inRange(2, 8)]))\r\n */\r\nexport const and = (rules: ArrayRule[]): ArrayRule => {\r\n return (num, arr) => {\r\n return rules.every(rule => rule(num, arr));\r\n };\r\n};\r\n\r\n/**\r\n * Combina múltiples reglas con OR (al menos una debe cumplirse)\r\n * @param rules - Array de reglas a combinar\r\n * @example arrayWithBankNums(bankNums, [5], or([onlyEven, divisibleBy(3)]))\r\n */\r\nexport const or = (rules: ArrayRule[]): ArrayRule => {\r\n return (num, arr) => {\r\n return rules.some(rule => rule(num, arr));\r\n };\r\n};\r\n\r\n/**\r\n * Invierte una regla (NOT)\r\n * @param rule - La regla a invertir\r\n * @example arrayWithBankNums(bankNums, [5], not(onlyEven)) // Solo impares\r\n */\r\nexport const not = (rule: ArrayRule): ArrayRule => {\r\n return (num, arr) => {\r\n return !rule(num, arr);\r\n };\r\n};\r\n\r\n// ============================================================================\r\n// REGLAS AVANZADAS\r\n// ============================================================================\r\n\r\n/**\r\n * Solo permite números primos\r\n * @example arrayWithBankNums(bankNums, [5], onlyPrimes)\r\n */\r\nexport const onlyPrimes: ArrayRule = (num) => {\r\n if (num < 2) return false;\r\n for (let i = 2; i <= Math.sqrt(num); i++) {\r\n if (num % i === 0) return false;\r\n }\r\n return true;\r\n};\r\n\r\n/**\r\n * Solo permite números que sean cuadrados perfectos\r\n * @example arrayWithBankNums(bankNums, [5], onlySquares)\r\n */\r\nexport const onlySquares: ArrayRule = (num) => {\r\n const sqrt = Math.sqrt(num);\r\n return sqrt === Math.floor(sqrt);\r\n};\r\n\r\n/**\r\n * Asegura que la diferencia entre números consecutivos no exceda un límite\r\n * @param maxDiff - Diferencia máxima permitida\r\n * @example arrayWithBankNums(bankNums, [5], maxDifference(3))\r\n */\r\nexport const maxDifference = (maxDiff: number): ArrayRule => {\r\n return (num, arr) => {\r\n if (arr.length === 0) return true;\r\n const diff = Math.abs(num - arr[arr.length - 1]);\r\n return diff <= maxDiff;\r\n };\r\n};\r\n\r\n/**\r\n * Asegura que la diferencia entre números consecutivos sea al menos un mínimo\r\n * @param minDiff - Diferencia mínima requerida\r\n * @example arrayWithBankNums(bankNums, [5], minDifference(2))\r\n */\r\nexport const minDifference = (minDiff: number): ArrayRule => {\r\n return (num, arr) => {\r\n if (arr.length === 0) return true;\r\n const diff = Math.abs(num - arr[arr.length - 1]);\r\n return diff >= minDiff;\r\n };\r\n};\r\n\r\n/**\r\n * Mantiene un balance entre números pares e impares\r\n * @param maxImbalance - Diferencia máxima permitida entre cantidad de pares e impares\r\n * @example arrayWithBankNums(bankNums, [10], balanceEvenOdd(2))\r\n */\r\nexport const balanceEvenOdd = (maxImbalance: number = 1): ArrayRule => {\r\n return (num, arr) => {\r\n const evenCount = arr.filter(n => n % 2 === 0).length;\r\n const oddCount = arr.length - evenCount;\r\n const isEven = num % 2 === 0;\r\n\r\n if (isEven) {\r\n return (evenCount + 1) - oddCount <= maxImbalance;\r\n } else {\r\n return (oddCount + 1) - evenCount <= maxImbalance;\r\n }\r\n };\r\n};\r\n\r\n/**\r\n * Solo permite números en posiciones específicas del array\r\n * @param allowedPositions - Array de posiciones permitidas (0-indexed)\r\n * @param value - El valor que solo puede aparecer en esas posiciones\r\n * @example arrayWithBankNums(bankNums, [5], valueAtPositions([0, 2, 4], 7))\r\n */\r\nexport const valueAtPositions = (allowedPositions: number[], value: number): ArrayRule => {\r\n return (num, arr) => {\r\n const currentPosition = arr.length;\r\n if (num === value) {\r\n return allowedPositions.includes(currentPosition);\r\n }\r\n return true;\r\n };\r\n};\r\n","/**\r\n * Y-ary package entry point\r\n * Export your public API here\r\n */\r\n\r\nexport function hello(name: string): string {\r\n return `Hello, ${name}!`;\r\n}\r\n\r\n// Export formula interpreter\r\nexport { formulaInterpreter } from './formulas/formulaInterpreter';\r\n\r\n// Export array generation\r\nexport { arrayWithBankNums } from './algorithms/arrayGens';\r\n\r\n// Export all array validation rules\r\nexport * from './algorithms/arrayRules';\r\n\r\n// Export types\r\nexport type { };\r\n"]}
1
+ {"version":3,"sources":["../src/formulas/formulaInterpreter.ts","../src/algorithms/arrayGens.ts","../src/algorithms/arrayRules.ts","../src/index.ts"],"names":["result"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * Interprets a mathematical formula by replacing variables with their values\r\n * @param formula - Mathematical formula as a string (e.g., 'x/1 + y')\r\n * @param where - Object mapping variable names to their numeric values (e.g., {x: 4, y: 6})\r\n * @returns The evaluated result of the formula\r\n */\r\nexport const formulaInterpreter = (formula: string, where: { [key: string]: number }): number => {\r\n // Replace each variable in the formula with its value from the where object\r\n let processedFormula = formula;\r\n\r\n for (const [variable, value] of Object.entries(where)) {\r\n // Use regex with word boundaries to replace only complete variable names\r\n const regex = new RegExp(`\\\\b${variable}\\\\b`, 'g');\r\n processedFormula = processedFormula.replace(regex, String(value));\r\n }\r\n\r\n // Evaluate the mathematical expression\r\n // Using Function constructor is safer than eval for mathematical expressions\r\n try {\r\n const result = new Function(`return ${processedFormula}`)();\r\n return result;\r\n } catch (error) {\r\n throw new Error(`Invalid formula or evaluation error: ${error instanceof Error ? error.message : String(error)}`);\r\n }\r\n}","/**\r\n * Generates an array or matrix by randomly selecting numbers from a bank with occurrence limits.\r\n * \r\n * @param bankNums - Object where keys are the numbers to use and values are the maximum \r\n * number of times each number can appear in the array.\r\n * Example: { 1: 3, 2: 3, 3: 3 } means number 1 can appear up to 3 times,\r\n * number 2 can appear up to 3 times, etc.\r\n * \r\n * @param dims - Array dimensions:\r\n * - [length]: Creates a 1D array with the specified length\r\n * - [rows, cols]: Creates a 2D array (matrix) with the specified rows and columns\r\n * \r\n * @param extraRules - Optional validation callback that receives:\r\n * - candidateNum: The number being considered for addition\r\n * - currentArray: The flattened array built so far (for 2D arrays, this is all elements)\r\n * Returns true to allow the number, false to reject it and try another.\r\n * \r\n * @returns A 1D array or 2D array (matrix) of numbers randomly selected from bankNums,\r\n * respecting occurrence limits and any extra validation rules.\r\n */\r\nconst arrayWithBankNums = (\r\n bankNums: { [n: number]: number },\r\n dims: number[],\r\n extraRules?: (candidateNum: number, currentArray: number[]) => boolean\r\n): number[] | number[][] => {\r\n const is2D = dims.length === 2;\r\n const totalElements = is2D ? dims[0] * dims[1] : dims[0];\r\n\r\n const flatArray: number[] = [];\r\n const usageCount: { [n: number]: number } = {};\r\n const availableNumbers = Object.keys(bankNums).map(Number);\r\n\r\n for (let i = 0; i < totalElements; i++) {\r\n let candidateNum: number | null = null;\r\n let attempts = 0;\r\n const maxAttempts = 1000;\r\n\r\n while (candidateNum === null && attempts < maxAttempts) {\r\n attempts++;\r\n const randomIndex = Math.floor(Math.random() * availableNumbers.length);\r\n const selectedNum = availableNumbers[randomIndex];\r\n const currentUsage = usageCount[selectedNum] || 0;\r\n const maxUsage = bankNums[selectedNum];\r\n\r\n if (currentUsage >= maxUsage) {\r\n continue;\r\n }\r\n\r\n const passesExtraRules = extraRules ? extraRules(selectedNum, flatArray) : true;\r\n if (passesExtraRules) {\r\n candidateNum = selectedNum;\r\n }\r\n }\r\n\r\n if (candidateNum !== null) {\r\n flatArray.push(candidateNum);\r\n usageCount[candidateNum] = (usageCount[candidateNum] || 0) + 1;\r\n } else {\r\n console.warn(`Could not find valid number at position ${i} after ${maxAttempts} attempts`);\r\n break;\r\n }\r\n }\r\n\r\n if (is2D) {\r\n const rows = dims[0];\r\n const cols = dims[1];\r\n const matrix: number[][] = [];\r\n\r\n for (let row = 0; row < rows; row++) {\r\n const rowArray: number[] = [];\r\n for (let col = 0; col < cols; col++) {\r\n const index = row * cols + col;\r\n if (index < flatArray.length) {\r\n rowArray.push(flatArray[index]);\r\n }\r\n }\r\n matrix.push(rowArray);\r\n }\r\n return matrix;\r\n }\r\n\r\n return flatArray;\r\n};\r\n\r\n/**\r\n * Fisher-Yates shuffle algorithm\r\n */\r\nfunction shuffleArray<T>(array: T[]): T[] {\r\n for (let i = array.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1));\r\n [array[i], array[j]] = [array[j], array[i]];\r\n }\r\n return array;\r\n}\r\n\r\n/**\r\n * Generates an array or matrix with ORDERED selection from a bank of numbers.\r\n * Unlike arrayWithBankNums (which selects randomly), this function uses backtracking\r\n * to ensure ascending order within each row while respecting all constraints.\r\n * \r\n * Key difference: Each row starts fresh for ordering purposes, allowing patterns like:\r\n * - Row 1: [1, 4, 5]\r\n * - Row 2: [1, 2, 5] (starts from 1 again, not continuation)\r\n * \r\n * @param bankNums - Object where keys are the numbers to use and values are the maximum \r\n * number of times each number can appear in the array.\r\n * \r\n * @param dims - Array dimensions:\r\n * - [length]: Creates a 1D array with the specified length\r\n * - [rows, cols]: Creates a 2D array (matrix) with the specified rows and columns\r\n * \r\n * @param extraRules - Optional validation callback that receives:\r\n * - candidateNum: The number being considered for addition\r\n * - currentArray: The flattened array built so far\r\n * - rowSize: The size of each row (for 2D arrays) or total length (for 1D)\r\n * Returns true to allow the number, false to reject it.\r\n * \r\n * @returns A 1D array or 2D array (matrix) with ascending numbers per row.\r\n */\r\nconst orderedArrayWithBankNums = (\r\n bankNums: { [n: number]: number },\r\n dims: number[],\r\n extraRules?: (candidateNum: number, currentArray: number[], rowSize: number) => boolean\r\n): number[] | number[][] => {\r\n const is2D = dims.length === 2;\r\n const rowSize = is2D ? dims[1] : dims[0];\r\n const totalElements = is2D ? dims[0] * dims[1] : dims[0];\r\n\r\n const sortedNumbers = Object.keys(bankNums).map(Number).sort((a, b) => a - b);\r\n\r\n // Recursive backtracking solver\r\n function solve(\r\n flatArray: number[],\r\n usageCount: { [n: number]: number }\r\n ): number[] | null {\r\n if (flatArray.length === totalElements) {\r\n return flatArray;\r\n }\r\n\r\n const posInRow = flatArray.length % rowSize;\r\n const minValue = posInRow === 0 ? -Infinity : flatArray[flatArray.length - 1];\r\n\r\n const candidates = sortedNumbers.filter(num => {\r\n const usage = usageCount[num] || 0;\r\n return usage < bankNums[num] && num > minValue;\r\n });\r\n\r\n const shuffled = shuffleArray([...candidates]);\r\n\r\n for (const num of shuffled) {\r\n if (extraRules && !extraRules(num, flatArray, rowSize)) {\r\n continue;\r\n }\r\n\r\n const newArray = [...flatArray, num];\r\n const newUsage = { ...usageCount, [num]: (usageCount[num] || 0) + 1 };\r\n\r\n const result = solve(newArray, newUsage);\r\n if (result !== null) {\r\n return result;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n let result: number[] | null = null;\r\n for (let attempt = 0; attempt < 50 && result === null; attempt++) {\r\n result = solve([], {});\r\n }\r\n\r\n if (result === null) {\r\n console.warn('Could not generate valid array with given constraints');\r\n result = [];\r\n }\r\n\r\n if (is2D && result.length > 0) {\r\n const matrix: number[][] = [];\r\n const cols = dims[1];\r\n\r\n for (let row = 0; row < dims[0]; row++) {\r\n const rowArray: number[] = [];\r\n for (let col = 0; col < cols; col++) {\r\n const index = row * cols + col;\r\n if (index < result.length) {\r\n rowArray.push(result[index]);\r\n }\r\n }\r\n if (rowArray.length > 0) {\r\n matrix.push(rowArray);\r\n }\r\n }\r\n return matrix;\r\n }\r\n\r\n return result;\r\n};\r\n\r\n/**\r\n * Decompresses a single row of indices into a boolean array.\r\n * Indices are 1-based: [1, 3, 5] with size 6 → [true, false, true, false, true, false]\r\n * \r\n * @param compressedRow - Array of indices (1-based) representing positions with `true` value\r\n * @param size - The total size of the decompressed array\r\n * @returns Array of booleans where positions indicated by indices are `true`\r\n * \r\n * @example\r\n * decompressRow([3, 5, 6], 6)\r\n * // Returns: [false, false, true, false, true, true]\r\n * \r\n * @example\r\n * decompressRow([1, 3, 6], 6)\r\n * // Returns: [true, false, true, false, false, true]\r\n */\r\nconst decompressRow = (compressedRow: number[], size: number): boolean[] => {\r\n const result: boolean[] = new Array(size).fill(false);\r\n for (const index of compressedRow) {\r\n if (index >= 1 && index <= size) {\r\n result[index - 1] = true;\r\n }\r\n }\r\n return result;\r\n};\r\n\r\n/**\r\n * Decompresses an entire matrix of compressed rows into a matrix of boolean arrays.\r\n * \r\n * @param compressedMatrix - 2D array where each row contains indices (1-based)\r\n * @param rowSize - The size of each decompressed row\r\n * @returns 2D array of booleans\r\n * \r\n * @example\r\n * const compressed = [[3, 5, 6], [1, 3, 6], [1, 4, 5]];\r\n * decompressMatrix(compressed, 6)\r\n * // Returns:\r\n * // [\r\n * // [false, false, true, false, true, true],\r\n * // [true, false, true, false, false, true],\r\n * // [true, false, false, true, true, false]\r\n * // ]\r\n */\r\nconst decompressMatrix = (compressedMatrix: number[][], rowSize: number): boolean[][] => {\r\n return compressedMatrix.map(row => decompressRow(row, rowSize));\r\n};\r\n\r\nexport { arrayWithBankNums, orderedArrayWithBankNums, decompressRow, decompressMatrix };","/**\r\n * Array Rules - Colección de funciones de validación para usar con arrayWithBankNums\r\n * \r\n * Estas funciones pueden ser usadas como el parámetro `extraRules` en arrayWithBankNums\r\n * para aplicar restricciones adicionales durante la generación del array.\r\n */\r\n\r\n/**\r\n * Type definition for array rule functions\r\n */\r\nexport type ArrayRule = (candidateNum: number, currentArray: number[]) => boolean;\r\n\r\n// ============================================================================\r\n// REGLAS BÁSICAS DE PARIDAD\r\n// ============================================================================\r\n\r\n/**\r\n * Solo permite números pares\r\n * @example arrayWithBankNums(bankNums, [5], onlyEven)\r\n */\r\nexport const onlyEven: ArrayRule = (num) => num % 2 === 0;\r\n\r\n/**\r\n * Solo permite números impares\r\n * @example arrayWithBankNums(bankNums, [5], onlyOdd)\r\n */\r\nexport const onlyOdd: ArrayRule = (num) => num % 2 !== 0;\r\n\r\n// ============================================================================\r\n// REGLAS DE RANGO\r\n// ============================================================================\r\n\r\n/**\r\n * Crea una regla que solo permite números dentro de un rango específico\r\n * @param min - Valor mínimo (inclusivo)\r\n * @param max - Valor máximo (inclusivo)\r\n * @example arrayWithBankNums(bankNums, [5], inRange(1, 5))\r\n */\r\nexport const inRange = (min: number, max: number): ArrayRule => {\r\n return (num) => num >= min && num <= max;\r\n};\r\n\r\n/**\r\n * Crea una regla que excluye números dentro de un rango específico\r\n * @param min - Valor mínimo a excluir (inclusivo)\r\n * @param max - Valor máximo a excluir (inclusivo)\r\n * @example arrayWithBankNums(bankNums, [5], notInRange(3, 7))\r\n */\r\nexport const notInRange = (min: number, max: number): ArrayRule => {\r\n return (num) => num < min || num > max;\r\n};\r\n\r\n// ============================================================================\r\n// REGLAS DE REPETICIÓN\r\n// ============================================================================\r\n\r\n/**\r\n * No permite números consecutivos repetidos\r\n * @example arrayWithBankNums(bankNums, [5], noConsecutiveRepeats)\r\n */\r\nexport const noConsecutiveRepeats: ArrayRule = (num, arr) => {\r\n if (arr.length === 0) return true;\r\n return arr[arr.length - 1] !== num;\r\n};\r\n\r\n/**\r\n * No permite que un número aparezca más de N veces en el array\r\n * @param maxCount - Número máximo de veces que puede aparecer\r\n * @example arrayWithBankNums(bankNums, [10], maxOccurrences(2))\r\n */\r\nexport const maxOccurrences = (maxCount: number): ArrayRule => {\r\n return (num, arr) => {\r\n const count = arr.filter(n => n === num).length;\r\n return count < maxCount;\r\n };\r\n};\r\n\r\n/**\r\n * No permite duplicados en el array (cada número solo puede aparecer una vez)\r\n * @example arrayWithBankNums(bankNums, [5], noDuplicates)\r\n */\r\nexport const noDuplicates: ArrayRule = (num, arr) => {\r\n return !arr.includes(num);\r\n};\r\n\r\n/**\r\n * No permite que el mismo número aparezca en las últimas N posiciones\r\n * @param positions - Número de posiciones a verificar\r\n * @example arrayWithBankNums(bankNums, [10], noRepeatInLast(3))\r\n */\r\nexport const noRepeatInLast = (positions: number): ArrayRule => {\r\n return (num, arr) => {\r\n const lastN = arr.slice(-positions);\r\n return !lastN.includes(num);\r\n };\r\n};\r\n\r\n// ============================================================================\r\n// REGLAS DE SUMA Y PROMEDIO\r\n// ============================================================================\r\n\r\n/**\r\n * Solo permite números que mantengan la suma total por debajo de un límite\r\n * @param maxSum - Suma máxima permitida\r\n * @example arrayWithBankNums(bankNums, [5], sumLessThan(20))\r\n */\r\nexport const sumLessThan = (maxSum: number): ArrayRule => {\r\n return (num, arr) => {\r\n const currentSum = arr.reduce((sum, n) => sum + n, 0);\r\n return currentSum + num < maxSum;\r\n };\r\n};\r\n\r\n/**\r\n * Solo permite números que mantengan la suma total por encima de un límite\r\n * @param minSum - Suma mínima requerida\r\n * @example arrayWithBankNums(bankNums, [5], sumGreaterThan(10))\r\n */\r\nexport const sumGreaterThan = (minSum: number): ArrayRule => {\r\n return (num, arr) => {\r\n const currentSum = arr.reduce((sum, n) => sum + n, 0);\r\n return currentSum + num > minSum;\r\n };\r\n};\r\n\r\n/**\r\n * Solo permite números que mantengan el promedio dentro de un rango\r\n * @param min - Promedio mínimo\r\n * @param max - Promedio máximo\r\n * @example arrayWithBankNums(bankNums, [5], averageInRange(3, 7))\r\n */\r\nexport const averageInRange = (min: number, max: number): ArrayRule => {\r\n return (num, arr) => {\r\n if (arr.length === 0) return true;\r\n const newSum = arr.reduce((sum, n) => sum + n, 0) + num;\r\n const newAverage = newSum / (arr.length + 1);\r\n return newAverage >= min && newAverage <= max;\r\n };\r\n};\r\n\r\n// ============================================================================\r\n// REGLAS DE SECUENCIA Y PATRÓN\r\n// ============================================================================\r\n\r\n/**\r\n * Solo permite números que sean mayores que el último número en el array (orden ascendente)\r\n * @example arrayWithBankNums(bankNums, [5], ascending)\r\n */\r\nexport const ascending: ArrayRule = (num, arr) => {\r\n if (arr.length === 0) return true;\r\n return num > arr[arr.length - 1];\r\n};\r\n\r\n/**\r\n * Solo permite números que sean menores que el último número en el array (orden descendente)\r\n * @example arrayWithBankNums(bankNums, [5], descending)\r\n */\r\nexport const descending: ArrayRule = (num, arr) => {\r\n if (arr.length === 0) return true;\r\n return num < arr[arr.length - 1];\r\n};\r\n\r\n/**\r\n * Solo permite números que sean diferentes del último número (no estrictamente ascendente/descendente)\r\n * @example arrayWithBankNums(bankNums, [5], different)\r\n */\r\nexport const different: ArrayRule = (num, arr) => {\r\n if (arr.length === 0) return true;\r\n return num !== arr[arr.length - 1];\r\n};\r\n\r\n/**\r\n * Alterna entre números pares e impares\r\n * @example arrayWithBankNums(bankNums, [6], alternateEvenOdd)\r\n */\r\nexport const alternateEvenOdd: ArrayRule = (num, arr) => {\r\n if (arr.length === 0) return true;\r\n const lastWasEven = arr[arr.length - 1] % 2 === 0;\r\n const currentIsEven = num % 2 === 0;\r\n return lastWasEven !== currentIsEven;\r\n};\r\n\r\n// ============================================================================\r\n// REGLAS DE DIVISIBILIDAD\r\n// ============================================================================\r\n\r\n/**\r\n * Solo permite números divisibles por un divisor específico\r\n * @param divisor - El divisor\r\n * @example arrayWithBankNums(bankNums, [5], divisibleBy(3))\r\n */\r\nexport const divisibleBy = (divisor: number): ArrayRule => {\r\n return (num) => num % divisor === 0;\r\n};\r\n\r\n/**\r\n * Solo permite números que NO sean divisibles por un divisor específico\r\n * @param divisor - El divisor\r\n * @example arrayWithBankNums(bankNums, [5], notDivisibleBy(5))\r\n */\r\nexport const notDivisibleBy = (divisor: number): ArrayRule => {\r\n return (num) => num % divisor !== 0;\r\n};\r\n\r\n// ============================================================================\r\n// REGLAS DE POSICIÓN\r\n// ============================================================================\r\n\r\n/**\r\n * Aplica diferentes reglas según la posición en el array\r\n * @param rules - Objeto que mapea índices a reglas\r\n * @example arrayWithBankNums(bankNums, [5], byPosition({ 0: onlyEven, 1: onlyOdd }))\r\n */\r\nexport const byPosition = (rules: { [index: number]: ArrayRule }): ArrayRule => {\r\n return (num, arr) => {\r\n const position = arr.length;\r\n const rule = rules[position];\r\n return rule ? rule(num, arr) : true;\r\n };\r\n};\r\n\r\n/**\r\n * Aplica una regla solo en posiciones pares (0, 2, 4, ...)\r\n * @param rule - La regla a aplicar\r\n * @example arrayWithBankNums(bankNums, [6], onEvenPositions(onlyEven))\r\n */\r\nexport const onEvenPositions = (rule: ArrayRule): ArrayRule => {\r\n return (num, arr) => {\r\n const position = arr.length;\r\n return position % 2 === 0 ? rule(num, arr) : true;\r\n };\r\n};\r\n\r\n/**\r\n * Aplica una regla solo en posiciones impares (1, 3, 5, ...)\r\n * @param rule - La regla a aplicar\r\n * @example arrayWithBankNums(bankNums, [6], onOddPositions(onlyOdd))\r\n */\r\nexport const onOddPositions = (rule: ArrayRule): ArrayRule => {\r\n return (num, arr) => {\r\n const position = arr.length;\r\n return position % 2 !== 0 ? rule(num, arr) : true;\r\n };\r\n};\r\n\r\n// ============================================================================\r\n// COMBINADORES DE REGLAS\r\n// ============================================================================\r\n\r\n/**\r\n * Combina múltiples reglas con AND (todas deben cumplirse)\r\n * @param rules - Array de reglas a combinar\r\n * @example arrayWithBankNums(bankNums, [5], and([onlyEven, inRange(2, 8)]))\r\n */\r\nexport const and = (rules: ArrayRule[]): ArrayRule => {\r\n return (num, arr) => {\r\n return rules.every(rule => rule(num, arr));\r\n };\r\n};\r\n\r\n/**\r\n * Combina múltiples reglas con OR (al menos una debe cumplirse)\r\n * @param rules - Array de reglas a combinar\r\n * @example arrayWithBankNums(bankNums, [5], or([onlyEven, divisibleBy(3)]))\r\n */\r\nexport const or = (rules: ArrayRule[]): ArrayRule => {\r\n return (num, arr) => {\r\n return rules.some(rule => rule(num, arr));\r\n };\r\n};\r\n\r\n/**\r\n * Invierte una regla (NOT)\r\n * @param rule - La regla a invertir\r\n * @example arrayWithBankNums(bankNums, [5], not(onlyEven)) // Solo impares\r\n */\r\nexport const not = (rule: ArrayRule): ArrayRule => {\r\n return (num, arr) => {\r\n return !rule(num, arr);\r\n };\r\n};\r\n\r\n// ============================================================================\r\n// REGLAS AVANZADAS\r\n// ============================================================================\r\n\r\n/**\r\n * Solo permite números primos\r\n * @example arrayWithBankNums(bankNums, [5], onlyPrimes)\r\n */\r\nexport const onlyPrimes: ArrayRule = (num) => {\r\n if (num < 2) return false;\r\n for (let i = 2; i <= Math.sqrt(num); i++) {\r\n if (num % i === 0) return false;\r\n }\r\n return true;\r\n};\r\n\r\n/**\r\n * Solo permite números que sean cuadrados perfectos\r\n * @example arrayWithBankNums(bankNums, [5], onlySquares)\r\n */\r\nexport const onlySquares: ArrayRule = (num) => {\r\n const sqrt = Math.sqrt(num);\r\n return sqrt === Math.floor(sqrt);\r\n};\r\n\r\n/**\r\n * Asegura que la diferencia entre números consecutivos no exceda un límite\r\n * @param maxDiff - Diferencia máxima permitida\r\n * @example arrayWithBankNums(bankNums, [5], maxDifference(3))\r\n */\r\nexport const maxDifference = (maxDiff: number): ArrayRule => {\r\n return (num, arr) => {\r\n if (arr.length === 0) return true;\r\n const diff = Math.abs(num - arr[arr.length - 1]);\r\n return diff <= maxDiff;\r\n };\r\n};\r\n\r\n/**\r\n * Asegura que la diferencia entre números consecutivos sea al menos un mínimo\r\n * @param minDiff - Diferencia mínima requerida\r\n * @example arrayWithBankNums(bankNums, [5], minDifference(2))\r\n */\r\nexport const minDifference = (minDiff: number): ArrayRule => {\r\n return (num, arr) => {\r\n if (arr.length === 0) return true;\r\n const diff = Math.abs(num - arr[arr.length - 1]);\r\n return diff >= minDiff;\r\n };\r\n};\r\n\r\n/**\r\n * Mantiene un balance entre números pares e impares\r\n * @param maxImbalance - Diferencia máxima permitida entre cantidad de pares e impares\r\n * @example arrayWithBankNums(bankNums, [10], balanceEvenOdd(2))\r\n */\r\nexport const balanceEvenOdd = (maxImbalance: number = 1): ArrayRule => {\r\n return (num, arr) => {\r\n const evenCount = arr.filter(n => n % 2 === 0).length;\r\n const oddCount = arr.length - evenCount;\r\n const isEven = num % 2 === 0;\r\n\r\n if (isEven) {\r\n return (evenCount + 1) - oddCount <= maxImbalance;\r\n } else {\r\n return (oddCount + 1) - evenCount <= maxImbalance;\r\n }\r\n };\r\n};\r\n\r\n/**\r\n * Solo permite números en posiciones específicas del array\r\n * @param allowedPositions - Array de posiciones permitidas (0-indexed)\r\n * @param value - El valor que solo puede aparecer en esas posiciones\r\n * @example arrayWithBankNums(bankNums, [5], valueAtPositions([0, 2, 4], 7))\r\n */\r\nexport const valueAtPositions = (allowedPositions: number[], value: number): ArrayRule => {\r\n return (num, arr) => {\r\n const currentPosition = arr.length;\r\n if (num === value) {\r\n return allowedPositions.includes(currentPosition);\r\n }\r\n return true;\r\n };\r\n};\r\n","/**\r\n * Y-ary package entry point\r\n * Export your public API here\r\n */\r\n\r\nexport function hello(name: string): string {\r\n return `Hello, ${name}!`;\r\n}\r\n\r\n// Export formula interpreter\r\nexport { formulaInterpreter } from './formulas/formulaInterpreter';\r\n\r\n// Export array generation and decompression\r\nexport { arrayWithBankNums, orderedArrayWithBankNums, decompressRow, decompressMatrix } from './algorithms/arrayGens';\r\n\r\n// Export all array validation rules\r\nexport * from './algorithms/arrayRules';\r\n\r\n// Export types\r\nexport type { };\r\n"]}
package/dist/index.d.cts CHANGED
@@ -27,35 +27,72 @@ declare const formulaInterpreter: (formula: string, where: {
27
27
  *
28
28
  * @returns A 1D array or 2D array (matrix) of numbers randomly selected from bankNums,
29
29
  * respecting occurrence limits and any extra validation rules.
30
+ */
31
+ declare const arrayWithBankNums: (bankNums: {
32
+ [n: number]: number;
33
+ }, dims: number[], extraRules?: (candidateNum: number, currentArray: number[]) => boolean) => number[] | number[][];
34
+ /**
35
+ * Generates an array or matrix with ORDERED selection from a bank of numbers.
36
+ * Unlike arrayWithBankNums (which selects randomly), this function uses backtracking
37
+ * to ensure ascending order within each row while respecting all constraints.
30
38
  *
31
- * @example
32
- * // Generate 1D array of length 5
33
- * const result1D = arrayWithBankNums(
34
- * { 1: 3, 2: 3, 3: 3, 4: 3, 5: 3, 6: 3, 7: 3, 8: 3, 9: 3, 10: 3 },
35
- * [5]
36
- * );
37
- * // Possible result: [3, 7, 1, 9, 2]
39
+ * Key difference: Each row starts fresh for ordering purposes, allowing patterns like:
40
+ * - Row 1: [1, 4, 5]
41
+ * - Row 2: [1, 2, 5] (starts from 1 again, not continuation)
42
+ *
43
+ * @param bankNums - Object where keys are the numbers to use and values are the maximum
44
+ * number of times each number can appear in the array.
45
+ *
46
+ * @param dims - Array dimensions:
47
+ * - [length]: Creates a 1D array with the specified length
48
+ * - [rows, cols]: Creates a 2D array (matrix) with the specified rows and columns
49
+ *
50
+ * @param extraRules - Optional validation callback that receives:
51
+ * - candidateNum: The number being considered for addition
52
+ * - currentArray: The flattened array built so far
53
+ * - rowSize: The size of each row (for 2D arrays) or total length (for 1D)
54
+ * Returns true to allow the number, false to reject it.
55
+ *
56
+ * @returns A 1D array or 2D array (matrix) with ascending numbers per row.
57
+ */
58
+ declare const orderedArrayWithBankNums: (bankNums: {
59
+ [n: number]: number;
60
+ }, dims: number[], extraRules?: (candidateNum: number, currentArray: number[], rowSize: number) => boolean) => number[] | number[][];
61
+ /**
62
+ * Decompresses a single row of indices into a boolean array.
63
+ * Indices are 1-based: [1, 3, 5] with size 6 → [true, false, true, false, true, false]
64
+ *
65
+ * @param compressedRow - Array of indices (1-based) representing positions with `true` value
66
+ * @param size - The total size of the decompressed array
67
+ * @returns Array of booleans where positions indicated by indices are `true`
38
68
  *
39
69
  * @example
40
- * // Generate 2D array (matrix) of 3 rows x 4 columns
41
- * const result2D = arrayWithBankNums(
42
- * { 1: 3, 2: 3, 3: 3, 4: 3, 5: 3, 6: 3 },
43
- * [3, 4]
44
- * );
45
- * // Possible result: [[1, 3, 2, 5], [4, 1, 6, 3], [2, 5, 4, 6]]
70
+ * decompressRow([3, 5, 6], 6)
71
+ * // Returns: [false, false, true, false, true, true]
46
72
  *
47
73
  * @example
48
- * // With extraRules: only allow even numbers
49
- * const result = arrayWithBankNums(
50
- * { 1: 3, 2: 3, 3: 3, 4: 3, 5: 3, 6: 3 },
51
- * [4],
52
- * (num, arr) => num % 2 === 0
53
- * );
54
- * // Possible result: [2, 4, 6, 2]
74
+ * decompressRow([1, 3, 6], 6)
75
+ * // Returns: [true, false, true, false, false, true]
55
76
  */
56
- declare const arrayWithBankNums: (bankNums: {
57
- [n: number]: number;
58
- }, dims: number[], extraRules?: (candidateNum: number, currentArray: number[]) => boolean) => number[] | number[][];
77
+ declare const decompressRow: (compressedRow: number[], size: number) => boolean[];
78
+ /**
79
+ * Decompresses an entire matrix of compressed rows into a matrix of boolean arrays.
80
+ *
81
+ * @param compressedMatrix - 2D array where each row contains indices (1-based)
82
+ * @param rowSize - The size of each decompressed row
83
+ * @returns 2D array of booleans
84
+ *
85
+ * @example
86
+ * const compressed = [[3, 5, 6], [1, 3, 6], [1, 4, 5]];
87
+ * decompressMatrix(compressed, 6)
88
+ * // Returns:
89
+ * // [
90
+ * // [false, false, true, false, true, true],
91
+ * // [true, false, true, false, false, true],
92
+ * // [true, false, false, true, true, false]
93
+ * // ]
94
+ */
95
+ declare const decompressMatrix: (compressedMatrix: number[][], rowSize: number) => boolean[][];
59
96
 
60
97
  /**
61
98
  * Array Rules - Colección de funciones de validación para usar con arrayWithBankNums
@@ -244,4 +281,4 @@ declare const valueAtPositions: (allowedPositions: number[], value: number) => A
244
281
  */
245
282
  declare function hello(name: string): string;
246
283
 
247
- export { type ArrayRule, alternateEvenOdd, and, arrayWithBankNums, ascending, averageInRange, balanceEvenOdd, byPosition, descending, different, divisibleBy, formulaInterpreter, hello, inRange, maxDifference, maxOccurrences, minDifference, noConsecutiveRepeats, noDuplicates, noRepeatInLast, not, notDivisibleBy, notInRange, onEvenPositions, onOddPositions, onlyEven, onlyOdd, onlyPrimes, onlySquares, or, sumGreaterThan, sumLessThan, valueAtPositions };
284
+ export { type ArrayRule, alternateEvenOdd, and, arrayWithBankNums, ascending, averageInRange, balanceEvenOdd, byPosition, decompressMatrix, decompressRow, descending, different, divisibleBy, formulaInterpreter, hello, inRange, maxDifference, maxOccurrences, minDifference, noConsecutiveRepeats, noDuplicates, noRepeatInLast, not, notDivisibleBy, notInRange, onEvenPositions, onOddPositions, onlyEven, onlyOdd, onlyPrimes, onlySquares, or, orderedArrayWithBankNums, sumGreaterThan, sumLessThan, valueAtPositions };
package/dist/index.d.ts CHANGED
@@ -27,35 +27,72 @@ declare const formulaInterpreter: (formula: string, where: {
27
27
  *
28
28
  * @returns A 1D array or 2D array (matrix) of numbers randomly selected from bankNums,
29
29
  * respecting occurrence limits and any extra validation rules.
30
+ */
31
+ declare const arrayWithBankNums: (bankNums: {
32
+ [n: number]: number;
33
+ }, dims: number[], extraRules?: (candidateNum: number, currentArray: number[]) => boolean) => number[] | number[][];
34
+ /**
35
+ * Generates an array or matrix with ORDERED selection from a bank of numbers.
36
+ * Unlike arrayWithBankNums (which selects randomly), this function uses backtracking
37
+ * to ensure ascending order within each row while respecting all constraints.
30
38
  *
31
- * @example
32
- * // Generate 1D array of length 5
33
- * const result1D = arrayWithBankNums(
34
- * { 1: 3, 2: 3, 3: 3, 4: 3, 5: 3, 6: 3, 7: 3, 8: 3, 9: 3, 10: 3 },
35
- * [5]
36
- * );
37
- * // Possible result: [3, 7, 1, 9, 2]
39
+ * Key difference: Each row starts fresh for ordering purposes, allowing patterns like:
40
+ * - Row 1: [1, 4, 5]
41
+ * - Row 2: [1, 2, 5] (starts from 1 again, not continuation)
42
+ *
43
+ * @param bankNums - Object where keys are the numbers to use and values are the maximum
44
+ * number of times each number can appear in the array.
45
+ *
46
+ * @param dims - Array dimensions:
47
+ * - [length]: Creates a 1D array with the specified length
48
+ * - [rows, cols]: Creates a 2D array (matrix) with the specified rows and columns
49
+ *
50
+ * @param extraRules - Optional validation callback that receives:
51
+ * - candidateNum: The number being considered for addition
52
+ * - currentArray: The flattened array built so far
53
+ * - rowSize: The size of each row (for 2D arrays) or total length (for 1D)
54
+ * Returns true to allow the number, false to reject it.
55
+ *
56
+ * @returns A 1D array or 2D array (matrix) with ascending numbers per row.
57
+ */
58
+ declare const orderedArrayWithBankNums: (bankNums: {
59
+ [n: number]: number;
60
+ }, dims: number[], extraRules?: (candidateNum: number, currentArray: number[], rowSize: number) => boolean) => number[] | number[][];
61
+ /**
62
+ * Decompresses a single row of indices into a boolean array.
63
+ * Indices are 1-based: [1, 3, 5] with size 6 → [true, false, true, false, true, false]
64
+ *
65
+ * @param compressedRow - Array of indices (1-based) representing positions with `true` value
66
+ * @param size - The total size of the decompressed array
67
+ * @returns Array of booleans where positions indicated by indices are `true`
38
68
  *
39
69
  * @example
40
- * // Generate 2D array (matrix) of 3 rows x 4 columns
41
- * const result2D = arrayWithBankNums(
42
- * { 1: 3, 2: 3, 3: 3, 4: 3, 5: 3, 6: 3 },
43
- * [3, 4]
44
- * );
45
- * // Possible result: [[1, 3, 2, 5], [4, 1, 6, 3], [2, 5, 4, 6]]
70
+ * decompressRow([3, 5, 6], 6)
71
+ * // Returns: [false, false, true, false, true, true]
46
72
  *
47
73
  * @example
48
- * // With extraRules: only allow even numbers
49
- * const result = arrayWithBankNums(
50
- * { 1: 3, 2: 3, 3: 3, 4: 3, 5: 3, 6: 3 },
51
- * [4],
52
- * (num, arr) => num % 2 === 0
53
- * );
54
- * // Possible result: [2, 4, 6, 2]
74
+ * decompressRow([1, 3, 6], 6)
75
+ * // Returns: [true, false, true, false, false, true]
55
76
  */
56
- declare const arrayWithBankNums: (bankNums: {
57
- [n: number]: number;
58
- }, dims: number[], extraRules?: (candidateNum: number, currentArray: number[]) => boolean) => number[] | number[][];
77
+ declare const decompressRow: (compressedRow: number[], size: number) => boolean[];
78
+ /**
79
+ * Decompresses an entire matrix of compressed rows into a matrix of boolean arrays.
80
+ *
81
+ * @param compressedMatrix - 2D array where each row contains indices (1-based)
82
+ * @param rowSize - The size of each decompressed row
83
+ * @returns 2D array of booleans
84
+ *
85
+ * @example
86
+ * const compressed = [[3, 5, 6], [1, 3, 6], [1, 4, 5]];
87
+ * decompressMatrix(compressed, 6)
88
+ * // Returns:
89
+ * // [
90
+ * // [false, false, true, false, true, true],
91
+ * // [true, false, true, false, false, true],
92
+ * // [true, false, false, true, true, false]
93
+ * // ]
94
+ */
95
+ declare const decompressMatrix: (compressedMatrix: number[][], rowSize: number) => boolean[][];
59
96
 
60
97
  /**
61
98
  * Array Rules - Colección de funciones de validación para usar con arrayWithBankNums
@@ -244,4 +281,4 @@ declare const valueAtPositions: (allowedPositions: number[], value: number) => A
244
281
  */
245
282
  declare function hello(name: string): string;
246
283
 
247
- export { type ArrayRule, alternateEvenOdd, and, arrayWithBankNums, ascending, averageInRange, balanceEvenOdd, byPosition, descending, different, divisibleBy, formulaInterpreter, hello, inRange, maxDifference, maxOccurrences, minDifference, noConsecutiveRepeats, noDuplicates, noRepeatInLast, not, notDivisibleBy, notInRange, onEvenPositions, onOddPositions, onlyEven, onlyOdd, onlyPrimes, onlySquares, or, sumGreaterThan, sumLessThan, valueAtPositions };
284
+ export { type ArrayRule, alternateEvenOdd, and, arrayWithBankNums, ascending, averageInRange, balanceEvenOdd, byPosition, decompressMatrix, decompressRow, descending, different, divisibleBy, formulaInterpreter, hello, inRange, maxDifference, maxOccurrences, minDifference, noConsecutiveRepeats, noDuplicates, noRepeatInLast, not, notDivisibleBy, notInRange, onEvenPositions, onOddPositions, onlyEven, onlyOdd, onlyPrimes, onlySquares, or, orderedArrayWithBankNums, sumGreaterThan, sumLessThan, valueAtPositions };
package/dist/index.js CHANGED
@@ -64,6 +64,81 @@ var arrayWithBankNums = (bankNums, dims, extraRules) => {
64
64
  }
65
65
  return flatArray;
66
66
  };
67
+ function shuffleArray(array) {
68
+ for (let i = array.length - 1; i > 0; i--) {
69
+ const j = Math.floor(Math.random() * (i + 1));
70
+ [array[i], array[j]] = [array[j], array[i]];
71
+ }
72
+ return array;
73
+ }
74
+ var orderedArrayWithBankNums = (bankNums, dims, extraRules) => {
75
+ const is2D = dims.length === 2;
76
+ const rowSize = is2D ? dims[1] : dims[0];
77
+ const totalElements = is2D ? dims[0] * dims[1] : dims[0];
78
+ const sortedNumbers = Object.keys(bankNums).map(Number).sort((a, b) => a - b);
79
+ function solve(flatArray, usageCount) {
80
+ if (flatArray.length === totalElements) {
81
+ return flatArray;
82
+ }
83
+ const posInRow = flatArray.length % rowSize;
84
+ const minValue = posInRow === 0 ? -Infinity : flatArray[flatArray.length - 1];
85
+ const candidates = sortedNumbers.filter((num) => {
86
+ const usage = usageCount[num] || 0;
87
+ return usage < bankNums[num] && num > minValue;
88
+ });
89
+ const shuffled = shuffleArray([...candidates]);
90
+ for (const num of shuffled) {
91
+ if (extraRules && !extraRules(num, flatArray, rowSize)) {
92
+ continue;
93
+ }
94
+ const newArray = [...flatArray, num];
95
+ const newUsage = { ...usageCount, [num]: (usageCount[num] || 0) + 1 };
96
+ const result2 = solve(newArray, newUsage);
97
+ if (result2 !== null) {
98
+ return result2;
99
+ }
100
+ }
101
+ return null;
102
+ }
103
+ let result = null;
104
+ for (let attempt = 0; attempt < 50 && result === null; attempt++) {
105
+ result = solve([], {});
106
+ }
107
+ if (result === null) {
108
+ console.warn("Could not generate valid array with given constraints");
109
+ result = [];
110
+ }
111
+ if (is2D && result.length > 0) {
112
+ const matrix = [];
113
+ const cols = dims[1];
114
+ for (let row = 0; row < dims[0]; row++) {
115
+ const rowArray = [];
116
+ for (let col = 0; col < cols; col++) {
117
+ const index = row * cols + col;
118
+ if (index < result.length) {
119
+ rowArray.push(result[index]);
120
+ }
121
+ }
122
+ if (rowArray.length > 0) {
123
+ matrix.push(rowArray);
124
+ }
125
+ }
126
+ return matrix;
127
+ }
128
+ return result;
129
+ };
130
+ var decompressRow = (compressedRow, size) => {
131
+ const result = new Array(size).fill(false);
132
+ for (const index of compressedRow) {
133
+ if (index >= 1 && index <= size) {
134
+ result[index - 1] = true;
135
+ }
136
+ }
137
+ return result;
138
+ };
139
+ var decompressMatrix = (compressedMatrix, rowSize) => {
140
+ return compressedMatrix.map((row) => decompressRow(row, rowSize));
141
+ };
67
142
 
68
143
  // src/algorithms/arrayRules.ts
69
144
  var onlyEven = (num) => num % 2 === 0;
@@ -223,6 +298,6 @@ function hello(name) {
223
298
  return `Hello, ${name}!`;
224
299
  }
225
300
 
226
- export { alternateEvenOdd, and, arrayWithBankNums, ascending, averageInRange, balanceEvenOdd, byPosition, descending, different, divisibleBy, formulaInterpreter, hello, inRange, maxDifference, maxOccurrences, minDifference, noConsecutiveRepeats, noDuplicates, noRepeatInLast, not, notDivisibleBy, notInRange, onEvenPositions, onOddPositions, onlyEven, onlyOdd, onlyPrimes, onlySquares, or, sumGreaterThan, sumLessThan, valueAtPositions };
301
+ export { alternateEvenOdd, and, arrayWithBankNums, ascending, averageInRange, balanceEvenOdd, byPosition, decompressMatrix, decompressRow, descending, different, divisibleBy, formulaInterpreter, hello, inRange, maxDifference, maxOccurrences, minDifference, noConsecutiveRepeats, noDuplicates, noRepeatInLast, not, notDivisibleBy, notInRange, onEvenPositions, onOddPositions, onlyEven, onlyOdd, onlyPrimes, onlySquares, or, orderedArrayWithBankNums, sumGreaterThan, sumLessThan, valueAtPositions };
227
302
  //# sourceMappingURL=index.js.map
228
303
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/formulas/formulaInterpreter.ts","../src/algorithms/arrayGens.ts","../src/algorithms/arrayRules.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * Interprets a mathematical formula by replacing variables with their values\r\n * @param formula - Mathematical formula as a string (e.g., 'x/1 + y')\r\n * @param where - Object mapping variable names to their numeric values (e.g., {x: 4, y: 6})\r\n * @returns The evaluated result of the formula\r\n */\r\nexport const formulaInterpreter = (formula: string, where: { [key: string]: number }): number => {\r\n // Replace each variable in the formula with its value from the where object\r\n let processedFormula = formula;\r\n\r\n for (const [variable, value] of Object.entries(where)) {\r\n // Use regex with word boundaries to replace only complete variable names\r\n const regex = new RegExp(`\\\\b${variable}\\\\b`, 'g');\r\n processedFormula = processedFormula.replace(regex, String(value));\r\n }\r\n\r\n // Evaluate the mathematical expression\r\n // Using Function constructor is safer than eval for mathematical expressions\r\n try {\r\n const result = new Function(`return ${processedFormula}`)();\r\n return result;\r\n } catch (error) {\r\n throw new Error(`Invalid formula or evaluation error: ${error instanceof Error ? error.message : String(error)}`);\r\n }\r\n}","/**\r\n * Generates an array or matrix by randomly selecting numbers from a bank with occurrence limits.\r\n * \r\n * @param bankNums - Object where keys are the numbers to use and values are the maximum \r\n * number of times each number can appear in the array.\r\n * Example: { 1: 3, 2: 3, 3: 3 } means number 1 can appear up to 3 times,\r\n * number 2 can appear up to 3 times, etc.\r\n * \r\n * @param dims - Array dimensions:\r\n * - [length]: Creates a 1D array with the specified length\r\n * - [rows, cols]: Creates a 2D array (matrix) with the specified rows and columns\r\n * \r\n * @param extraRules - Optional validation callback that receives:\r\n * - candidateNum: The number being considered for addition\r\n * - currentArray: The flattened array built so far (for 2D arrays, this is all elements)\r\n * Returns true to allow the number, false to reject it and try another.\r\n * \r\n * @returns A 1D array or 2D array (matrix) of numbers randomly selected from bankNums,\r\n * respecting occurrence limits and any extra validation rules.\r\n * \r\n * @example\r\n * // Generate 1D array of length 5\r\n * const result1D = arrayWithBankNums(\r\n * { 1: 3, 2: 3, 3: 3, 4: 3, 5: 3, 6: 3, 7: 3, 8: 3, 9: 3, 10: 3 },\r\n * [5]\r\n * );\r\n * // Possible result: [3, 7, 1, 9, 2]\r\n * \r\n * @example\r\n * // Generate 2D array (matrix) of 3 rows x 4 columns\r\n * const result2D = arrayWithBankNums(\r\n * { 1: 3, 2: 3, 3: 3, 4: 3, 5: 3, 6: 3 },\r\n * [3, 4]\r\n * );\r\n * // Possible result: [[1, 3, 2, 5], [4, 1, 6, 3], [2, 5, 4, 6]]\r\n * \r\n * @example\r\n * // With extraRules: only allow even numbers\r\n * const result = arrayWithBankNums(\r\n * { 1: 3, 2: 3, 3: 3, 4: 3, 5: 3, 6: 3 },\r\n * [4],\r\n * (num, arr) => num % 2 === 0\r\n * );\r\n * // Possible result: [2, 4, 6, 2]\r\n */\r\nconst arrayWithBankNums = (\r\n bankNums: { [n: number]: number },\r\n dims: number[],\r\n extraRules?: (candidateNum: number, currentArray: number[]) => boolean\r\n): number[] | number[][] => {\r\n // Determine if we're creating a 1D or 2D array\r\n const is2D = dims.length === 2;\r\n const totalElements = is2D ? dims[0] * dims[1] : dims[0];\r\n\r\n const flatArray: number[] = [];\r\n\r\n // Track how many times each number has been used\r\n const usageCount: { [n: number]: number } = {};\r\n\r\n // Get available numbers from bankNums\r\n const availableNumbers = Object.keys(bankNums).map(Number);\r\n\r\n // Build flat array up to the total number of elements needed\r\n for (let i = 0; i < totalElements; i++) {\r\n let candidateNum: number | null = null;\r\n let attempts = 0;\r\n const maxAttempts = 1000; // Prevent infinite loops\r\n\r\n // Try to find a valid number\r\n while (candidateNum === null && attempts < maxAttempts) {\r\n attempts++;\r\n\r\n // Select a random number from available numbers\r\n const randomIndex = Math.floor(Math.random() * availableNumbers.length);\r\n const selectedNum = availableNumbers[randomIndex];\r\n\r\n // Check if this number hasn't exceeded its limit\r\n const currentUsage = usageCount[selectedNum] || 0;\r\n const maxUsage = bankNums[selectedNum];\r\n\r\n if (currentUsage >= maxUsage) {\r\n continue; // This number is exhausted, try another\r\n }\r\n\r\n // Apply extra rules if provided\r\n const passesExtraRules = extraRules ? extraRules(selectedNum, flatArray) : true;\r\n\r\n if (passesExtraRules) {\r\n candidateNum = selectedNum;\r\n }\r\n }\r\n\r\n // If we found a valid number, add it to the array\r\n if (candidateNum !== null) {\r\n flatArray.push(candidateNum);\r\n usageCount[candidateNum] = (usageCount[candidateNum] || 0) + 1;\r\n } else {\r\n // Could not find a valid number after max attempts\r\n console.warn(`Could not find valid number at position ${i} after ${maxAttempts} attempts`);\r\n break;\r\n }\r\n }\r\n\r\n // If 2D array requested, reshape the flat array into a matrix\r\n if (is2D) {\r\n const rows = dims[0];\r\n const cols = dims[1];\r\n const matrix: number[][] = [];\r\n\r\n for (let row = 0; row < rows; row++) {\r\n const rowArray: number[] = [];\r\n for (let col = 0; col < cols; col++) {\r\n const index = row * cols + col;\r\n if (index < flatArray.length) {\r\n rowArray.push(flatArray[index]);\r\n }\r\n }\r\n matrix.push(rowArray);\r\n }\r\n\r\n return matrix;\r\n }\r\n\r\n // Return 1D array\r\n return flatArray;\r\n};\r\n\r\nexport { arrayWithBankNums };","/**\r\n * Array Rules - Colección de funciones de validación para usar con arrayWithBankNums\r\n * \r\n * Estas funciones pueden ser usadas como el parámetro `extraRules` en arrayWithBankNums\r\n * para aplicar restricciones adicionales durante la generación del array.\r\n */\r\n\r\n/**\r\n * Type definition for array rule functions\r\n */\r\nexport type ArrayRule = (candidateNum: number, currentArray: number[]) => boolean;\r\n\r\n// ============================================================================\r\n// REGLAS BÁSICAS DE PARIDAD\r\n// ============================================================================\r\n\r\n/**\r\n * Solo permite números pares\r\n * @example arrayWithBankNums(bankNums, [5], onlyEven)\r\n */\r\nexport const onlyEven: ArrayRule = (num) => num % 2 === 0;\r\n\r\n/**\r\n * Solo permite números impares\r\n * @example arrayWithBankNums(bankNums, [5], onlyOdd)\r\n */\r\nexport const onlyOdd: ArrayRule = (num) => num % 2 !== 0;\r\n\r\n// ============================================================================\r\n// REGLAS DE RANGO\r\n// ============================================================================\r\n\r\n/**\r\n * Crea una regla que solo permite números dentro de un rango específico\r\n * @param min - Valor mínimo (inclusivo)\r\n * @param max - Valor máximo (inclusivo)\r\n * @example arrayWithBankNums(bankNums, [5], inRange(1, 5))\r\n */\r\nexport const inRange = (min: number, max: number): ArrayRule => {\r\n return (num) => num >= min && num <= max;\r\n};\r\n\r\n/**\r\n * Crea una regla que excluye números dentro de un rango específico\r\n * @param min - Valor mínimo a excluir (inclusivo)\r\n * @param max - Valor máximo a excluir (inclusivo)\r\n * @example arrayWithBankNums(bankNums, [5], notInRange(3, 7))\r\n */\r\nexport const notInRange = (min: number, max: number): ArrayRule => {\r\n return (num) => num < min || num > max;\r\n};\r\n\r\n// ============================================================================\r\n// REGLAS DE REPETICIÓN\r\n// ============================================================================\r\n\r\n/**\r\n * No permite números consecutivos repetidos\r\n * @example arrayWithBankNums(bankNums, [5], noConsecutiveRepeats)\r\n */\r\nexport const noConsecutiveRepeats: ArrayRule = (num, arr) => {\r\n if (arr.length === 0) return true;\r\n return arr[arr.length - 1] !== num;\r\n};\r\n\r\n/**\r\n * No permite que un número aparezca más de N veces en el array\r\n * @param maxCount - Número máximo de veces que puede aparecer\r\n * @example arrayWithBankNums(bankNums, [10], maxOccurrences(2))\r\n */\r\nexport const maxOccurrences = (maxCount: number): ArrayRule => {\r\n return (num, arr) => {\r\n const count = arr.filter(n => n === num).length;\r\n return count < maxCount;\r\n };\r\n};\r\n\r\n/**\r\n * No permite duplicados en el array (cada número solo puede aparecer una vez)\r\n * @example arrayWithBankNums(bankNums, [5], noDuplicates)\r\n */\r\nexport const noDuplicates: ArrayRule = (num, arr) => {\r\n return !arr.includes(num);\r\n};\r\n\r\n/**\r\n * No permite que el mismo número aparezca en las últimas N posiciones\r\n * @param positions - Número de posiciones a verificar\r\n * @example arrayWithBankNums(bankNums, [10], noRepeatInLast(3))\r\n */\r\nexport const noRepeatInLast = (positions: number): ArrayRule => {\r\n return (num, arr) => {\r\n const lastN = arr.slice(-positions);\r\n return !lastN.includes(num);\r\n };\r\n};\r\n\r\n// ============================================================================\r\n// REGLAS DE SUMA Y PROMEDIO\r\n// ============================================================================\r\n\r\n/**\r\n * Solo permite números que mantengan la suma total por debajo de un límite\r\n * @param maxSum - Suma máxima permitida\r\n * @example arrayWithBankNums(bankNums, [5], sumLessThan(20))\r\n */\r\nexport const sumLessThan = (maxSum: number): ArrayRule => {\r\n return (num, arr) => {\r\n const currentSum = arr.reduce((sum, n) => sum + n, 0);\r\n return currentSum + num < maxSum;\r\n };\r\n};\r\n\r\n/**\r\n * Solo permite números que mantengan la suma total por encima de un límite\r\n * @param minSum - Suma mínima requerida\r\n * @example arrayWithBankNums(bankNums, [5], sumGreaterThan(10))\r\n */\r\nexport const sumGreaterThan = (minSum: number): ArrayRule => {\r\n return (num, arr) => {\r\n const currentSum = arr.reduce((sum, n) => sum + n, 0);\r\n return currentSum + num > minSum;\r\n };\r\n};\r\n\r\n/**\r\n * Solo permite números que mantengan el promedio dentro de un rango\r\n * @param min - Promedio mínimo\r\n * @param max - Promedio máximo\r\n * @example arrayWithBankNums(bankNums, [5], averageInRange(3, 7))\r\n */\r\nexport const averageInRange = (min: number, max: number): ArrayRule => {\r\n return (num, arr) => {\r\n if (arr.length === 0) return true;\r\n const newSum = arr.reduce((sum, n) => sum + n, 0) + num;\r\n const newAverage = newSum / (arr.length + 1);\r\n return newAverage >= min && newAverage <= max;\r\n };\r\n};\r\n\r\n// ============================================================================\r\n// REGLAS DE SECUENCIA Y PATRÓN\r\n// ============================================================================\r\n\r\n/**\r\n * Solo permite números que sean mayores que el último número en el array (orden ascendente)\r\n * @example arrayWithBankNums(bankNums, [5], ascending)\r\n */\r\nexport const ascending: ArrayRule = (num, arr) => {\r\n if (arr.length === 0) return true;\r\n return num > arr[arr.length - 1];\r\n};\r\n\r\n/**\r\n * Solo permite números que sean menores que el último número en el array (orden descendente)\r\n * @example arrayWithBankNums(bankNums, [5], descending)\r\n */\r\nexport const descending: ArrayRule = (num, arr) => {\r\n if (arr.length === 0) return true;\r\n return num < arr[arr.length - 1];\r\n};\r\n\r\n/**\r\n * Solo permite números que sean diferentes del último número (no estrictamente ascendente/descendente)\r\n * @example arrayWithBankNums(bankNums, [5], different)\r\n */\r\nexport const different: ArrayRule = (num, arr) => {\r\n if (arr.length === 0) return true;\r\n return num !== arr[arr.length - 1];\r\n};\r\n\r\n/**\r\n * Alterna entre números pares e impares\r\n * @example arrayWithBankNums(bankNums, [6], alternateEvenOdd)\r\n */\r\nexport const alternateEvenOdd: ArrayRule = (num, arr) => {\r\n if (arr.length === 0) return true;\r\n const lastWasEven = arr[arr.length - 1] % 2 === 0;\r\n const currentIsEven = num % 2 === 0;\r\n return lastWasEven !== currentIsEven;\r\n};\r\n\r\n// ============================================================================\r\n// REGLAS DE DIVISIBILIDAD\r\n// ============================================================================\r\n\r\n/**\r\n * Solo permite números divisibles por un divisor específico\r\n * @param divisor - El divisor\r\n * @example arrayWithBankNums(bankNums, [5], divisibleBy(3))\r\n */\r\nexport const divisibleBy = (divisor: number): ArrayRule => {\r\n return (num) => num % divisor === 0;\r\n};\r\n\r\n/**\r\n * Solo permite números que NO sean divisibles por un divisor específico\r\n * @param divisor - El divisor\r\n * @example arrayWithBankNums(bankNums, [5], notDivisibleBy(5))\r\n */\r\nexport const notDivisibleBy = (divisor: number): ArrayRule => {\r\n return (num) => num % divisor !== 0;\r\n};\r\n\r\n// ============================================================================\r\n// REGLAS DE POSICIÓN\r\n// ============================================================================\r\n\r\n/**\r\n * Aplica diferentes reglas según la posición en el array\r\n * @param rules - Objeto que mapea índices a reglas\r\n * @example arrayWithBankNums(bankNums, [5], byPosition({ 0: onlyEven, 1: onlyOdd }))\r\n */\r\nexport const byPosition = (rules: { [index: number]: ArrayRule }): ArrayRule => {\r\n return (num, arr) => {\r\n const position = arr.length;\r\n const rule = rules[position];\r\n return rule ? rule(num, arr) : true;\r\n };\r\n};\r\n\r\n/**\r\n * Aplica una regla solo en posiciones pares (0, 2, 4, ...)\r\n * @param rule - La regla a aplicar\r\n * @example arrayWithBankNums(bankNums, [6], onEvenPositions(onlyEven))\r\n */\r\nexport const onEvenPositions = (rule: ArrayRule): ArrayRule => {\r\n return (num, arr) => {\r\n const position = arr.length;\r\n return position % 2 === 0 ? rule(num, arr) : true;\r\n };\r\n};\r\n\r\n/**\r\n * Aplica una regla solo en posiciones impares (1, 3, 5, ...)\r\n * @param rule - La regla a aplicar\r\n * @example arrayWithBankNums(bankNums, [6], onOddPositions(onlyOdd))\r\n */\r\nexport const onOddPositions = (rule: ArrayRule): ArrayRule => {\r\n return (num, arr) => {\r\n const position = arr.length;\r\n return position % 2 !== 0 ? rule(num, arr) : true;\r\n };\r\n};\r\n\r\n// ============================================================================\r\n// COMBINADORES DE REGLAS\r\n// ============================================================================\r\n\r\n/**\r\n * Combina múltiples reglas con AND (todas deben cumplirse)\r\n * @param rules - Array de reglas a combinar\r\n * @example arrayWithBankNums(bankNums, [5], and([onlyEven, inRange(2, 8)]))\r\n */\r\nexport const and = (rules: ArrayRule[]): ArrayRule => {\r\n return (num, arr) => {\r\n return rules.every(rule => rule(num, arr));\r\n };\r\n};\r\n\r\n/**\r\n * Combina múltiples reglas con OR (al menos una debe cumplirse)\r\n * @param rules - Array de reglas a combinar\r\n * @example arrayWithBankNums(bankNums, [5], or([onlyEven, divisibleBy(3)]))\r\n */\r\nexport const or = (rules: ArrayRule[]): ArrayRule => {\r\n return (num, arr) => {\r\n return rules.some(rule => rule(num, arr));\r\n };\r\n};\r\n\r\n/**\r\n * Invierte una regla (NOT)\r\n * @param rule - La regla a invertir\r\n * @example arrayWithBankNums(bankNums, [5], not(onlyEven)) // Solo impares\r\n */\r\nexport const not = (rule: ArrayRule): ArrayRule => {\r\n return (num, arr) => {\r\n return !rule(num, arr);\r\n };\r\n};\r\n\r\n// ============================================================================\r\n// REGLAS AVANZADAS\r\n// ============================================================================\r\n\r\n/**\r\n * Solo permite números primos\r\n * @example arrayWithBankNums(bankNums, [5], onlyPrimes)\r\n */\r\nexport const onlyPrimes: ArrayRule = (num) => {\r\n if (num < 2) return false;\r\n for (let i = 2; i <= Math.sqrt(num); i++) {\r\n if (num % i === 0) return false;\r\n }\r\n return true;\r\n};\r\n\r\n/**\r\n * Solo permite números que sean cuadrados perfectos\r\n * @example arrayWithBankNums(bankNums, [5], onlySquares)\r\n */\r\nexport const onlySquares: ArrayRule = (num) => {\r\n const sqrt = Math.sqrt(num);\r\n return sqrt === Math.floor(sqrt);\r\n};\r\n\r\n/**\r\n * Asegura que la diferencia entre números consecutivos no exceda un límite\r\n * @param maxDiff - Diferencia máxima permitida\r\n * @example arrayWithBankNums(bankNums, [5], maxDifference(3))\r\n */\r\nexport const maxDifference = (maxDiff: number): ArrayRule => {\r\n return (num, arr) => {\r\n if (arr.length === 0) return true;\r\n const diff = Math.abs(num - arr[arr.length - 1]);\r\n return diff <= maxDiff;\r\n };\r\n};\r\n\r\n/**\r\n * Asegura que la diferencia entre números consecutivos sea al menos un mínimo\r\n * @param minDiff - Diferencia mínima requerida\r\n * @example arrayWithBankNums(bankNums, [5], minDifference(2))\r\n */\r\nexport const minDifference = (minDiff: number): ArrayRule => {\r\n return (num, arr) => {\r\n if (arr.length === 0) return true;\r\n const diff = Math.abs(num - arr[arr.length - 1]);\r\n return diff >= minDiff;\r\n };\r\n};\r\n\r\n/**\r\n * Mantiene un balance entre números pares e impares\r\n * @param maxImbalance - Diferencia máxima permitida entre cantidad de pares e impares\r\n * @example arrayWithBankNums(bankNums, [10], balanceEvenOdd(2))\r\n */\r\nexport const balanceEvenOdd = (maxImbalance: number = 1): ArrayRule => {\r\n return (num, arr) => {\r\n const evenCount = arr.filter(n => n % 2 === 0).length;\r\n const oddCount = arr.length - evenCount;\r\n const isEven = num % 2 === 0;\r\n\r\n if (isEven) {\r\n return (evenCount + 1) - oddCount <= maxImbalance;\r\n } else {\r\n return (oddCount + 1) - evenCount <= maxImbalance;\r\n }\r\n };\r\n};\r\n\r\n/**\r\n * Solo permite números en posiciones específicas del array\r\n * @param allowedPositions - Array de posiciones permitidas (0-indexed)\r\n * @param value - El valor que solo puede aparecer en esas posiciones\r\n * @example arrayWithBankNums(bankNums, [5], valueAtPositions([0, 2, 4], 7))\r\n */\r\nexport const valueAtPositions = (allowedPositions: number[], value: number): ArrayRule => {\r\n return (num, arr) => {\r\n const currentPosition = arr.length;\r\n if (num === value) {\r\n return allowedPositions.includes(currentPosition);\r\n }\r\n return true;\r\n };\r\n};\r\n","/**\r\n * Y-ary package entry point\r\n * Export your public API here\r\n */\r\n\r\nexport function hello(name: string): string {\r\n return `Hello, ${name}!`;\r\n}\r\n\r\n// Export formula interpreter\r\nexport { formulaInterpreter } from './formulas/formulaInterpreter';\r\n\r\n// Export array generation\r\nexport { arrayWithBankNums } from './algorithms/arrayGens';\r\n\r\n// Export all array validation rules\r\nexport * from './algorithms/arrayRules';\r\n\r\n// Export types\r\nexport type { };\r\n"]}
1
+ {"version":3,"sources":["../src/formulas/formulaInterpreter.ts","../src/algorithms/arrayGens.ts","../src/algorithms/arrayRules.ts","../src/index.ts"],"names":["result"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * Interprets a mathematical formula by replacing variables with their values\r\n * @param formula - Mathematical formula as a string (e.g., 'x/1 + y')\r\n * @param where - Object mapping variable names to their numeric values (e.g., {x: 4, y: 6})\r\n * @returns The evaluated result of the formula\r\n */\r\nexport const formulaInterpreter = (formula: string, where: { [key: string]: number }): number => {\r\n // Replace each variable in the formula with its value from the where object\r\n let processedFormula = formula;\r\n\r\n for (const [variable, value] of Object.entries(where)) {\r\n // Use regex with word boundaries to replace only complete variable names\r\n const regex = new RegExp(`\\\\b${variable}\\\\b`, 'g');\r\n processedFormula = processedFormula.replace(regex, String(value));\r\n }\r\n\r\n // Evaluate the mathematical expression\r\n // Using Function constructor is safer than eval for mathematical expressions\r\n try {\r\n const result = new Function(`return ${processedFormula}`)();\r\n return result;\r\n } catch (error) {\r\n throw new Error(`Invalid formula or evaluation error: ${error instanceof Error ? error.message : String(error)}`);\r\n }\r\n}","/**\r\n * Generates an array or matrix by randomly selecting numbers from a bank with occurrence limits.\r\n * \r\n * @param bankNums - Object where keys are the numbers to use and values are the maximum \r\n * number of times each number can appear in the array.\r\n * Example: { 1: 3, 2: 3, 3: 3 } means number 1 can appear up to 3 times,\r\n * number 2 can appear up to 3 times, etc.\r\n * \r\n * @param dims - Array dimensions:\r\n * - [length]: Creates a 1D array with the specified length\r\n * - [rows, cols]: Creates a 2D array (matrix) with the specified rows and columns\r\n * \r\n * @param extraRules - Optional validation callback that receives:\r\n * - candidateNum: The number being considered for addition\r\n * - currentArray: The flattened array built so far (for 2D arrays, this is all elements)\r\n * Returns true to allow the number, false to reject it and try another.\r\n * \r\n * @returns A 1D array or 2D array (matrix) of numbers randomly selected from bankNums,\r\n * respecting occurrence limits and any extra validation rules.\r\n */\r\nconst arrayWithBankNums = (\r\n bankNums: { [n: number]: number },\r\n dims: number[],\r\n extraRules?: (candidateNum: number, currentArray: number[]) => boolean\r\n): number[] | number[][] => {\r\n const is2D = dims.length === 2;\r\n const totalElements = is2D ? dims[0] * dims[1] : dims[0];\r\n\r\n const flatArray: number[] = [];\r\n const usageCount: { [n: number]: number } = {};\r\n const availableNumbers = Object.keys(bankNums).map(Number);\r\n\r\n for (let i = 0; i < totalElements; i++) {\r\n let candidateNum: number | null = null;\r\n let attempts = 0;\r\n const maxAttempts = 1000;\r\n\r\n while (candidateNum === null && attempts < maxAttempts) {\r\n attempts++;\r\n const randomIndex = Math.floor(Math.random() * availableNumbers.length);\r\n const selectedNum = availableNumbers[randomIndex];\r\n const currentUsage = usageCount[selectedNum] || 0;\r\n const maxUsage = bankNums[selectedNum];\r\n\r\n if (currentUsage >= maxUsage) {\r\n continue;\r\n }\r\n\r\n const passesExtraRules = extraRules ? extraRules(selectedNum, flatArray) : true;\r\n if (passesExtraRules) {\r\n candidateNum = selectedNum;\r\n }\r\n }\r\n\r\n if (candidateNum !== null) {\r\n flatArray.push(candidateNum);\r\n usageCount[candidateNum] = (usageCount[candidateNum] || 0) + 1;\r\n } else {\r\n console.warn(`Could not find valid number at position ${i} after ${maxAttempts} attempts`);\r\n break;\r\n }\r\n }\r\n\r\n if (is2D) {\r\n const rows = dims[0];\r\n const cols = dims[1];\r\n const matrix: number[][] = [];\r\n\r\n for (let row = 0; row < rows; row++) {\r\n const rowArray: number[] = [];\r\n for (let col = 0; col < cols; col++) {\r\n const index = row * cols + col;\r\n if (index < flatArray.length) {\r\n rowArray.push(flatArray[index]);\r\n }\r\n }\r\n matrix.push(rowArray);\r\n }\r\n return matrix;\r\n }\r\n\r\n return flatArray;\r\n};\r\n\r\n/**\r\n * Fisher-Yates shuffle algorithm\r\n */\r\nfunction shuffleArray<T>(array: T[]): T[] {\r\n for (let i = array.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1));\r\n [array[i], array[j]] = [array[j], array[i]];\r\n }\r\n return array;\r\n}\r\n\r\n/**\r\n * Generates an array or matrix with ORDERED selection from a bank of numbers.\r\n * Unlike arrayWithBankNums (which selects randomly), this function uses backtracking\r\n * to ensure ascending order within each row while respecting all constraints.\r\n * \r\n * Key difference: Each row starts fresh for ordering purposes, allowing patterns like:\r\n * - Row 1: [1, 4, 5]\r\n * - Row 2: [1, 2, 5] (starts from 1 again, not continuation)\r\n * \r\n * @param bankNums - Object where keys are the numbers to use and values are the maximum \r\n * number of times each number can appear in the array.\r\n * \r\n * @param dims - Array dimensions:\r\n * - [length]: Creates a 1D array with the specified length\r\n * - [rows, cols]: Creates a 2D array (matrix) with the specified rows and columns\r\n * \r\n * @param extraRules - Optional validation callback that receives:\r\n * - candidateNum: The number being considered for addition\r\n * - currentArray: The flattened array built so far\r\n * - rowSize: The size of each row (for 2D arrays) or total length (for 1D)\r\n * Returns true to allow the number, false to reject it.\r\n * \r\n * @returns A 1D array or 2D array (matrix) with ascending numbers per row.\r\n */\r\nconst orderedArrayWithBankNums = (\r\n bankNums: { [n: number]: number },\r\n dims: number[],\r\n extraRules?: (candidateNum: number, currentArray: number[], rowSize: number) => boolean\r\n): number[] | number[][] => {\r\n const is2D = dims.length === 2;\r\n const rowSize = is2D ? dims[1] : dims[0];\r\n const totalElements = is2D ? dims[0] * dims[1] : dims[0];\r\n\r\n const sortedNumbers = Object.keys(bankNums).map(Number).sort((a, b) => a - b);\r\n\r\n // Recursive backtracking solver\r\n function solve(\r\n flatArray: number[],\r\n usageCount: { [n: number]: number }\r\n ): number[] | null {\r\n if (flatArray.length === totalElements) {\r\n return flatArray;\r\n }\r\n\r\n const posInRow = flatArray.length % rowSize;\r\n const minValue = posInRow === 0 ? -Infinity : flatArray[flatArray.length - 1];\r\n\r\n const candidates = sortedNumbers.filter(num => {\r\n const usage = usageCount[num] || 0;\r\n return usage < bankNums[num] && num > minValue;\r\n });\r\n\r\n const shuffled = shuffleArray([...candidates]);\r\n\r\n for (const num of shuffled) {\r\n if (extraRules && !extraRules(num, flatArray, rowSize)) {\r\n continue;\r\n }\r\n\r\n const newArray = [...flatArray, num];\r\n const newUsage = { ...usageCount, [num]: (usageCount[num] || 0) + 1 };\r\n\r\n const result = solve(newArray, newUsage);\r\n if (result !== null) {\r\n return result;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n let result: number[] | null = null;\r\n for (let attempt = 0; attempt < 50 && result === null; attempt++) {\r\n result = solve([], {});\r\n }\r\n\r\n if (result === null) {\r\n console.warn('Could not generate valid array with given constraints');\r\n result = [];\r\n }\r\n\r\n if (is2D && result.length > 0) {\r\n const matrix: number[][] = [];\r\n const cols = dims[1];\r\n\r\n for (let row = 0; row < dims[0]; row++) {\r\n const rowArray: number[] = [];\r\n for (let col = 0; col < cols; col++) {\r\n const index = row * cols + col;\r\n if (index < result.length) {\r\n rowArray.push(result[index]);\r\n }\r\n }\r\n if (rowArray.length > 0) {\r\n matrix.push(rowArray);\r\n }\r\n }\r\n return matrix;\r\n }\r\n\r\n return result;\r\n};\r\n\r\n/**\r\n * Decompresses a single row of indices into a boolean array.\r\n * Indices are 1-based: [1, 3, 5] with size 6 → [true, false, true, false, true, false]\r\n * \r\n * @param compressedRow - Array of indices (1-based) representing positions with `true` value\r\n * @param size - The total size of the decompressed array\r\n * @returns Array of booleans where positions indicated by indices are `true`\r\n * \r\n * @example\r\n * decompressRow([3, 5, 6], 6)\r\n * // Returns: [false, false, true, false, true, true]\r\n * \r\n * @example\r\n * decompressRow([1, 3, 6], 6)\r\n * // Returns: [true, false, true, false, false, true]\r\n */\r\nconst decompressRow = (compressedRow: number[], size: number): boolean[] => {\r\n const result: boolean[] = new Array(size).fill(false);\r\n for (const index of compressedRow) {\r\n if (index >= 1 && index <= size) {\r\n result[index - 1] = true;\r\n }\r\n }\r\n return result;\r\n};\r\n\r\n/**\r\n * Decompresses an entire matrix of compressed rows into a matrix of boolean arrays.\r\n * \r\n * @param compressedMatrix - 2D array where each row contains indices (1-based)\r\n * @param rowSize - The size of each decompressed row\r\n * @returns 2D array of booleans\r\n * \r\n * @example\r\n * const compressed = [[3, 5, 6], [1, 3, 6], [1, 4, 5]];\r\n * decompressMatrix(compressed, 6)\r\n * // Returns:\r\n * // [\r\n * // [false, false, true, false, true, true],\r\n * // [true, false, true, false, false, true],\r\n * // [true, false, false, true, true, false]\r\n * // ]\r\n */\r\nconst decompressMatrix = (compressedMatrix: number[][], rowSize: number): boolean[][] => {\r\n return compressedMatrix.map(row => decompressRow(row, rowSize));\r\n};\r\n\r\nexport { arrayWithBankNums, orderedArrayWithBankNums, decompressRow, decompressMatrix };","/**\r\n * Array Rules - Colección de funciones de validación para usar con arrayWithBankNums\r\n * \r\n * Estas funciones pueden ser usadas como el parámetro `extraRules` en arrayWithBankNums\r\n * para aplicar restricciones adicionales durante la generación del array.\r\n */\r\n\r\n/**\r\n * Type definition for array rule functions\r\n */\r\nexport type ArrayRule = (candidateNum: number, currentArray: number[]) => boolean;\r\n\r\n// ============================================================================\r\n// REGLAS BÁSICAS DE PARIDAD\r\n// ============================================================================\r\n\r\n/**\r\n * Solo permite números pares\r\n * @example arrayWithBankNums(bankNums, [5], onlyEven)\r\n */\r\nexport const onlyEven: ArrayRule = (num) => num % 2 === 0;\r\n\r\n/**\r\n * Solo permite números impares\r\n * @example arrayWithBankNums(bankNums, [5], onlyOdd)\r\n */\r\nexport const onlyOdd: ArrayRule = (num) => num % 2 !== 0;\r\n\r\n// ============================================================================\r\n// REGLAS DE RANGO\r\n// ============================================================================\r\n\r\n/**\r\n * Crea una regla que solo permite números dentro de un rango específico\r\n * @param min - Valor mínimo (inclusivo)\r\n * @param max - Valor máximo (inclusivo)\r\n * @example arrayWithBankNums(bankNums, [5], inRange(1, 5))\r\n */\r\nexport const inRange = (min: number, max: number): ArrayRule => {\r\n return (num) => num >= min && num <= max;\r\n};\r\n\r\n/**\r\n * Crea una regla que excluye números dentro de un rango específico\r\n * @param min - Valor mínimo a excluir (inclusivo)\r\n * @param max - Valor máximo a excluir (inclusivo)\r\n * @example arrayWithBankNums(bankNums, [5], notInRange(3, 7))\r\n */\r\nexport const notInRange = (min: number, max: number): ArrayRule => {\r\n return (num) => num < min || num > max;\r\n};\r\n\r\n// ============================================================================\r\n// REGLAS DE REPETICIÓN\r\n// ============================================================================\r\n\r\n/**\r\n * No permite números consecutivos repetidos\r\n * @example arrayWithBankNums(bankNums, [5], noConsecutiveRepeats)\r\n */\r\nexport const noConsecutiveRepeats: ArrayRule = (num, arr) => {\r\n if (arr.length === 0) return true;\r\n return arr[arr.length - 1] !== num;\r\n};\r\n\r\n/**\r\n * No permite que un número aparezca más de N veces en el array\r\n * @param maxCount - Número máximo de veces que puede aparecer\r\n * @example arrayWithBankNums(bankNums, [10], maxOccurrences(2))\r\n */\r\nexport const maxOccurrences = (maxCount: number): ArrayRule => {\r\n return (num, arr) => {\r\n const count = arr.filter(n => n === num).length;\r\n return count < maxCount;\r\n };\r\n};\r\n\r\n/**\r\n * No permite duplicados en el array (cada número solo puede aparecer una vez)\r\n * @example arrayWithBankNums(bankNums, [5], noDuplicates)\r\n */\r\nexport const noDuplicates: ArrayRule = (num, arr) => {\r\n return !arr.includes(num);\r\n};\r\n\r\n/**\r\n * No permite que el mismo número aparezca en las últimas N posiciones\r\n * @param positions - Número de posiciones a verificar\r\n * @example arrayWithBankNums(bankNums, [10], noRepeatInLast(3))\r\n */\r\nexport const noRepeatInLast = (positions: number): ArrayRule => {\r\n return (num, arr) => {\r\n const lastN = arr.slice(-positions);\r\n return !lastN.includes(num);\r\n };\r\n};\r\n\r\n// ============================================================================\r\n// REGLAS DE SUMA Y PROMEDIO\r\n// ============================================================================\r\n\r\n/**\r\n * Solo permite números que mantengan la suma total por debajo de un límite\r\n * @param maxSum - Suma máxima permitida\r\n * @example arrayWithBankNums(bankNums, [5], sumLessThan(20))\r\n */\r\nexport const sumLessThan = (maxSum: number): ArrayRule => {\r\n return (num, arr) => {\r\n const currentSum = arr.reduce((sum, n) => sum + n, 0);\r\n return currentSum + num < maxSum;\r\n };\r\n};\r\n\r\n/**\r\n * Solo permite números que mantengan la suma total por encima de un límite\r\n * @param minSum - Suma mínima requerida\r\n * @example arrayWithBankNums(bankNums, [5], sumGreaterThan(10))\r\n */\r\nexport const sumGreaterThan = (minSum: number): ArrayRule => {\r\n return (num, arr) => {\r\n const currentSum = arr.reduce((sum, n) => sum + n, 0);\r\n return currentSum + num > minSum;\r\n };\r\n};\r\n\r\n/**\r\n * Solo permite números que mantengan el promedio dentro de un rango\r\n * @param min - Promedio mínimo\r\n * @param max - Promedio máximo\r\n * @example arrayWithBankNums(bankNums, [5], averageInRange(3, 7))\r\n */\r\nexport const averageInRange = (min: number, max: number): ArrayRule => {\r\n return (num, arr) => {\r\n if (arr.length === 0) return true;\r\n const newSum = arr.reduce((sum, n) => sum + n, 0) + num;\r\n const newAverage = newSum / (arr.length + 1);\r\n return newAverage >= min && newAverage <= max;\r\n };\r\n};\r\n\r\n// ============================================================================\r\n// REGLAS DE SECUENCIA Y PATRÓN\r\n// ============================================================================\r\n\r\n/**\r\n * Solo permite números que sean mayores que el último número en el array (orden ascendente)\r\n * @example arrayWithBankNums(bankNums, [5], ascending)\r\n */\r\nexport const ascending: ArrayRule = (num, arr) => {\r\n if (arr.length === 0) return true;\r\n return num > arr[arr.length - 1];\r\n};\r\n\r\n/**\r\n * Solo permite números que sean menores que el último número en el array (orden descendente)\r\n * @example arrayWithBankNums(bankNums, [5], descending)\r\n */\r\nexport const descending: ArrayRule = (num, arr) => {\r\n if (arr.length === 0) return true;\r\n return num < arr[arr.length - 1];\r\n};\r\n\r\n/**\r\n * Solo permite números que sean diferentes del último número (no estrictamente ascendente/descendente)\r\n * @example arrayWithBankNums(bankNums, [5], different)\r\n */\r\nexport const different: ArrayRule = (num, arr) => {\r\n if (arr.length === 0) return true;\r\n return num !== arr[arr.length - 1];\r\n};\r\n\r\n/**\r\n * Alterna entre números pares e impares\r\n * @example arrayWithBankNums(bankNums, [6], alternateEvenOdd)\r\n */\r\nexport const alternateEvenOdd: ArrayRule = (num, arr) => {\r\n if (arr.length === 0) return true;\r\n const lastWasEven = arr[arr.length - 1] % 2 === 0;\r\n const currentIsEven = num % 2 === 0;\r\n return lastWasEven !== currentIsEven;\r\n};\r\n\r\n// ============================================================================\r\n// REGLAS DE DIVISIBILIDAD\r\n// ============================================================================\r\n\r\n/**\r\n * Solo permite números divisibles por un divisor específico\r\n * @param divisor - El divisor\r\n * @example arrayWithBankNums(bankNums, [5], divisibleBy(3))\r\n */\r\nexport const divisibleBy = (divisor: number): ArrayRule => {\r\n return (num) => num % divisor === 0;\r\n};\r\n\r\n/**\r\n * Solo permite números que NO sean divisibles por un divisor específico\r\n * @param divisor - El divisor\r\n * @example arrayWithBankNums(bankNums, [5], notDivisibleBy(5))\r\n */\r\nexport const notDivisibleBy = (divisor: number): ArrayRule => {\r\n return (num) => num % divisor !== 0;\r\n};\r\n\r\n// ============================================================================\r\n// REGLAS DE POSICIÓN\r\n// ============================================================================\r\n\r\n/**\r\n * Aplica diferentes reglas según la posición en el array\r\n * @param rules - Objeto que mapea índices a reglas\r\n * @example arrayWithBankNums(bankNums, [5], byPosition({ 0: onlyEven, 1: onlyOdd }))\r\n */\r\nexport const byPosition = (rules: { [index: number]: ArrayRule }): ArrayRule => {\r\n return (num, arr) => {\r\n const position = arr.length;\r\n const rule = rules[position];\r\n return rule ? rule(num, arr) : true;\r\n };\r\n};\r\n\r\n/**\r\n * Aplica una regla solo en posiciones pares (0, 2, 4, ...)\r\n * @param rule - La regla a aplicar\r\n * @example arrayWithBankNums(bankNums, [6], onEvenPositions(onlyEven))\r\n */\r\nexport const onEvenPositions = (rule: ArrayRule): ArrayRule => {\r\n return (num, arr) => {\r\n const position = arr.length;\r\n return position % 2 === 0 ? rule(num, arr) : true;\r\n };\r\n};\r\n\r\n/**\r\n * Aplica una regla solo en posiciones impares (1, 3, 5, ...)\r\n * @param rule - La regla a aplicar\r\n * @example arrayWithBankNums(bankNums, [6], onOddPositions(onlyOdd))\r\n */\r\nexport const onOddPositions = (rule: ArrayRule): ArrayRule => {\r\n return (num, arr) => {\r\n const position = arr.length;\r\n return position % 2 !== 0 ? rule(num, arr) : true;\r\n };\r\n};\r\n\r\n// ============================================================================\r\n// COMBINADORES DE REGLAS\r\n// ============================================================================\r\n\r\n/**\r\n * Combina múltiples reglas con AND (todas deben cumplirse)\r\n * @param rules - Array de reglas a combinar\r\n * @example arrayWithBankNums(bankNums, [5], and([onlyEven, inRange(2, 8)]))\r\n */\r\nexport const and = (rules: ArrayRule[]): ArrayRule => {\r\n return (num, arr) => {\r\n return rules.every(rule => rule(num, arr));\r\n };\r\n};\r\n\r\n/**\r\n * Combina múltiples reglas con OR (al menos una debe cumplirse)\r\n * @param rules - Array de reglas a combinar\r\n * @example arrayWithBankNums(bankNums, [5], or([onlyEven, divisibleBy(3)]))\r\n */\r\nexport const or = (rules: ArrayRule[]): ArrayRule => {\r\n return (num, arr) => {\r\n return rules.some(rule => rule(num, arr));\r\n };\r\n};\r\n\r\n/**\r\n * Invierte una regla (NOT)\r\n * @param rule - La regla a invertir\r\n * @example arrayWithBankNums(bankNums, [5], not(onlyEven)) // Solo impares\r\n */\r\nexport const not = (rule: ArrayRule): ArrayRule => {\r\n return (num, arr) => {\r\n return !rule(num, arr);\r\n };\r\n};\r\n\r\n// ============================================================================\r\n// REGLAS AVANZADAS\r\n// ============================================================================\r\n\r\n/**\r\n * Solo permite números primos\r\n * @example arrayWithBankNums(bankNums, [5], onlyPrimes)\r\n */\r\nexport const onlyPrimes: ArrayRule = (num) => {\r\n if (num < 2) return false;\r\n for (let i = 2; i <= Math.sqrt(num); i++) {\r\n if (num % i === 0) return false;\r\n }\r\n return true;\r\n};\r\n\r\n/**\r\n * Solo permite números que sean cuadrados perfectos\r\n * @example arrayWithBankNums(bankNums, [5], onlySquares)\r\n */\r\nexport const onlySquares: ArrayRule = (num) => {\r\n const sqrt = Math.sqrt(num);\r\n return sqrt === Math.floor(sqrt);\r\n};\r\n\r\n/**\r\n * Asegura que la diferencia entre números consecutivos no exceda un límite\r\n * @param maxDiff - Diferencia máxima permitida\r\n * @example arrayWithBankNums(bankNums, [5], maxDifference(3))\r\n */\r\nexport const maxDifference = (maxDiff: number): ArrayRule => {\r\n return (num, arr) => {\r\n if (arr.length === 0) return true;\r\n const diff = Math.abs(num - arr[arr.length - 1]);\r\n return diff <= maxDiff;\r\n };\r\n};\r\n\r\n/**\r\n * Asegura que la diferencia entre números consecutivos sea al menos un mínimo\r\n * @param minDiff - Diferencia mínima requerida\r\n * @example arrayWithBankNums(bankNums, [5], minDifference(2))\r\n */\r\nexport const minDifference = (minDiff: number): ArrayRule => {\r\n return (num, arr) => {\r\n if (arr.length === 0) return true;\r\n const diff = Math.abs(num - arr[arr.length - 1]);\r\n return diff >= minDiff;\r\n };\r\n};\r\n\r\n/**\r\n * Mantiene un balance entre números pares e impares\r\n * @param maxImbalance - Diferencia máxima permitida entre cantidad de pares e impares\r\n * @example arrayWithBankNums(bankNums, [10], balanceEvenOdd(2))\r\n */\r\nexport const balanceEvenOdd = (maxImbalance: number = 1): ArrayRule => {\r\n return (num, arr) => {\r\n const evenCount = arr.filter(n => n % 2 === 0).length;\r\n const oddCount = arr.length - evenCount;\r\n const isEven = num % 2 === 0;\r\n\r\n if (isEven) {\r\n return (evenCount + 1) - oddCount <= maxImbalance;\r\n } else {\r\n return (oddCount + 1) - evenCount <= maxImbalance;\r\n }\r\n };\r\n};\r\n\r\n/**\r\n * Solo permite números en posiciones específicas del array\r\n * @param allowedPositions - Array de posiciones permitidas (0-indexed)\r\n * @param value - El valor que solo puede aparecer en esas posiciones\r\n * @example arrayWithBankNums(bankNums, [5], valueAtPositions([0, 2, 4], 7))\r\n */\r\nexport const valueAtPositions = (allowedPositions: number[], value: number): ArrayRule => {\r\n return (num, arr) => {\r\n const currentPosition = arr.length;\r\n if (num === value) {\r\n return allowedPositions.includes(currentPosition);\r\n }\r\n return true;\r\n };\r\n};\r\n","/**\r\n * Y-ary package entry point\r\n * Export your public API here\r\n */\r\n\r\nexport function hello(name: string): string {\r\n return `Hello, ${name}!`;\r\n}\r\n\r\n// Export formula interpreter\r\nexport { formulaInterpreter } from './formulas/formulaInterpreter';\r\n\r\n// Export array generation and decompression\r\nexport { arrayWithBankNums, orderedArrayWithBankNums, decompressRow, decompressMatrix } from './algorithms/arrayGens';\r\n\r\n// Export all array validation rules\r\nexport * from './algorithms/arrayRules';\r\n\r\n// Export types\r\nexport type { };\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "y-ary",
3
- "version": "0.0.2",
3
+ "version": "0.0.5",
4
4
  "description": "Experimental TypeScript math library: Formula interpreter + smart array generation with 30+ validation rules",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -27,7 +27,11 @@
27
27
  "build": "tsup",
28
28
  "dev": "tsup --watch",
29
29
  "prepublishOnly": "pnpm run build",
30
- "test": "echo \"Error: no test specified\" && exit 1"
30
+ "test": "echo \"Error: no test specified\" && exit 1",
31
+ "release:patch": "npm version patch && git push origin main --tags && npm publish",
32
+ "release:minor": "npm version minor && git push origin main --tags && npm publish",
33
+ "release:major": "npm version major && git push origin main --tags && npm publish",
34
+ "release": "pnpm run release:patch"
31
35
  },
32
36
  "keywords": [
33
37
  "typescript",
@@ -52,6 +56,9 @@
52
56
  "url": "https://github.com/AmaiDonatsu/Y-ary/issues"
53
57
  },
54
58
  "license": "MIT",
55
- "devDependencies": {},
59
+ "devDependencies": {
60
+ "tsup": "^8.5.1",
61
+ "typescript": "^5.9.3"
62
+ },
56
63
  "packageManager": "pnpm@10.15.1"
57
- }
64
+ }