From 9d15b8941040625d3940406a25a63c89871971a4 Mon Sep 17 00:00:00 2001 From: Saplonily Date: Thu, 29 Sep 2022 18:30:24 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=8B=BC=E5=86=99=E9=94=99=E8=AF=AF=20disc?= =?UTF-8?q?ription->description?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 79 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 47 insertions(+), 32 deletions(-) diff --git a/index.html b/index.html index 6eab608..a2d2406 100644 --- a/index.html +++ b/index.html @@ -1,13 +1,14 @@ + 恶臭数字论证器 - + +
@@ -94,13 +108,14 @@ - + + \ No newline at end of file From 8708f7a957b81b65f60631a85f4be87236ff93a9 Mon Sep 17 00:00:00 2001 From: Saplonily Date: Mon, 9 Jan 2023 15:02:33 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E5=8E=BB=E9=99=A4=E4=BA=86^(1)=E8=BF=99?= =?UTF-8?q?=E7=A7=8D=E8=A1=A8=E8=BE=BE=E5=BC=8F=E7=9A=84=E5=AD=98=E5=9C=A8?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E5=8A=A0=E4=BA=86=E4=B8=80=E4=BA=9B=E6=B3=A8?= =?UTF-8?q?=E9=87=8A,=20=E6=9B=B4=E6=94=B9=E4=BA=86=E5=BE=88=E5=A4=9A?= =?UTF-8?q?=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- homo.js | 72 +++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 45 insertions(+), 27 deletions(-) diff --git a/homo.js b/homo.js index b47e513..7cea506 100644 --- a/homo.js +++ b/homo.js @@ -1,55 +1,74 @@ -const homo = ((Nums) => { - const numsReversed = Object.keys(Nums).map(x => +x).filter(x => x > 0) - const getMinDiv = (num) => { - for (let i = numsReversed.length; i >= 0; i--) - if (num >= numsReversed[i]) - return numsReversed[i] +const homo = ((numsTable) => { + + //将js对象形式的表转成数组, 表示所有打表后的数 + const numsArrayDescending = Object.keys(numsTable).map(x => x).filter(x => x > 0) + + //获得小于num的最大已打表的值 + const getMaximumRecordedLessThan = (num) => { + for (let i = numsArrayDescending.length; i >= 0; i--) + if (num >= numsArrayDescending[i]) + return numsArrayDescending[i] } - const isDotRegex = /\.(\d+?)0{0,}$/ - const demolish = (num) => { + //用于获取小数点后有效数字个数的正则 + const afterPointDigitsOfNumRegex = /\.(\d+?)0{0,}$/ + + // 将数字打碎为表内已有数字间的运算 + const breakNumbers = (num) => { if (typeof num !== "number") return "" if (num === Infinity || Number.isNaN(num)) return `这么恶臭的${num}有必要论证吗` + // 数字小于0, 前面乘个-1然后返回正数打碎后的式子 if (num < 0) - return `(⑨)*(${demolish(num * -1)})`.replace(/\*\(1\)/g, "") + return `(⑨)*(${breakNumbers(num * -1)})` + // 非整数 if (!Number.isInteger(num)) { - // abs(num) is definitely smaller than 2**51 - // rescale - const n = num.toFixed(16).match(isDotRegex)[1].length - return `(${demolish(num * Math.pow(10, n))})/(10)^(${n})` + // n为小数点后有效数字个数 + const n = num.toFixed(16).match(afterPointDigitsOfNumRegex)[1].length + return `(${breakNumbers(num * Math.pow(10, n))})/(10)^(${n})`.replace("^(1)", "") } - if (Nums[num]) + // 表内已有值直接返回 + if (numsTable[num]) return String(num) - const div = getMinDiv(num) - return (`${div}*(${demolish(Math.floor(num / div))})+` + - `(${demolish(num % div)})`).replace(/\*\(1\)|\+\(0\)$/g, "") + const maximumRecordedNum = getMaximumRecordedLessThan(num); + + // 将不在表内的数字转换成已有数字的表达式, 具体算法是个数学问题, 可以自己琢磨琢磨 + const rst = `${maximumRecordedNum}*(${breakNumbers(Math.floor(num / maximumRecordedNum))})+` + `(${breakNumbers(num % maximumRecordedNum)})` + + //把所有 *(1) 和 +(0) 和 ^(1) 这种无意义式子去掉 + return rst.replace("*(1)", "").replace("+(0)", "").replace("^(1)", "") } - //Finisher - const finisher = (expr) => { - expr = expr.replace(/\d+|⑨/g, (n) => Nums[n]).replace("^", "**") - //As long as it matches ([\*|\/])\(([^\+\-\(\)]+)\), replace it with $1$2 + + const trimer = (expr) => { + // 将所有表内值转换为具体记录的表达式并且把^换成** + expr = expr.replace(/\d+|⑨/g, (n) => numsTable[n]).replace("^", "**") + + // 去乘除一个只有乘除没有括号的式子时可去除括号 while (expr.match(/[\*|\/]\([^\+\-\(\)]+\)/)) expr = expr.replace(/([\*|\/])\(([^\+\-\(\)]+)\)/, (m, $1, $2) => $1 + $2) - //As long as it matches ([\+|\-])\(([^\(\)]+)\)([\+|\-|\)]), replace it with $1$2$3 + + // 一个式子如果里面没括号且外边只有+-时可去除括号 while (expr.match(/[\+|\-]\([^\(\)]+\)[\+|\-|\)]/)) expr = expr.replace(/([\+|\-])\(([^\(\)]+)\)([\+|\-|\)])/, (m, $1, $2, $3) => $1 + $2 + $3) - //As long as it matches ([\+|\-])\(([^\(\)]+)\)$, replace it with $1$2 + + // 加减一个处于末尾的表达式可以去除括号 while (expr.match(/[\+|\-]\(([^\(\)]+)\)$/)) expr = expr.replace(/([\+|\-])\(([^\(\)]+)\)$/, (m, $1, $2) => $1 + $2) - //If there is a bracket in the outermost part, remove it + + // 去除最外围的括号 if (expr.match(/^\([^\(\)]+?\)$/)) expr = expr.replace(/^\(([^\(\)]+)\)$/, "$1") - expr = expr.replace(/\+-/g,'-') + // +- 直接连接时去除+号 + expr = expr.replace(/\+-/g, '-') return expr } - return (num) => finisher(demolish(num)) + return (num) => trimer(breakNumbers(num)) })({ 229028: "(114514+114514)", 114514: "114514", @@ -576,4 +595,3 @@ const homo = ((Nums) => { if (typeof module === 'object' && module.exports) module.exports = homo - From c47ba562cacb580e50e8e28fbd433c311b1dbc09 Mon Sep 17 00:00:00 2001 From: Saplonily Date: Mon, 9 Jan 2023 15:04:59 +0800 Subject: [PATCH 3/4] breakNumbers -> breakNumber --- homo.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/homo.js b/homo.js index 7cea506..d1d85d1 100644 --- a/homo.js +++ b/homo.js @@ -13,7 +13,7 @@ const homo = ((numsTable) => { const afterPointDigitsOfNumRegex = /\.(\d+?)0{0,}$/ // 将数字打碎为表内已有数字间的运算 - const breakNumbers = (num) => { + const breakNumber = (num) => { if (typeof num !== "number") return "" @@ -22,13 +22,13 @@ const homo = ((numsTable) => { // 数字小于0, 前面乘个-1然后返回正数打碎后的式子 if (num < 0) - return `(⑨)*(${breakNumbers(num * -1)})` + return `(⑨)*(${breakNumber(num * -1)})` // 非整数 if (!Number.isInteger(num)) { // n为小数点后有效数字个数 const n = num.toFixed(16).match(afterPointDigitsOfNumRegex)[1].length - return `(${breakNumbers(num * Math.pow(10, n))})/(10)^(${n})`.replace("^(1)", "") + return `(${breakNumber(num * Math.pow(10, n))})/(10)^(${n})`.replace("^(1)", "") } // 表内已有值直接返回 @@ -38,7 +38,7 @@ const homo = ((numsTable) => { const maximumRecordedNum = getMaximumRecordedLessThan(num); // 将不在表内的数字转换成已有数字的表达式, 具体算法是个数学问题, 可以自己琢磨琢磨 - const rst = `${maximumRecordedNum}*(${breakNumbers(Math.floor(num / maximumRecordedNum))})+` + `(${breakNumbers(num % maximumRecordedNum)})` + const rst = `${maximumRecordedNum}*(${breakNumber(Math.floor(num / maximumRecordedNum))})+` + `(${breakNumber(num % maximumRecordedNum)})` //把所有 *(1) 和 +(0) 和 ^(1) 这种无意义式子去掉 return rst.replace("*(1)", "").replace("+(0)", "").replace("^(1)", "") @@ -68,7 +68,7 @@ const homo = ((numsTable) => { expr = expr.replace(/\+-/g, '-') return expr } - return (num) => trimer(breakNumbers(num)) + return (num) => trimer(breakNumber(num)) })({ 229028: "(114514+114514)", 114514: "114514", From 5d45056837a87b3ca8fa6c1a06fb19aa0fd1a85f Mon Sep 17 00:00:00 2001 From: Saplonily Date: Mon, 9 Jan 2023 19:08:40 +0800 Subject: [PATCH 4/4] trimer -> finisher --- homo.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/homo.js b/homo.js index d1d85d1..cf9e63b 100644 --- a/homo.js +++ b/homo.js @@ -44,7 +44,7 @@ const homo = ((numsTable) => { return rst.replace("*(1)", "").replace("+(0)", "").replace("^(1)", "") } - const trimer = (expr) => { + const finisher = (expr) => { // 将所有表内值转换为具体记录的表达式并且把^换成** expr = expr.replace(/\d+|⑨/g, (n) => numsTable[n]).replace("^", "**") @@ -68,7 +68,7 @@ const homo = ((numsTable) => { expr = expr.replace(/\+-/g, '-') return expr } - return (num) => trimer(breakNumber(num)) + return (num) => finisher(breakNumber(num)) })({ 229028: "(114514+114514)", 114514: "114514",