duangsuse::Echo
714 subscribers
4.24K photos
127 videos
583 files
6.46K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
duangsuse::Echo
const _1to6 = '1,2,3,4,5,6'.split(','); const isHeading = e => (nm => nm.length > 1 && nm[0] === 'H' && nm[1] in _1to6)(e.tagName); const headingDepth = e => Number.parseInt(e.tagName[1]); // why not regex? const peek = (xs) => xs[xs.length -1]; const topItem2Stk…
就此算了,可见显式栈的解析器只会更加复杂,难以手写,而不会简单半分
此时已经是凌晨两点了,是我的积累不够而已,就是做不到。 #Algorithm
duangsuse::Echo
就此算了,可见显式栈的解析器只会更加复杂,难以手写,而不会简单半分 此时已经是凌晨两点了,是我的积累不够而已,就是做不到。 #Algorithm
之前写的那个是堆出来的,我根本就不知道它是基于什么原理....(虽然的确是我自己写的) 输入数据的内涵结构稍微有点变化就会炸,改一点也可能要炸。

虽然我不打算继续了,现在还是说一下这是怎么工作的吧。

上面的 parseHeadingTree 是一个接受 DOM 节点的 ToC (Table of Contents)解析器,它解析目标节点下的所有 h1-h6 heading,来构造一个 header 树

就像这样:

h1
h1
h2
h3
h2
h5
h5

[h1
[h1 [
[h2 [h3]]
[h2 [h5 h5]]]]

有两种节点
+ 当前层节点 <h1-h6>
+ 子树节点 [<h1-h6> [...]]

它的解析规则很简单
a. 有一个栈用于记录当前嵌套 heading 的层次, 初始化为 [1]
b. 有一个栈用于放置 <h1-h6> 的嵌套解析状态, 初始化为 [ [] ]
+ 每次要添加元素的时候,都加到 peek(resultstk) 里,因为它代表当前层正在架构的数据对象
e.g.
h1 [[h1]]
h1 [[h1 h1]]
h2 [a [h1 [h1 a=[h2]]]]
然后,如果遇到一个 h1 (h1 < h2) 就停止构建 <h2> 的 children,然后把 h1 加到当前层上
h1
[[h1 [h1 a=[h2]] h1]]

这个结论对所有『递归』层都是有效的,也就是说这里的 h2 后面再跟 h3 h4 都是一样的
否则,如果它是最后一个呢?在 for 后面有个 while 就是解决这个问题的,它把所有正在读取还未结束的层给 pop 掉,保证结果单一

+ 如果当前深度增加了,则将上一个标签转换为 stack,加入自己这一层并且进入
  let parent;
leaf().push(parent = topItem2Stk(leaf()));
let subtree = []; parent.push(subtree);
resultstk.push(subtree); 当然它还不够健壮,因为如果第一个就是 <h2> 而不是 h1 的话,topItem 就不存在了... 我写个特殊标签吧
+ 如果当前深度不变,什么都不做
+ 如果当前深度减小了,弹出当前深度、弹出一次结果栈(当前构造)
你也可以理解为给构造动态加 ] 闭括号,就是通过弹出栈的方式
最后,把标签送进当前构造的子树里面去,这就实现了无限深度的铺平构造
可是还有一片小乌云。

比方说

h1
h2
h5
h4

我们一般认为 h5 h4 都是 h2 的元素,可是因为上面规则的幼稚性, h5 是 h2 的元素,h4 却不是(h4.depth < h5.depth)
准确的说,一般递归扫描的时候也是『遇到第一个 depth > currentdept 的时候停下』,可我们的这个 context 是基于显式栈的
我想到的方法是(也是递归的时候栈的一种情况)每次 (h4.depth < h5.depth) 的时候,不断 deduce 栈,直到 (h4.depth >= layer.depth) (找到第一个基层)

h1 [h1
h2 [h1 [h2
h5 [h1 [h2 [h5
h4
a. ]](关闭的是 h2 的栈... 不是 h5 的)
b. {- 找到第一个开括号 [h2 -}
] [h4]]
我也是才知道,其实我之前写的也没解决这个问题.... 看起来倒是进步了
有点小瑕疵(因为脑力不够...) 不过还能用(因为存在 [[...] ...] 和 [a ...] 的区别) 😂 算是完成 不过正式使用还是递归下降法的...
simple
1.9 KB
也是瞎堆的,因为这真是很麻烦... 处理起来 意外很多,本身数据结构设计的就比较 懒惰(laziness)
#JavaScript #web 恭喜 duangsuse 成功获得:『面向排错编程』『面向 REPL 编程』『数学的智障』称号! 以上弱智的代码,居然全是我在 REPL 里试过三次以上才改出来的,我现在心里非常难受
我感觉智商都降低了,虽然它只是使我智商低的事实暴露无遗罢了(
ratioab = db / da
na = ratioab * a, nb = ratioab/b
Forwarded from dnaugsuz
我连除法都不会算了,谁能教教我....
Forwarded from dnaugsuz
日,面向 REPL 编程,真 TMD 好玩
不符合预期就改,然后上 REPL,丝毫不需要冷静分析
成功了万事大吉,失败了属于运气不好

呵呵。
Forwarded from dnaugsuz
有调试器又如何呢,如果写程序不能一遍过,就属于熟练度有问题
程序不能做到 0 冗余,就属于编程思想幼稚
何况有些程序不是碰运气的,要是都能暴力搞出来,要技术干什么
我头疼的是我对本来可以不碰运气的 现在也只能碰运气了... 智商降维打击
Forwarded from dnaugsuz
This media is not supported in your browser
VIEW IN TELEGRAM
Forwarded from dnaugsuz
已经有 N 次了,我都是靠 REPL 在编程,真是可笑啊
Forwarded from dnaugsuz
当然,Yinghai Lu对其做了解释,说我们的确调查过了,老的代码用的内存地址是0x80000000,新的则是用0xa0000000,而0xa0000000不工作。

我这个就是属于『我的确用 REPL 试过了,新的代码加了个 if, 输出数据更加正常一点、老代码少这个东西不工作』
『新逻辑把 < 改成了 <=,工作,老代码抛异常』

我和机器学习算法、SDB 有什么区别,不都是无脑死找吗,沃日
Forwarded from dnaugsuz
比一个月前更差了,虽然一个月前写的东西更简单,可我一碰到数学和数值 operators 就炸... 🤪
起码一个月前的还能算是小 bug 也有思路修,这周的算我整个人出 bug 了
最艰难的部分已经熬过了... 算了吧 🌝
我实在写不出来,还是换成递归下降法的算了 #FP #Algorithm
递归下降法的版本