本文发布于244天前,最后更新于 244 天前,其中的信息可能已经有所发展或是发生改变。
代码
抽象版本如下
while (styunlen.life.duration > 0) {
styunlen.love.eternal("ZUFE");
}
我为其添加了可运行的版本
/**
* @author Styunlen
* @dedicated to ZUFE for her 50th anniversary
* @edit time 2024.04.11 15:15:20
**/
// 抽象版本
// while (styunlen.life.duration > 0) {
// styunlen.love.eternal("ZUFE");
// }
// 可运行版本
let y = 30,x = -60,scale = [.1, .09, .08, .07, .06, .05, .06, .07, .08, .09, .1],index = 0,range = (size) => [...Array(size)];
let getScale = () => scale[index % scale.length],fn = (x) => ((getScale()**2*(4*y*y+x*x)-1)**3-8*x*x*y**3*getScale()**5 <= 0);
const clear = () => process.stdout.write(process.platform === "win32" ? "\x1bc" : "\x1b[2j\x1b[3j\x1b[h",);
let styunlen = {life: {duration: "浙江财经大学校庆50周年"}},loveindex = 0,scheduler = (await import("timers/promises")).scheduler;
styunlen.love = {eternal: async (sweetheart) => {console.log(((y = 30),index++,range(60).map(() => (y--,(x = -60),range(120).map(() => (fn(x++) ? sweetheart.at(loveindex++ % sweetheart.length) : " ")).join("")),).join("\n\x1b[91m")),);await scheduler.wait(50);clear();},};
while (styunlen.life.duration.length > 0) {
await styunlen.love.eternal("ZUFE ");
}
运行说明,由于使用了JS
的ES Module
写法, 所以要手动将js
文件后缀命名成.mjs
来强制nodejs
以ES Module
形式加载js
,否则会报错。
另一种让nodejs
将.js
文件视为ES Module
的方法是使用package.json
的type
属性,手动将json
文件里的type
属性设置为"module"
就行。
核心代码就是使用js
的Array.prototype.map
和Array.prototype.join
来最小化代码生成爱心字符串,以及数学公式( x²+y²-1)³-x²y³ <= 0
来判断是否在爱心区域内。
上述代码中的getScale
也如字面意思是为了调整x,y的缩放系数,以适应控制台的长宽比(粗暴地使用了x缩放两倍,y缩放一倍,因为系数是小数,所以看起来y乘了2,其实是缩小了一倍 )。
(getScale()**2*(4*y*y+x*x)-1)**3-8*x*x*y**3*getScale()**5 <= 0
以上代码也只是以下代码的因式分解压缩形式,看不懂的可以自己写草稿运算一遍。
((x * getScale()) ** 2 + (y * getScale() * 2) ** 2 - 1) ** 3 -(x * getScale()) ** 2 * (y * getScale() * 2) ** 3
运行效果
windows:
linux: