Forwarded from 螺莉莉的黑板报
https://fuck-castic.github.io/
全国青少年科技创新大赛离谱项目名单。
我非常明确的反对这个项目,孩子没有错,有错的是家长,但是你们却把什么都不懂的孩子拿到台面上批斗,我觉得这是非常不合适的。这已经不是有道德瑕疵了,这种项目本身就是不道德的。
在进行道德审判前请务必想清楚你在反对的是谁、你在做的事情究竟伤害了谁。
0/10
#RORIRI_BENCH
全国青少年科技创新大赛离谱项目名单。
我非常明确的反对这个项目,孩子没有错,有错的是家长,但是你们却把什么都不懂的孩子拿到台面上批斗,我觉得这是非常不合适的。这已经不是有道德瑕疵了,这种项目本身就是不道德的。
在进行道德审判前请务必想清楚你在反对的是谁、你在做的事情究竟伤害了谁。
0/10
#RORIRI_BENCH
#Telegram
var lastMsg = g.history[0]; val isAh={t:String -> t.all{it == "啊"} && t.length > lastMsg.text.length || t.length <= 3 } ; onNewMessage { if (it.user == lastMsg.user || isAh(it.text.replace("AhAhAh","啊")) ) +(it.delete()) else lastMsg=it }Forwarded from 螺莉莉的黑板报
草,暴力 try-catch 查找么 #tools
def trySearch(op, xs):
for x in xs:
try: return op(x)
except Exception: pass
def searchDecode(cs, text):
print("s = s.encode(%o).decode(\"utf8\")")
return text.encode(cs).decode("utf8")
def decode(text): trySearch(lambda cs: tryDecode(cs, text), encoding.charsets)
btn.onclick = ()=>ta.textContent=py["decode"](ta.textContent)
duangsuse::Echo
#Telegram var lastMsg = g.history[0]; val isAh={t:String -> t.all{it == "啊"} && t.length > lastMsg.text.length || t.length <= 3 } ; onNewMessage { if (it.user == lastMsg.user || isAh(it.text.replace("AhAhAh","啊")) ) +(it.delete()) else lastMsg=it }
This media is not supported in your browser
VIEW IN TELEGRAM
duangsuse::Echo
借着这个官方手刃同人的机会,咱来谈一谈 Channel comment board 应该怎么写。 这里不提及回调、消息队列、按钮盘和内联之类的细节,只写成接受必要参数的 fun onXXX() 的形式 与 Telegram 的数据交流与存储责任优先提及: inline keyboard 各钮的文本和 callback ID 由tg保存,回调含 targetMessage bot PM(private message) 含事件 onMessageEdited, onMessageDeleted 单单…
现在脑子里完全是一团乱麻,我之前从没写过基于 Annotation Processor 的 codegen ,完全不知道怎么区别生成结构和复用结构更好
固然我是知道查询字段只要提供文本常量 ,但我不清楚倒底在哪区分不同底层(MutableMap/Mongo/SQLite) 的支持性,以及要弄个 channel 评论的 bot 而需要三个关系是不是认真的,毕竟靠 Grouping<BroadcastId, MsgId> 就可以反向查找到评论板和 getList ,那么利用关系型模型的价值到底在哪,是否要为这种情况支持原生后端
甚至,有没有必要对这玩意支持 JSON 序列化,从而用 tg 的 message 存储这类数据,如果要实现那那么多生命周期、细节我该怎么办?😱
不愧是最怕实际工程的 duangsuse ,希望以后有了 LiterateKt 的帮助我能多开点坑吧。
固然我是知道查询字段只要提供文本常量 ,但我不清楚倒底在哪区分不同底层(MutableMap/Mongo/SQLite) 的支持性,以及要弄个 channel 评论的 bot 而需要三个关系是不是认真的,毕竟靠 Grouping<BroadcastId, MsgId> 就可以反向查找到评论板和 getList ,那么利用关系型模型的价值到底在哪,是否要为这种情况支持原生后端
甚至,有没有必要对这玩意支持 JSON 序列化,从而用 tg 的 message 存储这类数据,如果要实现那那么多生命周期、细节我该怎么办?😱
不愧是最怕实际工程的 duangsuse ,希望以后有了 LiterateKt 的帮助我能多开点坑吧。
duangsuse::Echo
这两天我想实现最近设计的逆向计算表达式生成(就是把 +* 变 /- 的这种逆序+反向,只是未知只能有一个,具体要实现一个 findPaths { it !in globals } 细节不多说) 顺便也进一步理解了 ParserKt 最常用的结构们: Stmts (Stmt ';'|newline) -- elementIn Stmt ('L' Expr '=' Expr) | Expr -- OpChain.disambiguate, Seq(a,b,c) Expr opChain(Atom, "+- *\")…
我去看了下 Mivik 酱之前发的 kamet 编译原理实践博文,注意到他建模的 DFA 大概是
也就是每一点都类似 when(state) 0 -> 里
我的方案有点区别,是铺平的
这种方法也能表示 DFA (好比把 when 转为嵌套 if ,一个节约时间一个节约内存),总体上我还是选择了把 when 转成多层 if elif,因为受不了那么多 MutableList (有点 Lua 的气质了…… 不敢用数组只会链表)
这个要反编译回 DFA 的话就要合并测试链了,如
("a", action(0), 1)
("b", action(1), -1)
就要变成 mapOf("a" to 0, "b" to 1) 这种,读取法是
这个方法只能串联起 action (p<0) 的部分,唉反编译算法递归起来就是麻烦... 还好我不打算写
他也提供了一个方法手动建立 DFA ,当然也可以由 NFA 子集合并法优化而来,之后 Parser.kt 的写法是 LR(1) 也即递归下降法(left-right recursive descent, 不过这个缩写好像有 left recursive 的意思)
ParserKt 对此类算法的需求仅仅是 lexer 跳空格层面而已,所以没有严肃到独立实现一个 regex 匹配
谈到解析器框架的设计,函数式那边都是 StringView: get/length/drop(n) 和 Regex/Substring match 整个输入 String 作 lexer (因为 re 不支持字符流匹配) 的货色, ParserKt 算是两边的混血,拒绝函数式的啃本和工程派的复制粘贴
如今终于完美解决跳空格问题了,还是同时依仗了函数式的简洁和状态机的非阻塞,当然也离不开对部件重要性的正确评估(拒绝跑题),只有多范式互补才是 Kotlin 的正统啊!
Array<List<Pair<CharRange,Int>>>也就是每一点都类似 when(state) 0 -> 里
when(c) { in 'a'..'z'' -> state=1 } 这样我的方案有点区别,是铺平的
Array<Triple<String,Int,Int>> (实际上肯定是 ArrayList ,因为动态测量状态数必须 a. 将函数直接构造 StateMover 变为构造中间结构,带来回收开销 b. 调用函数两遍,一遍只返回状态数来求和,类型上不优雅且做了无用功,结合其惯用法总体看不值得,就像 C string 的 strlen+strcat 也很弱智)这种方法也能表示 DFA (好比把 when 转为嵌套 if ,一个节约时间一个节约内存),总体上我还是选择了把 when 转成多层 if elif,因为受不了那么多 MutableList (有点 Lua 的气质了…… 不敢用数组只会链表)
这个要反编译回 DFA 的话就要合并测试链了,如
("a", action(0), 1)
("b", action(1), -1)
就要变成 mapOf("a" to 0, "b" to 1) 这种,读取法是
readMap m (t, -p, n) { m[t] = p; readMap m cs[n] }
这个方法只能串联起 action (p<0) 的部分,唉反编译算法递归起来就是麻烦... 还好我不打算写
他也提供了一个方法手动建立 DFA ,当然也可以由 NFA 子集合并法优化而来,之后 Parser.kt 的写法是 LR(1) 也即递归下降法(left-right recursive descent, 不过这个缩写好像有 left recursive 的意思)
ParserKt 对此类算法的需求仅仅是 lexer 跳空格层面而已,所以没有严肃到独立实现一个 regex 匹配
谈到解析器框架的设计,函数式那边都是 StringView: get/length/drop(n) 和 Regex/Substring match 整个输入 String 作 lexer (因为 re 不支持字符流匹配) 的货色, ParserKt 算是两边的混血,拒绝函数式的啃本和工程派的复制粘贴
如今终于完美解决跳空格问题了,还是同时依仗了函数式的简洁和状态机的非阻塞,当然也离不开对部件重要性的正确评估(拒绝跑题),只有多范式互补才是 Kotlin 的正统啊!
GitHub
ice1k/Ruiko.kt
Kotlin version of Ruiko.fs. Contribute to ice1k/Ruiko.kt development by creating an account on GitHub.