编程有一个重点是能够区分什么是“有名字的量”什么是“存储”,这不止是“能不能重新赋值”的问题。
当你能区分
当你能区分
val 和 var 并且知道啥可以 inline 啥要怎么变形才能降低 cost 的时候,才算是好的程序员。#drawing #CG 我们来说实现 Conway's game of life 这个游戏的三个点,都是关于 cell 矩阵的。
这个游戏呢…… 请允许我这个民科再履行本业一次,我不再检查资料了。
无非就是一个 2D 矩阵,自动机。 游戏分“轮”(自动机的 cycle),每个细胞只有 生/死 二态,如果一轮中细胞 上下左右 还有四角 的邻居不超过 k 个,那它就死了,然后这么一次一次更新下去。
或许你想问那既然这样游戏是怎么开始的,当然是用户自己画这些 cell 啊,然后看它们怎么发展变迁。
是个矩阵,当然这个矩阵也是可以无限大小的,现在有最大的 game of life 模拟程序,几乎可以用来做这个 2D 世界里造物的 research 。
这个游戏目前也是有些好玩的组合的(比如说生成“枪”、循环蠕虫这些小“生命”,等等)。开始。
一、如何进行基本的矩阵表示,以及定义其上的操作
我们这里没那么牛逼,矩阵是有大小的(2D矩阵。这里说的是每一维的长度)
n=列数、m=行数
C 的多维数组不熟悉的给个例子:
吧吗?(当然你是没法做到动态取
说两种表达方式,多维数组和裸一维数组(多维也是可以用一维存储的,基本上就是
呃…… 理论上有一种方法(应该说信号处理、求卷积里这个问题也很常见的)
就是分配实际
常见的方法是添加越界检测逻辑,你可以提供一个默认值(别吐嘈性能什么的,不相信JVM难道你们还不相信GCC?):
三、GUI 操作置活 cell 时每次一定不能只放1个,怎么办
可以加一个
我不会画圆(QAQ),如果要画的话,大概就得用别人的东西先弄一个再往上 assign 了吧……
如果每次只放一个活细胞,下一轮更新该细胞往往直接挂了,整个程序等于啥都没干。
这个游戏呢…… 请允许我这个民科再履行本业一次,我不再检查资料了。
无非就是一个 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有点冗… 耐心看完吧,就是+1-1什么的(怎么感觉可以动态构造索引…)
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];
int二、边角的 cell 在判断下一轮存活时索引越界该怎么办
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];
呃…… 理论上有一种方法(应该说信号处理、求卷积里这个问题也很常见的)
就是分配实际
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 🕯。
刚才明明想用 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 发明了生命游戏,使得元胞自动机这一概念为更多人所知。相信很多人都自己实现过这一游戏。
他于 1970 发明了生命游戏,使得元胞自动机这一概念为更多人所知。相信很多人都自己实现过这一游戏。
弄了很久连抄别人 Ruby 的 solver 都做不到… 看来我或许要被卡死了吧…… (咸鱼) 😭
之前想了一个可以用于扒谱的程序:
首先用键盘指定音高, backspace=remove last
Enter=replay
下个流程开始计时弹奏,a=add with duration, s=new tone, backspace=time -5s; filter 出
应该可以得到一个音符 (offset+duration+tone) 序列
之前想了一个可以用于扒谱的程序:
首先用键盘指定音高, 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 下载Forwarded from dnaugsuz
🤔 greedy 的意思就是“尽可能多地匹配”,和 lambda lifting 里那个 "lifting" 一样,一词多用。
这个… 我没有引用 regex 里的那个名词,它是另一个名词。
这个… 我没有引用 regex 里的那个名词,它是另一个名词。
Telegram
duangsuse::Echo
#PLT #Python #parsing 快看
http://news.sciencenet.cn/htmlnews/2020/1/434911.shtm
Lark - a modern parsing library for Python
PLY (Python Lex-Yacc)
https://en.wikipedia.org/wiki/Lambda_lifting
一句话总结:把不支持 (相对的)local function 化为 global function,可能需要把 free var…
http://news.sciencenet.cn/htmlnews/2020/1/434911.shtm
Lark - a modern parsing library for Python
PLY (Python Lex-Yacc)
https://en.wikipedia.org/wiki/Lambda_lifting
一句话总结:把不支持 (相对的)local function 化为 global function,可能需要把 free var…
Forwarded from dnaugsuz
之前也有说,ParserKt 的目标并不是取代 Regex 或者做 NLP 之类非常复杂的解析器(那几乎不能算单纯的解析器了,何况 Regex groups 对副作用利用比较强,对 PKT 而言用 AlsoDo 和 StatedFeed 可以做到,但不推荐)
ParserKt 的目标是为各种相对规范的编程语言提供模式匹配 read/show (back) 的能力,也提供类似代码高亮这种常见兼容用途
我不会试着让它包容万物,它只需要保持简单的核心就好,包括现在解析一些复杂语法的东西 (NumUnit 和自动 Number 运算的类型转换、Layout 缩排语法的解析)都是作为 parserkt-ext 另作打包的,就是为了尽可能降低学习开销
ParserKt 的目标是为各种相对规范的编程语言提供模式匹配 read/show (back) 的能力,也提供类似代码高亮这种常见兼容用途
我不会试着让它包容万物,它只需要保持简单的核心就好,包括现在解析一些复杂语法的东西 (NumUnit 和自动 Number 运算的类型转换、Layout 缩排语法的解析)都是作为 parserkt-ext 另作打包的,就是为了尽可能降低学习开销
Forwarded from dnaugsuz
不过,ParserKt 不能用来写命令行解析器,这个非常GG (主要是因为我开始觉得可以写,现在就有点郁闷)
Python 里用
一个参数大概就是
ParserKt 理论上可以用来做命令行解析器的核心(如果封一层来构造
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
其实这个
已经有 n 个就不必多解析了,比
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