{"version":3,"sources":["../../src/number/index.ts"],"sourcesContent":["export const FromNum = {\n    /**\n     * A generic roll. Anything larger than 100 will be true,\n     * lesser than 0 will be false.\n     * @param percentage 0~100\n     * @returns Fail(false)/Success(true)\n     */\n    roll(percentage: number): boolean {\n        const fixed = percentage / 100;\n        if (fixed >= Math.random()) return true;\n        return false;\n    },\n    /**\n     * Dice roll for your typical TRPG game.\n     * Ex) FromNum.diceRoll(3).D(20) = Roll 3 D20 Dice.\n     * Ex) FromNum.diceRoll(1).D(6) = Roll 1 D6 Dice.\n     * @param num Number of dice to roll\n     */\n    diceRoll(num: number) {\n        const _roll = (sides: number): number => Math.floor(Math.random() * sides) + 1;\n        return {\n            /**\n             * @param diceType Type of dice (e.g. 6, 10, 20).\n             * @returns number[]\n             */\n            D: (diceType: number): number[] => {\n                const rs: number[] = [];\n                for (let i = 0; i < num; i++) rs.push(_roll(diceType));\n                return rs;\n            },\n        };\n    },\n    /**\n     * Scale number down to 0 ~ 1.\n     * @param x  Input number\n     * @param min Min number\n     * @param max Max number\n     */\n    minMaxScale(x: number, min: number, max: number): number {\n        return (x - min) / (max - min);\n    },\n    /**\n     * Return scaled down number back to normal.\n     * @param x  Input number\n     * @param min Min number\n     * @param max Max number\n     */\n    unMinMaxScale(x: number, min: number, max: number): number {\n        return (x * (max - min)) + min;\n    },\n    /**\n     * Return the sum of the values.\n     * @param nums Array of numbers\n     */\n    sum(nums: number[]): number {\n        return nums.reduce((a, b) => a + b);\n    },\n    /**\n     * SoftMax / normalized exponential function.\n     * Returns a probability distribution of K possible outcomes.\n     * @param input Array of numbers\n     */\n    softMax(input: number[]): number[] {\n        if (input.length === 0) return [];\n        const total = input.reduce((a, b) => a + Math.exp(b), 0);\n        return input.map((n) => Math.exp(n) / total);\n    },\n    /**\n     * Return the arithmetic mean of a list of numbers.\n     * @param input Array of numbers\n     */\n    mean(input: number[]): number {\n        if (input.length === 0) return 0;\n        return input.reduce((a, b) => a + b, 0) / input.length;\n    },\n    /**\n     * Convert numeric values into Roman Numeral string.\n     * @param number Input number.\n     */\n    toRomanNumeral(number: number): string {\n        const strMap: Record<string, number> = {\n            M: 1000, CM: 900, D: 500, CD: 400,\n            C: 100, XC: 90, L: 50, XL: 40,\n            X: 10, IX: 9, V: 5, IV: 4, I: 1,\n        };\n        let input = number;\n        let rs = \"\";\n        for (const n in strMap) {\n            const tmp = Math.floor(input / strMap[n]);\n            for (let i = 0; i < tmp; i++) rs += n;\n            input -= tmp * strMap[n];\n        }\n        return rs;\n    },\n    /**\n     * Sigmoid function — bounded, differentiable, defined for all real inputs.\n     * @param x number or number[]\n     */\n    sigmoid(x: number | number[]): number | number[] {\n        const _f = (_x: number) => 1 / (1 + Math.exp(-_x));\n        if (Array.isArray(x)) return x.map((n) => _f(n));\n        return _f(x);\n    },\n    /**\n     * ReLU (Rectified Linear Unit) — f(x) = max(0, x).\n     * Outputs input directly if positive, otherwise zero.\n     * @param xs number[]\n     */\n    relu(xs: number[]): number[] {\n        return xs.map((x) => Math.max(0, x));\n    },\n    /**\n     * Softplus — smooth version of ReLU. f(x) = log(1 + exp(x))\n     * @param xs number[]\n     */\n    softPlus(xs: number[]): number[] {\n        return xs.map((x) => Math.log(1 + Math.exp(x)));\n    },\n    /**\n     * Round number to nearest specified multiple.\n     * @param n Number to round\n     * @param r Multiple to round to\n     */\n    toNearest(n: number, r: number): number {\n        return Math.round(n / r) * r;\n    },\n    /**\n     * Convert number into a short readable string.\n     * Does not round when truncating decimals.\n     * @param n Input number\n     * @param decimal Default = 2, number of decimal places to retain.\n     * @param maxLen Default = 3, maximum digit length (overwrites decimal).\n     */\n    toShortReadable(n: number, decimal: number = 2, maxLen: number = 3): string {\n        const symbols: Record<string, number> = { \"\": 0, k: 1_000, m: 1_000_000 };\n        let symbol = \"\";\n        for (const s in symbols) {\n            if (symbols[s] > n) break;\n            symbol = s;\n        }\n        if (symbol === \"\") return `${n}`;\n        const divided = (n / symbols[symbol]).toFixed(decimal).split(\"\");\n        while (divided.length > maxLen + 1) divided.pop();       // +1 for \".\"\n        while (divided.at(-1) === \"0\") divided.pop();            // trim trailing zeros\n        if (divided.at(-1) === \".\") divided.pop();               // trim trailing dot\n        return `${divided.join(\"\")}${symbol}`;\n    },\n};\n"],"mappings":"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","names":[]}