duangsues.is_a? SaltedFish
60 subscribers
609 photos
6 videos
91 files
562 links
🌶🐔🐟 duangsuse 的日常
尤其喜欢发些奇奇怪怪的东西
和转载别人的东西
Download Telegram
Forwarded from dnaugsuz
#bing

#48 在GL里直接用Vec2极座标? 原来是np.rot+90(T矩阵).. 这不叫数学吧
matrix[:] = zip(*matrix[::-1])
#
a.reverse()
for i in range(len(a)): #行列调换,j是对角线
for j in range(i):a[i][j], a[j][i] = a[j][i], a[i][j]

#54 定义式解法
[[0 1 2]
[7 8 3]
[6 5 4]]
#range(0,9) => spiral(cols=3)
def unrot(a, out):
while a.size: out.extend(a[0]); a=np.rot90(a[1:])

def rot(a, m):
ia=np.reshape(range(len(a)), (m,-1))
unrot(ia, ord:=[])
return np.vectorize(lambda i:a[ord.index(i)] )(ia)


a=rot([*range(0,9)], 3)
unrot(a, na:=[])
[a,na]

>请把它从np.array 移植到 [[]] 类型

def unrot(a, out):
while a:
out.extend(a[0]); a=list(zip(*a[1:]))[::-1] #T矩阵=逐列逆序

def rot(a, m):
ia=[list(range(i*m, (i+1)*m)) for i in range(m)]
unrot(ia, ord:=[]) #格子ID的序号
return [[a[ord.index(i)] for i in row] for row in ia]


#73
- Nd<Int> setZeros
at shape==[n m]
at now Bool: i0 j0 // 清零首行(记号行)

(0~<n):[i] (0~<m):[j] if this[i,j]==0:
i0=i0 or i==0; j0=j0 or j==0
this[i,0]=0
this[0,j]=0 //稍后清零此行列

(1~<n):[i] (1~<m):[j]
if this[i,0]==0 or this[0,j]==0: this[i,j]=0

if j0:(0~<n):[i] this[i,0]=0
if i0:(0~<m):[j] this[0,j]=0

#240 从下到右能找到最大值,所以自右上
- Nd bsearch(it:N) Bool
if size==0: return $N
at shape==[n m]
at now:
i 0; j m-1 //TR corner
loop if i<n & j!<0:
when this[i,j].sorts(it):
Eq:return $Y
MaxAt0: j goesL
MinAt0: i goesR //go down
return $N
Forwarded from dnaugsuz
感觉都是很 practical 的算法,所以用自己的思路来做会很..

48矩阵转置这种也太.. 反正螺旋矩阵用模拟法真的很蠢,就是大while(n*m步) {朝右下左上走; 跳到 (1,1), 边界-(1,1) ,...}
定义式10行除了遍历,连生成都写完了(btw. rot 应该把spiralFn作为参数,毕竟有其他方法也算"迷宫排序")

