本文发布于561天前,最后更新于 561 天前,其中的信息可能已经有所发展或是发生改变。
代码
抽象版本如下

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:






可可爱爱的代码
୧(๑•̀⌄•́๑)૭