状态压缩

Mask

TypeScript
export function useMask(array: number[], m: number) {
    const nums = [...array]
    const n = nums.length
    const pow = new Array(n + 1).fill(0).map((_, idx) => m ** idx)

    let data = 0
    for (let i = n - 1; i >= 0; i--) {
        if (typeof nums[i] !== 'number' || nums[i] >= m || nums[i] < 0) {
            throw new Error(
                `数组元素不正确:下标为 ${i} 的值 ${nums[i]}。请确保元素为正整数,且不超过最大进制`,
            )
        }
        data = data * m + nums[i]
    }
    if (data > Number.MAX_SAFE_INTEGER)
        throw new Error('超出最大数字范围,要不还是换个语言吧')

    const get = (index: number) => {
        return nums[index]
    }

    const set = (index: number, val: number) => {
        if (index < 0 || index >= n || val >= m || val < 0) return false
        const l = Math.trunc(data / pow[index + 1])
        const r = data % pow[index]
        data = (l * m + val) * pow[index] + r

        nums[index] = val
        return true
    }

    const toArray = () => {
        return [...nums]
    }

    const value = () => data

    return { get, set, value, toArray }
}
JavaScript
export function useMask(array, m) {
    const nums = [...array]
    const n = nums.length
    const pow = new Array(n + 1).fill(0).map((_, idx) => m ** idx)
    let data = 0
    for (let i = n - 1; i >= 0; i--) {
        if (typeof nums[i] !== 'number' || nums[i] >= m || nums[i] < 0) {
            throw new Error(
                `数组元素不正确:下标为 ${i} 的值 ${nums[i]}。请确保元素为正整数,且不超过最大进制`,
            )
        }
        data = data * m + nums[i]
    }
    if (data > Number.MAX_SAFE_INTEGER)
        throw new Error('超出最大数字范围,要不还是换个语言吧')
    const get = (index) => {
        return nums[index]
    }
    const set = (index, val) => {
        if (index < 0 || index >= n || val >= m || val < 0) return false
        const l = Math.trunc(data / pow[index + 1])
        const r = data % pow[index]
        data = (l * m + val) * pow[index] + r
        nums[index] = val
        return true
    }
    const toArray = () => {
        return [...nums]
    }
    const value = () => data
    return { get, set, value, toArray }
}