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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
如果有了 LexicalScopedPattern,很轻松就能创建调用栈了,很轻松就可以实现 Scheme 了,啊…… 直接一步登天实现 Lexical Scoping
This media is not supported in your browser
VIEW IN TELEGRAM
编程有一个重点是能够区分什么是“有名字的量”什么是“存储”,这不止是“能不能重新赋值”的问题。

当你能区分 valvar 并且知道啥可以 inline 啥要怎么变形才能降低 cost 的时候,才算是好的程序员。
#drawing #CG 我们来说实现 Conway's game of life 这个游戏的三个点,都是关于 cell 矩阵的。

这个游戏呢…… 请允许我这个民科再履行本业一次,我不再检查资料了。
无非就是一个 2D 矩阵,自动机。 游戏分“轮”(自动机的 cycle),每个细胞只有 生/死 二态,如果一轮中细胞 上下左右 还有四角 的邻居不超过 k 个,那它就死了,然后这么一次一次更新下去。

或许你想问那既然这样游戏是怎么开始的,当然是用户自己画这些 cell 啊,然后看它们怎么发展变迁。
是个矩阵,当然这个矩阵也是可以无限大小的,现在有最大的 game of life 模拟程序,几乎可以用来做这个 2D 世界里造物的 research 。

这个游戏目前也是有些好玩的组合的(比如说生成“枪”、循环蠕虫这些小“生命”,等等)。开始。

一、如何进行基本的矩阵表示,以及定义其上的操作
我们这里没那么牛逼,矩阵是有大小的(2D矩阵。这里说的是每一维的长度)
n=列数、m=行数

C 的多维数组不熟悉的给个例子:
int a[1][2] = {
{233, 666}
};