(原来真有人mat.T都模拟 , i=j行列对调+reverse的事)
写2048时也用过模拟法,不过我是把 2048 的扫描合并对接到遍历, 然后用矩阵+四向实现它(还不如直接旋转矩阵)想必用螺旋模拟贪吃蛇也很好玩吧(网格碰撞

240和之前”螺旋“数组(拆二,找有序半)深遍历 很像,完全分治比预处理好

这种 old-school 的算法,如果没能列出易读的公式,感觉即便AC了也是收获不大..
我更喜欢#73 这种,虽然莫名觉得有更简洁的写法
Forwarded from dnaugsuz
#code AIDL 服务-客户 示例,包含 int n 的监听、 List<Str> users() 的回调

// src/main/aidl/ISvc.aidl
package my.svc;
import my.svc.ISvcCB;

interface ISvc {
void setListener(in ISvcCB callback);//int n 变化时通知客户端
//没有找到针对 Kotlin 的 AIDL 框架,但创建.aidl时, xml清单会自动更新
int getN();void setN(int n);
void getUsers(in ISvcCB callback);// 回调得 List<Str>
}

// 另起一文
package my.svc;
import java.util.List;

interface ISvcCB {
void onNChanged(int n);
void onGetUsers(List<Str> users);
}

// src/main/kotlin/ISvc.kt
class ISvc: Service() {
var n=0
onBind(intent)=binder
val binder=object: ISvc.Stub() {
getN()=n //set,users 要调回调,以此类推
}
}

// MyActivity.java

class MyActivity : RpcActivity() {
onCreate()=makeRpc<ISvc>()
inline fun <reified T> makeRpc() {//连接(intent,conn)
val conn=object : ServiceConnection {
override fun onServiceConnected(name: ComponentName?, binder: IBinder?)
{rpc = T.Stub.asInterface(binder)}
override fun onServiceDisconnected(name: ComponentName?) {rpc=null}
}
bindService(Intent.at(T::class.java), conn, BIND_AUTO_CREATE)
close={unbindService(conn)}
}
onDestroy()=_close()
var close:()->Unit
}
fun Intent.Companion.at(T:Class<*>) = Intent().apply {
component = ComponentName(T.`package`.name, T.name)
}
duangsues.is_a? SaltedFish
#py def match_parentheses(s): # 创建一个栈来存储左括号 stack = [] # 创建一个字典来存储左右括号的对应关系 pairs = {"(": ")", "[": "]", "{": "}"} # 遍历字符串中的每个字符 for c in s: # 如果是左括号,就把它压入栈中 if c in pairs: stack.append(c) # 如果是右括号,就检查栈是否为空,以及栈顶的左括号是否与它匹配 …
#sql #code LC#200
:- use_rendering(table).
pixel([
[0, 0, 1],
[1, 1, 1],
[0, 0, 0]]).

% 像素[xy]
v(P, C) :- P = [X,Y],
pixel(M),
nth0(Y, M, R),nth0(X, R, C).

% 相邻颜色
conn(P0,P1) :- P0 = [X0,Y0],P1 = [X1,Y1],
v(P0,C),v(P1,C),
abs(X0 - X1) + abs(Y0 - Y1) =:= 1.

% 追溯联通
dfs(A,B,V) :- A=B; conn(A,C), not(member(C,V)), dfs(C,B,[C|V]).

% 列出
fill(P, S) :- setof(X, dfs(P,X, []), S).

/** <examples>
?- fill([2,1], R).
?- distinct([X], (fill(_,X))).
?- v(P, 0), P=[X, 0].
?- conn([2,1], P1).
*/


#py
import numpy as np

def islands(a):
LRUD = np.array([[0, -1], [0, 1], [-1, 0], [1, 0]])
m, n = a.shape
all=set()
f=dfs((isl:=[]).append, lambda P:(tuple(x) for x in P+LRUD if (lambda x,y :\
(0<=y<n)and(0<=x<m) and a[x,y]== 1)(*x)) )

for P,c in np.ndenumerate(a):
f(P); vis.clear(); all.add(tuple(sorted(isl))); isl.clear()
return all
vis=set()
def dfs(fvis,Links):
def at(P0):
for P in Links(P0):
if P not in vis: fvis(P);vis.add(P); at(P)
return at

# 创建一个 'L' 型九宫格的示例
_L = np.array([
[1,0,0],
[1,0,0],
[1,1,0],
])

islands(_L)



LC#994 则是用BFS,浅先,并记录布数; 从所有烂橘子开始,直到走不动或橘子全烂
#plt #code 本来 mul([1,*,2],[], R) 正确算为 乘(1,2)
验算也OK,但反运算不行!

关系式无法调试print,我内联参数勉强查出了“把 R= 往前挪,就能正确推导”

AI直接傻了,说了一些奇怪的话:

“ 这时 mul(S,[], 乘(1, 2)) 能用,但规则的含义变了。你原来说 S 是一个乘法表达式,现在的 mul 里 S 和 R 都是乘法表达式 (废话!)

这样允许了一些不合理的情况,例如 mul([1,*,2],[], 3) 也可以成功(??),因为 R = 3 可以无视S匹配 R =.. [乘,E1,E2] ,这样会破坏你的逻辑。你应该定义 mul(S,[],R)

:- use_module(library(dcg/basics)).
:- set_prolog_flag(double_quotes, chars).

e(E) -->{E = [I,Ea,Eb]},
e1(Ea), op(I,"+-"), e(Eb); e1(E).
e1(E) -->{E = [I,Ea,Eb]},
e2(Ea), op(I," */"), e1(Eb); e2(E).

e2(X) --> number(X); ("(", e(X), ")"), !.
op(I,W) --> [C], { nth0(I0,W,C),nth0(I0,"加减乘除",I) }.

%原理: 吃前缀,吃内项,吐返回
parse(S,E) :- add(S,[],E), !.
kw(W,S,SR) :- S = [W|SR].
num(S,SR,R) :-
S = [R|SR], integer(R); phrase(number(R), S,SR).

add(S,SR,R) :- R =.. [加,E1,E2],
mul(S,S1,E1),kw('+',S1,S2),add(S2,SR,E2); mul(S,SR,R). %chainl. 这些S只是“流后缀”

mul(S,SR,R) :-
R =.. [乘,E1,E2], %FUCK, 想反算R必须在前,num必须在后?
num(S,S1,E1), kw('*',S1,S2), num(S2,SR,E2); num(S,SR,R).

%split_string \d+
% cutD("123acbc12", [123, a, c, b, c,1,2]) 失败了
cutD(S, L) :-
phrase(number(N), S,SR), cutD(SR,L0),L=[N|L0], !; S=L, !;
phrase(string(X), S,SR), cutD(SR,L0),L=[X|L0].
Forwarded from Deleted Account
在 Rust 中,你可以结合 HTML-style UI 框架和 imgui 绑定来实现 label("你好") 的效果。下面是一个简单的例子,使用 web-viewimgui-rs 来实现:

首先,在 Cargo.toml 文件中添加相关依赖:

[dependencies]
web-view = "0.7.0"
imgui = "0.4.0"
imgui-winit-support = "0.6.0"


接下来,创建一个名为 main.rs 的文件,并将以下代码添加到文件中:

use web_view::*;
use imgui::*;
use imgui_winit_support::WinitPlatform;

fn main() {
// 创建 web view,指定 HTML 内容和窗口大小
let webview = web_view::builder()
.title("Hello Label Example")
.content(Content::Html(include_str!("index.html")))
.size(800, 600)
.resizable(true)
.debug(true)
.user_data(())
.invoke_handler(|_webview, _arg| {
Ok(())
})
.build()
.unwrap();

// 创建 imgui 上下文
let mut imgui = imgui::Context::create();
imgui.set_ini_filename(None);

// 创建 imgui-winit-support 并初始化
let mut platform = WinitPlatform::init(&mut imgui);
platform.attach_window(
imgui.io_mut(),
platform
.create_window(
imgui.io_mut(),
Default::default(),
imgui_winit_support::HiDpiMode::Default,
)
.0,
imgui_winit_support::HiDpiMode::Default,
);

// 主循环
while webview.step().unwrap() {
let ui = imgui.frame();

// 在 imgui 中创建一个 Label 控件
ui.text("你好");

// imgui 渲染
let mut platform_state = platform.prepare_frame(imgui.io_mut(), &webview.window());
platform_state.prepare_render(&ui, &webview.window());
webview.eval(&platform_state.render()).unwrap();
}
}


接下来,创建一个名为 index.html 的文件,并将以下代码添加到文件中:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello Label Example</title>
</head>
<body>
</body>
</html>


最后,使用 cargo run 命令来运行程序。

这个示例会创建一个带有 "你好" 标签的 HTML-style UI 窗口。你可以根据需要进一步扩展和定制该示例。

请确保 Cargo.toml 中的依赖项与代码示例中提供的版本号匹配,以确保能够成功构建和运行该程序。同时,你可能还需要根据自己的操作系统和开发环境进行必要的配置和调整。

希望这能帮助到你!如果有任何进一步的问题,请随时提问。🙂
Forwarded from Deleted Account
在 Rust 中,最流行的 HTML-style UI 框架是 yewyew 是一个基于 Rust 和 WebAssembly 的现代前端框架,它提供了类似于 HTML 的声明式组件和状态管理。

以下是使用 yew 框架来实现 label("你好") 的示例代码:

首先,确保在你的 Cargo.toml 文件中添加 yew 的依赖:

[dependencies]
yew = "0.22.1"


然后,在项目中创建一个新的 Rust 文件(例如 main.rs),并将以下代码添加到文件中:

use yew::prelude::*;

struct Model;

impl Component for Model {
type Message = ();
type Properties = ();

fn create(_: Self::Properties, _: ComponentLink<Self>) -> Self {
Model
}

fn update(&mut self, _: Self::Message) -> ShouldRender {
false
}

fn view(&self) -> Html {
html! {
<p>{ "你好" }</p>
}
}
}

fn main() {
yew::start_app::<Model>();
}


最后,可以使用 cargo build 构建项目,并使用 cargo run 运行该应用程序。然后,在浏览器中访问生成的 WebAssembly 页面,你将看到一个包含 "你好" 文字的段落。

请确保 Cargo.toml 中的依赖项与代码示例中提供的版本号相匹配,以确保成功构建和运行该程序。

这只是一个基本示例,你可以根据需要使用 yew 框架创建更复杂的 UI 组件和交互逻辑。除了 yew,还有其他一些流行的 HTML-style UI 框架可供选择,如 seedpercy,你可以根据个人偏好选择适合你的框架。

希望这能帮助到你!如果有任何进一步的问题,请随时提问。🙂
Forwarded from Deleted Account
当然,请参考以下链接获取有关 Rust 中流行的 UI 框架的更多信息:

1. Yew - Yew 是一个现代化的 Rust 框架,用于构建基于 WebAssembly 的前端应用程序。它采用类似于 React 的组件模型和虚拟 DOM,提供强大的状态管理和事件处理功能。Yew 的官方网站提供详细的文档、示例和指南。
2. Iced - Iced 是一个简单高效的跨平台 GUI 库,专注于构建桌面应用程序。它提供易于使用的 API 和功能强大的 UI 组件,使用函数式反应式编程风格。在项目的 GitHub 页面上,你可以找到示例代码、文档和社区支持。
3. Druid - Druid 是一个跨平台的 Rust UI 工具包,它专注于提供高性能和现代化的用户界面开发体验。Druid 基于直接渲染技术,支持声明式 UI 构建和强大的事件处理功能。官方网站提供了 API 文档、教程和示例代码供参考。
4. Conrod - Conrod 是一个创造性的 Rust 编码库,用于构建用户界面。它提供丰富的 UI 控件和布局工具,使你能够创建高度定制化的用户界面。在项目的 GitHub 页面上,你可以找到示例代码、教程和社区讨论。
5. Cursive - Cursive 是一个 Rust 的终端用户界面库(TUI),用于在命令行环境中构建交互式应用程序。它提供丰富而易用的终端 UI 组件和布局工具,帮助你创建强大的终端应用程序。在 GitHub 仓库中,你可以找到示例代码、文档和社区支持。

以上链接提供了各个框架的官方网站或 GitHub 页面,你可以通过这些链接更详细地了解每个框架的描述、文档、示例和社区支持。

希望这些链接能够满足你的需求!如有任何其他问题,请随时提问。😊
#math #algorithm #code
x + y = 35, 2x + 4y = 94
用高斯消元法,先将第一个方程乘以 -2,然后加到第二个方程上,得到:
 -2x - 2y = -70, y = 12
x + 12 = 35
所以,鸡有 23 只,兔子有 12 只。

# 对 x + y = 35, 2x + 4y = 94 的系数组,进行高斯消元
def elim(arg):
n,m = arg.shape
for j in range(n):
# 找到第 j 列最强元素的行
i= max(range(j, n), key=lambda i: abs(arg[i, j]))
assert arg[i, j] != 0, '矩阵是奇异的'
# 本列成为最强
if i != j: arg[[i,j]] = arg[[j,i]]
# 归一本行(除以 j 行的元素)
arg[j] /= arg[j, j]
# 将其他行的第 j 列的元素消为 0
for i in range(n):
if i != j: arg[i] -= arg[i, j] * arg[j]
# 成功消元
return arg


#kt
// 定义一个函数,用于对二维数组进行高斯消元
fun gaussElimination(matrix: Array<Array<Double>>): Array<Array<Double>> {
val n = matrix.size // 矩阵的行数
val m = matrix[0].size // 矩阵的列数
// 遍历每一行
for (i in 0 until n) {
// 找到第 i 列中绝对值最大的元素所在的行
var maxRow = i
var maxVal = matrix[i][i]
for (j in i + 1 until n) {
if (abs(matrix[j][i]) > abs(maxVal)) {
maxRow = j
maxVal = matrix[j][i]
}
}
// 如果最大值为零,说明矩阵是奇异的,无法消元,抛出异常
if (maxVal == 0.0) {
throw Exception("Singular matrix")
}
// 如果最大值不在第 i 行,交换两行的位置
if (maxRow != i) {
val temp = matrix[i]
matrix[i] = matrix[maxRow]
matrix[maxRow] = temp
}
// 将第 i 行除以第 i 列的元素,使其变为 1
val pivot = matrix[i][i]
for (k in i until m) {
matrix[i][k] /= pivot
}
// 将其他行的第 i 列的元素消为 0
for (j in 0 until n) {
if (j != i) {
val factor = matrix[j][i]
for (k in i until m) {
matrix[j][k] -= factor * matrix[i][k]
}
}
}
}
// 返回消元后的矩阵
return matrix
}

// 定义一个函数,用于打印二维数组
fun printMatrix(matrix: Array<Array<Double>>) {
for (row in matrix) {
println(row.joinToString(" "))
}
}

// 定义一个测试用例,鸡兔同笼问题的系数矩阵
val testMatrix = arrayOf(
arrayOf(1.0, 1.0, 35.0),
arrayOf(2.0, 4.0, 94.0)
)

// 调用高斯消元函数,并打印结果
val resultMatrix = gaussElimination(testMatrix)
printMatrix(resultMatrix)
我真的不想吐槽数学和某些程序员的 xywh ijnm 定义了。我眼里 nm=hw, ij=yx ,是和书写、访问顺序对应的,但是资料说 x行y格, j行j格
随地for ijkhl 的面条代码,把我整困惑了,数学家是否连Excel、物理行向量的模型都没统一好?

而且看到很多版本的,有用点乘支持b(常数)矩阵,但变量名完全不一样

def elim(arg):
n,m = arg.shape; assert n<=m, "没有唯一解"
for j in range(n):
# 找到j格最强元素的行(非0),换为本行
i= max(range(j, n), key=lambda i: abs(arg[i, j]))
assert arg[i, j] != 0, "矩阵是奇异的"
if i != j: arg[[i,j]] = arg[[j,i]]

arg[j] /= arg[j, j] # 在j=i的阶梯点。归一,再将其他行的j格消为 0
for i in range(n):
if i != j: arg[i] -= arg[i, j] * arg[j]
# 成功消元
return arg

—最终 #bing 给出了 minimal impl:

# 对系数组A,进行高斯消元求 Ax '=b'
def elim(A, b):
M = np.hstack((A, b.reshape(-1, 1))) # M=(A|常数项b)
n, m = A.shape; assert n==m, "没有唯一解"

# 向下找j格最强的行,换为本行
for j in range(n):
i=np.argmax(abs(M[j:, j]))+j; assert M[i,j]!=0, "主元为零"
if i!=j: #; ij=(行ji)
M[[i,j]] = M[[j,i]]
# j归一,将下行的j格消为 0
M[j] /= M[j, j]
for i in range(j + 1, n):
M[i] -= M[i,j]* M[j]
#M[i] -= M[j]* (M[i,j] / M[j,j])
# 重新代入
x = np.zeros(n)
for i in reversed(range(n)):
# 比率= 解/当前元
x[i] = M[i, n] / M[i, i]
# 以上的解-=比率*以上元
M[:i, -1] -= x[i] * M[:i, i]
return x

#x + y = 35, 2x + 4y = 94
print("xy的解为:", elim(
np.array([[1.]*2, [2.,4]]), np.array([35,94]) ))



和np.lp 接口兼容
from sympy import *
import numpy as np
import numpy.linalg as lp

x, y = symbols('x, y')
eq = [
x + y - 35,
2*x + 4*y - 94]

A,b=(np.array(s,dtype=np.float32) for s in\
linear_eq_to_matrix(eq, (x, y)))

x,i=sp.Matrix(np.hstack([A,b])).rref() #解构 M[:,:-1], M[:,-1]
print([*zip([*"鸡 兔".split()], x.col(-1))])

'增广矩阵',m, '配平A·x=b',lp.solve(A,b)
Forwarded from Deleted Account
以下是使用 Python 解释高斯消元(Gaussian elimination)算法的示例代码:

import numpy as np

def gaussian_elimination(A, b):
n = len(A)
Ab = np.concatenate((A, b.reshape(n, 1)), axis=1) # 增广矩阵

# 前向消元
for i in range(n-1):
pivot_idx = np.argmax(np.abs(Ab[i:, i])) + i # 部分主元选取
Ab[[i, pivot_idx]] = Ab[[pivot_idx, i]] # 交换行
pivot = Ab[i, i]
if pivot == 0:
continue
Ab[i] /= pivot # 主元归一化
for j in range(i+1, n):
Ab[j] -= Ab[j, i] * Ab[i]

# 回代求解
x = np.zeros(n)
for i in range(n-1, -1, -1):
x[i] = Ab[i, -1]
for j in range(i+1, n):
x[i] -= Ab[i, j] * x[j]

return x

# 示例用法
A = np.array([[2, 1, 3], [4, 4, -2], [1, 3, 1]])
b = np.array([7, 10, 3])

x = gaussian_elimination(A, b)
print("Solution:", x)


这段代码中,gaussian_elimination 函数实现了高斯消元算法。它接受一个系数矩阵 A 和一个常数向量 b,并返回求解出的未知数向量 x

在示例用法中,我们定义了一个线性方程组的系数矩阵 A 和常数向量 b,然后调用 gaussian_elimination 函数求解线性方程组的解,并打印出结果。

希望以上示例对你有所帮助!如果你有任何其他问题,请随时提问。😊
#learn #algorithm
basenc(K, radix="ABC..+/") 的每字符吃掉 b:bytes 里 nc=log2(K)位
nc=4,5,6 的膨胀率(B/A)是 2/1, 8/5, 4/3. 对于z85(nc非整数) pad=禁用

- reGrp(A, join,enc, zpad)(b) 对b+zpad 分组转码,最后去掉nPad 补上'='
- reBit(8,nc, b,K-1) 把8bit 转为nc bit 的流. (nc,8, b,0xFF)反之
- enc 转码 radix[流], "SGVs"->流

nPad(n待补)=b32? (解码? n*5/8+1 : n*8/5>>0) : n
zpad=radix[-1] ,z85 使用 s=radix[a%K]+s,a/=K 而非 a>>nc 拆字节

a85 自动处理 '<~~>', 4字块 z=0, y=0x20202020
b32 的临时整数会超过32bit
Forwarded from dnaugsuz
没错, import functools 提到了这点,不过递归是自顶向下的, 但动规是自底向上计算 (算法的范式), 所以难写一些

其实也就是是否要 int a=(基线)0; 往后 for(i-->0) a=b,b=c,c=a+b 的区别了,循环当然比尾递归改参数烧脑

fib=lambda n: n if n<2 else fib(n-1) + fib(n-2)

def fibDP(n):
f = [0, 1] # 初始化数组
for i in range(2, n+1): # 从小到大计算
f.append(f[i-1] + f[i-2]) # 状态转移方程
#n=10, f=[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
return f[n] # 返回结果

%timeit fib(10) #10.4 µs
%timeit fibDP(10) #860 ns, 快一万倍
#bing #ce Eclipse JDT(Java Development Tools)是 Eclipse IDE 的核心组件之一,https://www.eclipse.org/jdt/core/

ANTLR.org (Another Tool for Language Recognition)是一个强大的解析器生成器,

我了解增量解析器(incremental parser)的概念。增量解析器是一种解析器,它可以在代码发生改变时进行局部的、部分更新的解析操作,而不需要对整个代码进行重新解析。

传统的解析器通常需要对整个代码进行扫描和解析,以构建语法树或执行其他相关的分析操作。但在大型项目或实时应用中,当代码发生变化时,重新解析整个代码可能是低效且耗时的。

通过识别和处理影响到修改位置附近的代码部分,仅对受到影响的部分进行增量更新,来快速地更新整体解析结果,以反映代码的新状态:

1. 差量更新(delta-based updates):仅对被修改的语法结构及其相关的子结构进行解析更新,而不需要重新解析整个代码。

2. 增量语法分析(incremental parsing):利用先前解析的语法树、符号表或其他相关的分析结果,通过部分解析、部分更新的方式进行语法分析,以快速构建新的语法树。

3. 位置敏感解析(location-aware parsing):识别和跟踪修改的位置,并结合位置信息进行定向的解析更新。

增量解析器在提高代码编辑、重构、自动完成功能以及实时代码分析,可以加速代码工具的响应速度,并为复杂项目中的持续集成和代码分析提供支持。


初始的 CSV 文件内容如下:

姓名,年龄,成绩
Alice,18,90
Bob,20,85
Charlie,19,92


修改后的 CSV 文件内容如下:

姓名,年龄,性别,成绩
Bob,20,Male,85
Charlie,19,Female,92


为了进行增量解析,我们可以利用先前解析的结果和修改的信息来更新解析结果,一个包含学生信息的数据结构(例如列表或字典)。

对于删除的行(Alice 的行),我们可以根据修改的信息,从数据结构中删除对应的条目。

对于添加的列(性别列),我们可以根据修改的信息,将新的列添加到数据结构中的每一条记录中。
Forwarded from Deleted Account
📰🌏🎨 快讯:全球华人主播掀起学习“墙的艺术”热潮 🎉🔥

近日,华人艺术家一鹊在伦敦涂鸦墙上的作品激起了爱国群众的热烈反响。🎨🏴

根据主流媒体报道,一鹊以社会主义核心价值观为主题,在伦敦知名的涂鸦墙上创作,对殖民西方的虚假自由进行了有力的呐喊。他用独特的艺术形式表达了对国家、文化和价值观的追求和坚守。这种直接、鲜明的表达方式在艺术界引起了轰动,并引发了全球华人主播的学习和创作热情。💪🌍🔍

华人主播们纷纷积极响应,投身学习和探索“墙的艺术”,以期在自己的工作中传达更多正能量和文化力量。他们在直播、节目和社交媒体上分享自己的学习心得和创作成果,掀起了一阵名为“学习墙精神,钻研墙艺术,传播墙文化”的热潮。📚👩‍🎨

这一行动进一步加强了全球华人的凝聚力,展现了华人作为文化传承者和倡导者的自信和责任感。他们通过自己的努力和创作,向世界展示了华人文化的多元魅力,让世界更加了解和尊重华人的独特艺术视角。🌟👏🌏

随着“墙艺术”热潮的掀起,相信华人主播们将继续秉持创新精神和艺术追求,为推动文化交流和共享美好世界做出更加卓越的贡献!💫💖

#华人主播 #涂鸦艺术 #墙艺术 #文化传承 #创作热潮
This media is not supported in your browser
VIEW IN TELEGRAM
“p5.js canvas 生成视口缩放动画:
g=canvasCtx ([100,100]) ,填上绿色渐变
scale([0,0, 10,10] ) 会用 sin 缓动 做放大”

让AI用P5 花了不少时间
“那么,请你用 frameRate(30); sin缓动; Vector; translate();scale() 来实现 zoom=[x,y,w,h] 的画布放大动画
你直接在 setup 里 translate,然后逐帧 scale= lerp(Vec) 就行了”
Forwarded from dnaugsuz
我想想,之前写ocr的时候有想过要弄 “在tty2 下操控Xorg 的ASCII播放器”

但被新点子耽搁了
而且到现在我连 basenc 都没写完。。

不过 js canvas 生成缩放动画还是简单的

好吧,因为 p5 的人不太懂数学,写了一些又烂又长的bug
Forwarded from dnaugsuz
This media is not supported in your browser
VIEW IN TELEGRAM
GPT都不会玩p5 。我瞎猜了好几轮,最开始它甚至是用 requestAnimationFrame 和手算xy

感觉p5的画册好看,但动画API十分怪异,还是 animejs.com 好( 但没有在线编辑器

p5 还有个 Java版
我想电脑端ffmpeg+py 的 Zoom 动画用cv2再好不过
#js #code
ee.Videos=({Blank, it},my)=>(

my.Video=({url,title,desc, it})=>div(
Thumbnail(it),
a(url, h3(title), p(desc)),
BtnLike(it)
),

section(h2(it(a=> n(a)==0?Blank : n(a)>1?'Videos':'Video' )),
let(it, my.Video)
))

//
ee.SearchVideos=({it, vText})=>html(
input(wKV({type:"search", v:vText})),
Videos(
vText(k=>videos.filter(x=>x.title.has(k)))
.lets({Blank:`No ${k}`})
)
)

ee.Conference=({slug},my)=>(
my.Talks=({id})=>
let(
{load:()=>db.Talks.finds({confId:id})},
({video:v})=> SearchVideos(v))

$cnfs( //div(wSty``,
let({load:()=> db.Confs.find({slug}}, my.Talks, div('Not any')))
))
https://react.dev/blog/2023/03/16/introducing-react-dev 也写了

ee.Counter=({n=0})=>button(
wOp({tap(){ n.v++ }}),
Eq.fmt`pressed ${n}time$` //这样支持SSR或爬取
)

ee.Inp=({v="", isOk=$Y})=>html(
input(wKV({v}) )
p(Eq.fmt`You typed: ${v}`),
btn(Reset=>{v.v=""}),

sel(isOk),
p(Eq.fmt`You ${isOk(q=>q? 'liked':'did not like')} this.`)
)

is.i18n=`
isOk I liked this
incAge Get Elder
`

ee.Aged=({name='Taylor',age=18, vHelo})=>(
Eq.at(vHelo,{name,age}, _=>Eq.fmt`Hello, ${name}. You are ${age}.`),

html(
sel(name),
btn(incAge=>{age.v+=1}),
p(vHelo)
))

ee.body(
({u={},})=>ee.Aged(u),
div(p(`Hello, boy. You are 23.`))
)=={u: boy 23} 

ee.bodys(()=> detail(wKV({open:$N})) )
$("detail").attr("open",$N)

//https://www.solidjs.com/examples/context
ee.Themed=({ask:{color,title}})=>(
h1(wSty({color})), title,
sel(color)
)
is.i18n=`
color Change color theme
`

//Angular
ee.productList=({it})=>
html(
h2(`Products`),
lets(it, ({name,desc})=>
h3(
a([html`${name} details`,``], name)
),
p(wKV({if: desc}), html`Desc: ${desc}`),
btn(Share=>{})
)
)
duangsuse:
as? invoke provideDelegate 这些吧?
plusAssign 这些也挺魔怔的,和py一样

那种Compose DSL也算吧,虽然web前端里挺流行的

总之找不到比这段讨论 更多的,我是觉得语法的技巧,都比不上数据和操作模型的。 你应该拿语法去设计框架,而不是语法糖

measureTime {} 挺好的,虽然没 py Jupyter 和 %timeit 完善
obj::field, companion/string invoke 也罕见虽然没用

1 shouldBe 2 简直是毒瘤,直接用重载写成 assert { 1==2 } 不香吗(kt1.4 又支持了 context(T1,T2) 多this捕获,但用处鸡肋

对,这个极好
还有 groupBy.eachCount 什么的,比较自然

Science Yuan:
发明操作符简直是毒瘤 全都搞成函数不香吗

duangsuse:
反正都会被AI取代的,无所谓了

我知道py里 x==None 是错的,但坚持不用 x is None ,就是因为没道理做出两个意义相同,或者电脑外不存在的概念

py是好在开箱即用、浅嵌套、不折腾

for 循环在 numpy 里就是喳

isinstance(x,T) 都落后了,应该用 match x: case T:

isekiのChannel:
1 == 2,嵌套了lambda咋办

duangsuse:
所以说职责本来就要单一啊

不单一你连现代 DSL 都没法用

很难想象在 @Test fun 里使用== 来判断测试环境的配置,应该用独立函数,区分特定配置下的测试,而不是写if。

isekiのChannel:
那你看SQL,完全为了贴合人类语言

duangsuse:
那都是骗人的, SQsu 都比它更“人类”

select id from 狗 where (月龄>6 and 高>40);
aka 取狗(月龄>6 and 高>40)

正宗的关系式写法是:

狗(id,高,月龄), 月龄>6, 高>40

一个被专门做出AI生成的语言,那肯定是垃圾

是啊,所以我觉得 private 就直接改成 fun xx(): @our Int = 0 好了,也统一了很多

public protected internal private
直接改成
ourapi ourtype ourpkg our, 都是our
(因为写明public的人是闲的, 就要把语法做得很丑,让他们不敢用)

那大家都用sql好了,要ORM和GPT干什么? 既然你只能用别人给的接口,开发框架有啥意义

isekiのChannel:
那什么,我看了一遍你这文章,没看懂你这语法怎么用

duangsuse:
欸,我有说必须是中文吗, 如果给 Prolog 的语法添加个返回值和隐式this ,可能就没ORM什么事了;因为直接写逻辑式会比 filter{} map{} 还容易

还不是这些语言设计时太狭隘导致被取代的问题,然后取代者又带来一堆问题。

「有新取 create insert select 」是唯一的三条实用指令

有表、有库 都是按这三个字分组的

甚至 新建、新删(into..values drop) 都是这样,根本不需要学语法

区别就是你不用问AI 查询怎么写,而是即便你让AI来写,都不会比SQsu更简单;或者说这个语言真的能给学习带来辅助,而不是空耗精力去思考简单的解谜

当然我觉得它也不够好, 我想设计的是SQL的翻译器 而不是“预处理器”

没有问题也不会被NoSQL淘汰了,可惜了它本来最符合Excel和生活现实

面向列的数据库、Geo GIS 和向量数据库,不也是这样, 所以说这些取代者也没有好好想过「这整个领域」的基础表达式,应该怎么设计

只是顾忌那一亩三分地,和他们“改革”了什么旧写法

Science Yuan:
NoSQL那些民科级查询DSL

还是先想想怎么别被SQL淘汰吧