嗯。你没看错,不是 (a[1]) [2]a[1][2] 。符合逻辑吗?(当然你是没法做到动态取 length 的,所以许多 C 程序里都有 size_t 的参数,是封装不到位的体现,嘿嘿嘿

说两种表达方式,多维数组和裸一维数组(多维也是可以用一维存储的,基本上就是 a[(i*m)+j] ,其中 i=列号 j=行号 )。
bool map[n][m];
cout << map[1][2];

bool map[m*n];
cout << map[m*1+2];
其实说到底这里我们的需求只有给定 i, j 或者 i ,取它上下左右和四角的元素
int
l = map[i][j-1], r = map[i][j+1],
t = map[i-1][j], d = map[i+1][j];
int
lt = map[i-1][j-1], rt = map[i-1][j+1],
ld = map[i+1][j-1], rd = map[i+1][j+1];
有点冗… 耐心看完吧,就是+1-1什么的(怎么感觉可以动态构造索引…)

int
l = map[i-1], r = map[i+1],
t = map[i-m], d = map[i+m];
int
lt = map[i-m-1], rt = map[i-m+1],
ld = map[i+m-1], rd = map[i+m+1];

二、边角的 cell 在判断下一轮存活时索引越界该怎么办
呃…… 理论上有一种方法(应该说信号处理、求卷积里这个问题也很常见的)
就是分配实际 map[n+2][m+2] 的矩阵,然后只把它 1..n-1, 1..m-1 的部分作为 “世界” 映射绘制/更新,但是计算起来很麻烦,而且选择 1D 保存模拟矩阵做起来更麻烦,所以不说了。

常见的方法是添加越界检测逻辑,你可以提供一个默认值(别吐嘈性能什么的,不相信JVM难道你们还不相信GCC?):
bool m(int i, int j) {
bool
ie = i == (-1) || i == n,
je = j == (-1) || i == m;
if (ie || je) return false;
else return map[i][j];
}
如果按这个实现,没得优化,每次取都要判越界(不排除高性能要求会用更 hack 的矩阵分配方式来解决这个问题)。

三、GUI 操作置活 cell 时每次一定不能只放1个,怎么办
可以加一个 d 参数,每次按照 rectangle(x-r, y-r, d, d) 更新整个矩阵(当然是可以是按列 里每行的区间去更新的 ),但这样其实也没多大意思吧…… (生死都很规律,毕竟是个纯方块)

我不会画圆(QAQ),如果要画的话,大概就得用别人的东西先弄一个再往上 assign 了吧……

如果每次只放一个活细胞,下一轮更新该细胞往往直接挂了,整个程序等于啥都没干。
……拖延症 #life #dev #tech
刚才明明想用 Python/C++ & OpenCV 弄一个这游戏的,现在分析了一下又不感兴趣了
今天早上看到 @iseki_zero 在 QQ 空间转发的一张图(graph),我还想用 HTML/CSS/canvas bezier line 弄个 node editor,再加上 BFS/DFS/Dijkstra 求解支持…… 结果也就是分析了下 dijkstra 的大致选择/回溯流程就完了,啥代码没写。果然要咸鱼了么……

但还是真诚地为昨天因为新冠去世的 John Horton Conway 致敬。 RIP 🕯
Forwarded from Reference Error (Axton Unreachable | 503 Studying)
英国数学家 John Horton Conway 4 月 11 日因 COVID-19 去世。
他于 1970 发明了生命游戏,使得元胞自动机这一概念为更多人所知。相信很多人都自己实现过这一游戏。
#Math 草这个不规范啊,怎么可以用全角括号呢 () [] {}
Forwarded from 〄FW
弄了很久连抄别人 Ruby 的 solver 都做不到… 看来我或许要被卡死了吧…… (咸鱼) 😭

之前想了一个可以用于扒谱的程序:
首先用键盘指定音高, backspace=remove last
Enter=replay

下个流程开始计时弹奏,a=add with duration, s=new tone, backspace=time -5s; filter 出 it >= newTime 的音符全删掉(要 first, last 还是 filter ,还有单调顺序居然都卡了我好久……)

应该可以得到一个音符 (offset+duration+tone) 序列
#YouTube https://duckduckgo.com/?t=ffab&q=youtube-dl+sound+only&ia=qa&iax=qa
直接下载声音可以用 youtube-dl -F 选择格式,然后 -f 下载
ytdl -F 'https://www.youtube.com/watch?v=bH5nSGYGnzU'|sed 's/ \{2,\}/,/g'
ytdl_audio() {
awk -v max=0 '{ if($6>$max){max=$6;id=$1} } END { print $id }'
}
#linux #sysadmin #code 🤔 不行!输出格式太过分

ytdl_f() {
ytdl -F "$1"
echo -n fmt:; read fmt
ytdl -f ${fmt} "$1"
}
Forwarded from Mivik Q
Forwarded from Mivik Q
感觉你这个greedy不太对啊 @duangsuse
Forwarded from dnaugsuz
之前也有说,ParserKt 的目标并不是取代 Regex 或者做 NLP 之类非常复杂的解析器(那几乎不能算单纯的解析器了,何况 Regex groups 对副作用利用比较强,对 PKT 而言用 AlsoDo 和 StatedFeed 可以做到,但不推荐)

ParserKt 的目标是为各种相对规范的编程语言提供模式匹配 read/show (back) 的能力,也提供类似代码高亮这种常见兼容用途

我不会试着让它包容万物,它只需要保持简单的核心就好,包括现在解析一些复杂语法的东西 (NumUnit 和自动 Number 运算的类型转换、Layout 缩排语法的解析)都是作为 parserkt-ext 另作打包的,就是为了尽可能降低学习开销
Forwarded from dnaugsuz
不过,ParserKt 不能用来写命令行解析器,这个非常GG (主要是因为我开始觉得可以写,现在就有点郁闷)
Python 里用 import argparse 非常容易就可以定义一个解析器,我也写过命令行参数辅助解析
一个参数大概就是 add_argument(prefix, metavar, nargs, type, default, action, help) 这几个参数,action 可以 store_true 来实现 flag 什么的(当然前提肯定是动态类型)

ParserKt 理论上可以用来做命令行解析器的核心(如果封一层来构造 Contextual<String, Pattern<String, T>> 的话),但没法直接对应到 Pattern 对象,而且一旦有 nargs="+" 的情况,就十分不好处理为不可变数据了……
Forwarded from dnaugsuz
有几天没写代码了…… 很咸鱼
Forwarded from dnaugsuz
其实这个 while(true) 也可以重写为
while (greedy || count < bounds.last) 的,早就该改改。
已经有 n 个就不必多解析了,比 while(true) 要结构化一些
Forwarded from dnaugsuz
不对,刚刚分析了一下控制流
while (true) {
depend++
if (!p) break;
}
确有别于
while (p) {
depend++
}

区别在于第一次,前者至少执行一遍,相当
do {
depend++
} while (p)
Forwarded from dnaugsuz
这么说 bounds = 0..0 的情况其实我的程序不是最佳实践!没有利用循环操作的兼容性…… 也没有 require 过 param
#Firefoxabout:config 设置 browser.urlbar.decodeURLsOnCopy 为true 可以复制 UTF-8 解码的 URL