下载软件本体

进入软件官网,选择 Mac 版本下载,目前 Mac 上 Zotero 还是 beta 版本(本文发布时间2024.3)。

https://www.zotero.org/support/beta_builds

安装 Chrome 插件


https://www.zotero.org/download/connectors

安装插件

安装插件商城

项目主页:https://github.com/syt2/zotero-addons
点击直接下载:https://github.com/syt2/zotero-addons/releases/latest/download/zotero-addons.xpi

在 Zotero 中安装



选择刚刚下载的文件


就可以这在两个地方看见插件商城了

点开后就可以便捷的安装插件,可以参考我的安装情况进行安装

显示期刊等级


首先在图示地方右键,勾选上期刊标签。

接着,重启 Zotero 在“期刊标签”这个栏上右键,点击“列设置(期刊标签)”,如果没有,请多重启或者换位置点击试试。

打开设置面板,填写必要的信息,下面会介绍获取的方法。

Secret Key获取方法

注册easyscholar账号后点击下方链接,获取Secret Key。(新用户会送一个月时长,填写邀请码 765f 再送半个月。)
https://www.easyscholar.cc/console/user/open

Fields 和 Map 代码

复制进去即可

1
pku,nju,ccf,CCF,zhongguokejihexin,eii,cssci,sciif,sci,ssci,jci,sciwarn,sciUp,cscd
1
北大中文核心=北核,EI检索=EI,中国科技核心期刊=中核,SCIWARN=预警,SCI升级版=SCI,/医学(\d+)区/=医$1,  /生物学(\d+)区/=生$1,  /农林科学(\d+)区/=农$1,  /环境科学与生态学(\d+)区/=环$1,  /化学(\d+)区/=化$1,  /工程技术(\d+)区/=工$1,  /数学(\d+)区/=数$1,  /物理与天体物理(\d+)区/=物$1,  /地球科学(\d+)区/=地$1,  /材料科学(\d+)区/=材$1,  /计算机科学(\d+)区/=计$1,  /经济学(\d+)区/=经$1,  /法学(\d+)区/=法$1,  /管理学(\d+)区/=管$1,  /心理学(\d+)区/=心$1,  /人文科学(\d+)区/=人$1,  /教育学(\d+)区/=教$1,  /综合性期刊(\d+)区/=综$1, 

翻译插件

进入zotero,同时按command+,,打开设置面板后按照图中设置,翻译服务的设置有很多,可以根据个人喜好进行调整。

Webdav 备份

请参考:https://zhuanlan.zhihu.com/p/493029362

  1. Git clone
1
https://github.com/doccano/doccano.git

国内加速(不保证一定可用

1
git clone https://ghproxy.com/https://github.com/doccano/doccano
  1. 进入目录
1
2
cd doccano
cd docker
  1. 创建 .env
    复制docker目录下的env
    设置密码后重命名为 .env
  2. 运行
    默认运行到本地80端口
    如要修改配置文件docker-compose.prod.yml中找到80端口,修改为其他端口
    再把 .env 文件复制出来,修改里面的密码
1
2
3
4
// 第一次启动
docker-compose -f docker-compose.prod.yml up -d --env-file .env up
// 后续的启动
docker-compose -f docker-compose.prod.yml up -d
  1. 停止
1
docker-compose -f docker-compose.prod.yml down

https://bytodance.feishu.cn/docx/Y3pmdbFwAoHrx8xDZ21cxcMQnue

1. Vscode 插件——CPH

非常好用的插件,可以在 Vscode 中快速的新建测试样例,并且一键测试多个样例。

就是需要修改一下编译命令。

1
2
Vscode中设置id: cph.language.cpp.Args
-O2 -Wall -std=c++17 -pipe

https://marketplace.visualstudio.com/items?itemName=DivyanshuAgrawal.competitive-programming-helper

2. Chrome 插件——Competitive Companion

安装这个插件后,可以将网页中的题目快速导入 Vscode 中,同时把样例也导入上文的 CPH 插件中。

https://chrome.google.com/webstore/detail/competitive-companion/cjnmckjndlpiamhfimnnjmnckgghkjbl

3. Chrome 插件——CPH Submit for Chrome

安装这个插件可以让 CPH 上的 Submit 按钮生效,实现一键交题的操作。
原版的 Cph Submit 仅仅支持 Firefox 浏览器,这个修改版支持 Chrome。
就是安装稍显麻烦,详情请看项目 Readme。
简单来说分为三步

  1. git clone 项目
  2. 进入项目根目录,npm install
  3. 进入 Chrome/Edge 拓展中心,打开开发者模式,点击刚刚的目录导入插件
    https://github.com/abdallamaher/cph-submit

4. CF 补题网站

点开在最上面输入你的cfid,然后点击table,就可以看到自己的刷题情况。
https://cf.kira924age.com/

5. CF 刷题分析

cf进入某个人主页可以看见他的刷题数目
https://chrome.google.com/webstore/detail/cf-analytics/hhljbjodjdbjbggddjaidojnlmaobcpo

6. CF 赛时分数预测

不是很准确(偏高
https://chrome.google.com/webstore/detail/carrot/gakohpplicjdhhfllilcjpfildodfnnn

本脚本开源,无任何加密混淆
对 Intel 和 Arm 芯片都进行了适配

如何使用?

  1. 下载下方文件
    https://www.mhatp.cn/upload/2023/05/macupdate48tool-d5596053f33147e6b582e35c361712b1.sh
  2. 打开终端 App

    输入命令运行
1
sh ~/Downloads/macupdate48tool-d5596053f33147e6b582e35c361712b1.sh

脚本会自动检测版本号以判断是否需要更新:
若无需更新,自动退出。
若需要更新,脚本会自动下载对应系统的最新版本发行压缩包并解压到临时目录,再移动软件包到系统目录下,再解除隔离标签,最后删除掉临时文件。
由于脚本为您进行了解除隔离标签这一步,所以脚本运行中需要用到您账户的密码(您手动更新时也需要使用到)。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#!/bin/bash

# 关闭 48tools.app
echo "正在关闭 48tools.app"
osascript -e 'quit app "48tools"'

# 获取当前安装的应用程序版本号
CURRENT_VERSION=$(defaults read /Applications/48tools.app/Contents/Info.plist CFBundleShortVersionString)
echo "当前版本:v$CURRENT_VERSION"

# 检测当前系统版本是arm还是intel,分配不同的下载链接
if [ "$(uname -m)" = "arm64" ]; then
echo "当前系统:arm64"
# 获取最新版本的下载链接
DOWNLOAD_URL=$(curl -s https://api.github.com/repos/duan602728596/48tools/releases/latest \
| grep -o "https://github.com/duan602728596/48tools/releases/download/.*/48tools-.*-mac-arm64.zip")
else
echo "当前系统:intel"
# 获取最新版本的下载链接
DOWNLOAD_URL=$(curl -s https://api.github.com/repos/duan602728596/48tools/releases/latest \
| grep -o "https://github.com/duan602728596/48tools/releases/download/.*/48tools-.*-mac.zip")
fi

echo "正在检查更新..."
# LATEST_VERSION
LATEST_VERSION=$(curl -s https://api.github.com/repos/duan602728596/48tools/releases/latest \
| grep -o '"tag_name": ".*"' \
| sed 's/"//g' \
| sed 's/tag_name: //g')
echo "最新版本:$LATEST_VERSION"

# 检查是否获取到最新版本号
if [ -z "$LATEST_VERSION" ]; then
echo "获取最新版本号失败"
echo "请检查网络连接"
exit 1
fi

# 检查当前版本是否与最新版本相同
if [ "v$CURRENT_VERSION" = "$LATEST_VERSION" ]; then
echo "当前版本已经是最新版本,不需要更新"
# 打开 48tools.app
open /Applications/48tools.app
exit 0
fi

# 设置安装变量
APP_NAME="48tools.app"
DOWNLOAD_PATH="./48toolstmp/48tools.zip"
INSTALL_PATH="/Applications/$APP_NAME"

# 创建临时文件夹
mkdir -p ./48toolstmp

# 下载文件并检查错误
echo "下载链接:$DOWNLOAD_URL"
curl -L "$DOWNLOAD_URL" -o "$DOWNLOAD_PATH"
if [ $? -ne 0 ]; then
echo "下载文件失败"
exit 1
fi

# 解压文件并检查错误
unzip -o "$DOWNLOAD_PATH" -d "./48toolstmp"
if [ $? -ne 0 ]; then
echo "解压文件失败"
exit 1
fi
# mv ./48toolstmp/48tools-*/48tools.app ./48toolstmp/48tools.app
cp -rf ./48toolstmp/48tools-*/48tools.app ./48toolstmp/48tools.app

# 检查应用程序文件是否存在
if [ ! -d "./48toolstmp/$APP_NAME" ]; then
echo "找不到应用程序"
exit 1
fi

# 将应用移到应用程序文件夹
echo "正在移动应用程序..."
# 判断是否存在文件夹,不存在则创建
if [ ! -d "$INSTALL_PATH" ]; then
mkdir -p "$INSTALL_PATH"
fi
# 替换应用程序
rm -rf "$INSTALL_PATH"
mv "./48toolstmp/$APP_NAME" "$INSTALL_PATH"
if [ $? -ne 0 ]; then
echo "移动应用程序失败"
exit 1
fi

# 移除应用程序的隔离标签并检查错误
echo "正在移除隔离标签..."
echo "请在输入密码,以便移除隔离标签,输入完成后按回车键(密码不会显示)"
sudo xattr -r -d com.apple.quarantine "$INSTALL_PATH"
if [ $? -ne 0 ]; then
echo "移除隔离标签失败"
exit 1
fi

echo "正在清理文件..."
# 清理文件
rm -rf ./48toolstmp
if [ $? -ne 0 ]; then
echo "清理文件失败"
exit 1
fi

# 输出更新完成消息
VERSION=$(defaults read "$INSTALL_PATH/Contents/Info.plist" CFBundleShortVersionString)
echo "48tools 已更新到版本 $VERSION"
echo "更新完成,正在重新打开应用程序"
open /Applications/48tools.app
exit 0
# 脚本发布地址 https://www.mhatp.cn/archives/update48tools

License: WTFPL

Todo List

  • 加入镜像站功能,便于大陆用户使用
  • 对首次安装做出优化
  • 自动安装 ffmpeg
  • 自动安装 Chrome
  • 输出 ffmpeg 路径以及无头浏览器路径以便捷使用

有幸 AK(全部满分通过) 了 L1,最终总分 187 分荣获国三,存一下赛时代码和部分做题思路留作纪念。
二阶还在补🐦

L1-1 最好的文档

签到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <bits/stdc++.h>
#include <vector>
#include <set>
#include <queue>
#define int long long
using namespace std;

void solve() {
cout << "Good code is its own best documentation." << endl;
}


signed main() {
int T = 1;
// cin >> T;
while(T--) {
solve();
}
}

L1-2 什么是机器学习

签到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <bits/stdc++.h>
#include <vector>
#include <set>
#include <queue>
#define int long long
using namespace std;

void solve() {
int a, b;
cin >> a >> b;
int c = a + b;
cout << c - 16 << endl;
cout << c - 3 << endl;
cout << c - 1 << endl;
cout << c << endl;
}


signed main() {
int T = 1;
// cin >> T;
while(T--) {
solve();
}
}

L1-3 程序员买包子

签到 if-else

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <bits/stdc++.h>
#include <vector>
#include <set>
#include <queue>
#define int long long
using namespace std;

int n, m, k;
string x;

void solve() {
cin >> n >> x >> m >> k;
if (k == n) {
cout << "mei you mai " << x << " de";
} else if (k == m) {
cout << "kan dao le mai " << x << " de" << endl;
} else {
cout << "wang le zhao mai " << x << " de" << endl;
}
}


signed main() {
int T = 1;
// cin >> T;
while(T--) {
solve();
}
}

L1-4 进化论

签到 if-else

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <bits/stdc++.h>
#include <vector>
#include <set>
#include <queue>
#define int long long
using namespace std;



void solve() {
int a, b, c;
cin >> a >> b >> c;
if (a * b == c) cout << "Lv Yan" << endl;
else if (c == a + b) cout << "Tu Dou" << endl;
else cout << "zhe du shi sha ya!" << endl;
}


signed main() {
int T = 1;
cin >> T;
while(T--) {
solve();
}
}

L1-5 猜帽子游戏

模拟
定义两个bool类型变量看是否猜错(caicuo)和是否猜对(caidui),再判断一下即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <bits/stdc++.h>
#include <vector>
#include <set>
#include <queue>
#define int long long
using namespace std;

const int N = 110;
int a[N];

void solve() {
int n;
cin >> n;
for (int i = 0;i < n;i ++) cin >> a[i];
int tt;
cin >> tt;
while (tt--) {
bool caicuo = false, caidui = false;
for (int i = 0;i < n;i ++) {
int x;
cin >> x;
if (x == 0) continue;
if (x == a[i]) caidui = true;
if (x != a[i]) caicuo = true;
}
if (caidui && !caicuo) {
cout << "Da Jiang!!!" << endl;
} else {
cout << "Ai Ya" << endl;
}
}
}


signed main() {
int T = 1;
// cin >> T;
while(T--) {
solve();
}
}

L1-6 剪切粘贴

考查字符串函数运用的简单模拟

主要考察字符串函数 substr 和 find 的用法
假设s是一个字符串 abcdefg。
substr 后面可以接两个参数:
1⃣️s.substr(a) a是坐标(从0开始),切到最后。如 s.substr(2) = “cdefg”。2⃣️s.substr(a, length),第二个参数是长度,代表要切多少个字符。
find 后面接要查询的字符串,用的是暴力枚举法。
s.find(“abc”) 如果没找到返回 -1,否则返回 a (find内字符串第一个字母)的坐标(从0开始)。

在这个题目中,所给的操作区间是从1开始,所以我们先给字符串加一个空格,方便后面操作。

推荐先用“题干”(不是测试样例)中给的小样例

1
2
3
abcdefg 1
3 5
bf g

并在代码中多输出,进行调试。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <bits/stdc++.h>
#include <vector>
#include <set>
#include <queue>
#include <string>
#define int long long
using namespace std;

string s;
int n;

void solve() {
cin >> s >> n;
s = " " + s;
for (int i = 0;i < n;i ++) {
int a, b;
cin >> a >> b;
string cutted = s.substr(a, b - a + 1);
// cout << cutted << endl;
s = s.substr(0, a) + s.substr(b + 1);
// cout << s << endl;

string c, d;
cin >> c >> d;
int pos = s.find(c + d);
if (pos == -1) s = s + cutted;
else {
// cout << pos << endl;
//out << s.substr(0, pos + c.size()) << endl;
s = s.substr(0, pos + c.size()) + cutted + s.substr(pos + c.size());
}
//for (int i = 1;i < s.size(); i++) cout << s[i];
// cout << endl;
}
for (int i = 1;i < s.size(); i++) cout << s[i];
}
/*
abcdefg 1
3 5
bf g
*/

signed main() {
int T = 1;
// cin >> T;
while(T--) {
solve();
}
}

L1-7 分寝室

因数分解+暴力
L1的题目基本无需考虑时间复杂度,直接硬上就可以。

首先先把n0和n1的因数枚举出来,我把他作为作为房间个数来存,题干中说明不可以是一人一间,所以在枚举的时候要特判 因数==1 的情况。
然后暴力从因数中找即可。
(我define int longlong 所以 mmin 才那么奇怪

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <bits/stdc++.h>
#include <vector>
#include <set>
#include <queue>
#define int long long
using namespace std;

int n0, n1, n;
vector<int> a, b;

void solve() {
cin >> n0 >> n1 >> n;
for (int i = 1;i <= n0 / i;i ++ ) {
if (n0 % i == 0) {
a.push_back(i);
if (i != 1 && i != n0 / i) a.push_back(n0 / i);
}
}
for (int i = 1;i <= n1 / i;i ++ ) {
if (n1 % i == 0) {
b.push_back(i);
if (i !=1 && i != n1 / i) b.push_back(n1 / i);
}
}
int mmin = 0x3f3f3f3f3f3f3f3f, ansa = -1,ansb = -1;
for (int i = 0;i < a.size();i ++) {
for (int j = 0;j < b.size();j ++) {
if (a[i] + b[j] != n) continue;
if (abs(n0 / a[i] - n1 / b[j]) < mmin) {
mmin = abs(n0 / a[i] - n1 / b[j]);
ansa = a[i],ansb = b[j];
}
}
}
if (mmin == 0x3f3f3f3f3f3f3f3f) cout << "No Solution";
else cout << ansa << ' ' << ansb << endl;
}


signed main() {
int T = 1;
// cin >> T;
while(T--) {
solve();
//cout << "No Solution";
}
}

L1-8 谁管谁叫爹

模拟

注意一下细节把握即可,想清楚同时存在或者同时不存在这种情况怎么用代码实现。
涉及到一个数字的每一位有关的问题,建议用字符串读取方便快捷。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <bits/stdc++.h>
#include <vector>
#include <set>
#include <queue>
#define int long long
using namespace std;

int n;

int cal(string s) {
int res = 0;
for (auto &x : s) {
res += x - '0';
}
return res;
}

void solve() {
cin >> n;
for (int i = 1;i <= n;i ++) {
string a, b;
cin >> a >> b;
int na = stoi(a), nb = stoi(b);
int sa = cal(a),sb = cal(b);
bool fa = false, fb = false;
if (na % sb == 0) {
fa = true;
}
if (nb % sa == 0) {
fb = true;
}
if (fa != fb) {
if (fa) cout << "A" << endl;
else cout << "B" << endl;
} else {
if (na > nb) cout << "A" << endl;
else cout << "B" << endl;
}
}
}


signed main() {
int T = 1;
// cin >> T;
while(T--) {
solve();
}
}

油猴脚本,新建一个复制进去即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// ==UserScript==
// @name Disable Ctrl+S on certain websites
// @namespace http://tampermonkey.net/
// @version 1.0
// @description Disable Ctrl+S to save page on certain websites
// @match *://www.acwing.com/*
// @match *://leetcode.cn/*
// @match *://leetcode.com/*
// @match *://www.luogu.com.cn/*
// @match *://pintia.cn/*
// @match *://codeforces.com/*
// @match *://nowcoder.com/*
// @match *://acm.zju.edu.cn/*
// @match *://poj.org/*
// @match *://acm.hit.edu.cn/*
// @match *://acm.hdu.edu.cn/*
// @match *://vjudge.net/*
// @match *://atcoder.jp/*
// @grant none
// ==/UserScript==

window.addEventListener('keydown', function(e) {
if ((e.ctrlKey || e.metaKey) && e.keyCode == 83) {
e.preventDefault();
e.stopPropagation();
}
}, true);

感谢 Chatgpt 提供支持!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
// ==UserScript==
// @name acwing-helper
// @namespace https://github.com/tonngw
// @version 1.1.3
// @description AcWing 助手,学算法就上 AcWing!| 题目复制 | 生成题解模板 | 切换页面风格 (AcWing <-> LeetCode) | 复制代码 | 题目直接跳转
// @author tonngw
// @match https://www.acwing.com/problem/content/*/
// @match https://www.acwing.com/activity/content/*/
// @match https://www.acwing.com/activity/content/punch_the_clock/*/
// @match https://www.acwing.com/activity/content/code/content/*/
// @match https://www.acwing.com/solution/*/
// @match https://www.acwing.com/blog/*/
// @match https://www.acwing.com/community/*/
// @exclude https://www.acwing.com/problem/content/submission/*/
// @exclude https://www.acwing.com/problem/content/discussion/*/
// @exclude https://www.acwing.com/problem/content/solution/*/
// @exclude https://www.acwing.com/problem/content/video/*/
// @icon data:image/x-icon;base64,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n+CgtWjSm6xZzsnPoOD/////29m36K2lVM6yo1POt6FSzrufUc7AnVDOxJtPzsmZTs7NmE2mQdNuvkXRbc6h5rPi9vz3/FPLas5XyWnOXMdozmDFZ85txm3Q8Pnv+PT69PrP6crs/v7+//X68/ru9en24+7b8uPt2PDt8uX27vPm9ubs2PDL1Kji9/jy+vb27/iurF/QraVUzrKjU863oVLOu59RzsCdUM7Em0/OyZlOzs2XTb5B027KRdFtzq7qvubq+e34U8tqzlfJac5cx2jOYMVnzmXDZc6h2Z7e/////9LqzOzw+O748vjv+Onz5PTl793y4+3Z8N/p0e7V4cDqxtOl4unt2/L/////zc+h4KmnVs6tpVTOsqNTzrehUs67n1HOwJ1QzsSbT87JmU7OzZdNzEHTbspF0W3Oruq+5ur57fhTy2rOV8lpzlzHaM5gxWfOZcNlzmrCZc7d8Nvy/P38/6DQkdrT6Mrs7PTn9uDs1/DL3rfmu9Gd3sLTo+Dl69fw//////X27viytnHUqadWzq2lVM6yo1POt6FSzrufUc7AnVDOxJtPzsmZTs7Nl03MQdNuvEXRbc6h5rPi9vz4/FPLas5XyWnOXMdozmDFZ85lw2XOasFkzonMgdb8/fz83u7Y8Hy6YM6IvGnQstGa3tXkxury9uz49fjw+vL16/j+/v7/0dau5Ofo0/C+vYDYraVUzrKjU863oVLOu59RzsCdUM7Em0/OyZlOzs2XTb5B0m6kRdFtzoTenNz/////atJ91FfJac5cx2jOYMVnzmXDZc5qwWTObsBjzsXkv+j/////qdGX3IC4X86Ftl7OibRdzo6yXM7C1KTi//////j58/r09ez4ycua4M7NnuC9tXTWsqNTzrehUs67n1HOwJ1QzsSbT87JmU7OzZhNpkLSbnxF0W3OWNN40v3+/f+b4KjgV8lpzlzHaM5gxWfOZcNlzmrBZM5uwGPOe8Js0PP58frv9uv4hLpk0IW2Xs6JtF3OkbRg0PD16vb2+PH6orJk0MDHkdzy8+j25uXO7rKqXtCyo1POt6FSzrufUc7AnVDOxJtPzsmZTs7MmE1+QtJuRkXRbc5Kz2zO1/Te8tby2/BXyWnOXMdozmDFZ85lw2XOasFkzm7AY85zvmLOrdeh3v/////B3LHkhbZezom0Xc7G2a3k/////8LP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
// @require https://cdn.staticfile.org/jquery/3.4.1/jquery.min.js
// @require https://unpkg.com/sweetalert/dist/sweetalert.min.js
// @require https://unpkg.com/turndown/dist/turndown.js
// @require https://unpkg.com/turndown-plugin-gfm/dist/turndown-plugin-gfm.js
// @require https://cdn.bootcdn.net/ajax/libs/bootstrap-switch/4.0.0-alpha.1/js/bootstrap-switch.min.js
// @grant GM_registerMenuCommand
// @grant GM_setClipboard
// @license MIT
// ==/UserScript==

(function () {
"use strict";


$("head").append($(`<link href="https://cdn.bootcdn.net/ajax/libs/bootstrap-switch/4.0.0-alpha.1/css/bootstrap-switch.min.css" rel="stylesheet">`));

// 使用 turndown-plugin-gfm 修复 <table> 标签解析错误,https://github.com/mixmark-io/turndown-plugin-gfm
var gfm = turndownPluginGfm.gfm;
// 初始化 html to markdown 转换工具
var turndownService = new TurndownService();
turndownService.use(gfm);

const window = unsafeWindow;
const description = ".row";
var content = "";

// 判断路径中是否包含 code, solution, blog, community,代码复制功能只在指定路径下下生效
var url = window.location.href;
if (url.includes("code") || url.includes("solution") || url.includes("blog") || url.includes("community")) {
// 插入复制代码按钮,并设置位置
$(".hljs").each(function() {
$(this).before(
"<button class='copyCodeBtn' class='btn default'><span class='glyphicon glyphicon-file'></span></button>"
);
});

// $(".copyCodeBtn").css("position", "absolute");
// $(".copyCodeBtn").css("top", "10px");
// $(".copyCodeBtn").css("right", "10px");
// 去除按钮默认样式
$(".copyCodeBtn").css("border", "none");
$(".copyCodeBtn").css("background-color", "transparent");
$(".copyCodeBtn").css("outline", "none");

turndownService.addRule('strikethrough', {
filter: ['pre'],
replacement: function (content) {
return '' + content.trim() + ""
}
});
// 为按钮绑定点击事件
$(".copyCodeBtn").click(function() {
let target = $(this).next();
// console.log($(target).html());
target.markdown = turndownService.turndown($(target)[0].outerHTML);
GM_setClipboard(target.markdown);
$(this).text("已复制到剪贴板");
});
return;
}

// 拦截带有 ? 的路径直接打开题目
if (url.includes("?")) {
// alert(url);
// alert($(".label-info").get(0).href);
location.href = $(".label-info").get(0).href;
return;
}

// 在题目内容页面添加在当前页面打开题目按钮
if (url.includes("activity/content/problem/content")) {
var gotoHref = $(".label-info").get(0).href;
// console.log(gotoHref);
var gotoA = '&nbsp;&nbsp;&nbsp;&nbsp;<a href=' + gotoHref + ' title="跳转" one-link-mark="yes"><span class="glyphicon glyphicon-share-alt"></span></a></a>';
$(".label-info").after(gotoA);
return;
}

// 获取所有的打卡题目,并添加直达题目按钮
if (url.includes("punch_the_clock") || url.includes("activity")) {
$(".punch-line").each(function () {
var gotoHref = $(this).children("a").get(0).href + '?';
// console.log(gotoHref);
var gotoA = '<a href=' + gotoHref + ' title="跳转" target="_blank" one-link-mark="yes"><span class="glyphicon glyphicon-share-alt"></span></a></a>';
$(this).append(gotoA);
});
return;
}

/*if (url.includes("punch_the_clock") || url.includes("activity")) {
if (url.includes("31") || url.includes("1150") || url.includes("72")
|| url.includes("57") || url.includes("1687") || url.includes("22") || url.includes("5"))
return;
$(".punch-line").each(function () {
var gotoHref = $(this).children().children("span").text();
var endPos = gotoHref.indexOf('.');
var titleNo = Number(gotoHref.slice(7, endPos)) + 2;
gotoHref = 'https://www.acwing.com/problem/content/' + titleNo;
console.log(titleNo);
var gotoA = '<a href=' + gotoHref + ' title="跳转" target="_blank" one-link-mark="yes"><span class="glyphicon glyphicon-share-alt"></span></a></a>';
$(this).append(gotoA);
});
return;
}*/

// 添加复制按钮
console.log("acwing helper...");
var copyBtn = document.createElement("button"); //创建一个 input 对象(提示框按钮)
copyBtn.id = "copyBtn";
copyBtn.textContent = "复制";
copyBtn.style.width = "50px";
copyBtn.style.height = "30px";
copyBtn.style.align = "center";

var x = document.getElementsByClassName("problem-content-sub-btn")[0];
// 在浏览器控制台可以查看所有函数,ctrl+shift+I 调出控制台,在 Console 窗口进行实验测试
x.appendChild(copyBtn);

// 添加切换按钮
$("#open_ac_saber_btn").after('<input name="switchBtn" type="checkbox" checked>');
// name 值和 input 标签的 name 值一样
$("[name='switchBtn']").bootstrapSwitch({
onText : "Right", // 设置ON文本
offText : "Bottom&nbsp;&nbsp;", // 设置OFF文本
onColor : "success",// 设置ON文本颜色(info/success/warning/danger/primary)
offColor : "info", // 设置OFF文本颜色 (info/success/warning/danger/primary)
size : "normal", // 设置控件大小,从小到大 (mini/small/normal/large)
// 当开关状态改变时触发
onSwitchChange : function(event, state) {
if (state == true){
setTimeout(() => window.location.reload(), 100);
} else {
switchPageStyle();
}
}
});
$(".bootstrap-switch-on").css("top", "10px");
$(".bootstrap-switch-on").css("left", "10px");

// 添加生成题解按钮
var generateSolutionBtn = document.createElement("button"); // 创建一个input对象(提示框按钮)
generateSolutionBtn.id = "generateSolutionBtn";
generateSolutionBtn.textContent = "生成";
generateSolutionBtn.style.width = "50px";
generateSolutionBtn.style.height = "30px";
generateSolutionBtn.style.align = "center";

var y = document.getElementsByClassName("problem-content-sub-btn")[3];
y.appendChild(generateSolutionBtn);

// 监听键盘按键,为功能绑定快捷键
unsafeWindow.addEventListener("keydown", (evt) => {
// console.log('evt', evt);
if (evt.altKey) {
// Alt + T 复制题目
if (evt.keyCode == 84) {
copy();
}
// Alt + D 切换页面风格
if (evt.keyCode == 68) {
$("[name='switchBtn']").click();
}
// Alt + C 生成当前题目题解模板
if (evt.keyCode == 67) {
generateSolution();
}
}
});

// 注入右键菜单
GM_registerMenuCommand("复制 AcWing 题目为 Markdown,并存入剪切板", copy);
GM_registerMenuCommand("切换页面风格", function(){$("[name='switchBtn']").click()});
GM_registerMenuCommand("生成当前题目的题解模板,并存入剪切板", generateSolution);

// 为复制按钮绑定点击功能
copyBtn.onclick = function (e) {
e.preventDefault();
copy();
};

// 为复制题解按钮绑定按键点击功能
generateSolutionBtn.onclick = function (e) {
e.preventDefault();
generateSolution();
};

// 题目复制功能实现
function copy() {
copyImpl();
swal({
icon: "success",
title: "复制成功",
});
}

function copyImpl() {
// 内容 Dom
var contentDom = $(".section-martor")[0].outerHTML;
// 将题目描述 html 转换为 markdown
content = handleHtml(contentDom);
var str =
content/* +
"\n" +
"来源:AcWing\n" +
"链接:" +
window.location.href +
"\n" +
"著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。"*/;
GM_setClipboard(str);
}

// 切换页面风格功能实现
function switchPageStyle() {
$(".col-sm-3").attr("id", "right");
$(".col-sm-9").append($(".table-responsive"));
$(".col-sm-9").attr("class", "col-sm-4 col-xs-12");
$(".col-sm-3").attr("class", "col-sm-8");
$(".container").css("width", "1430px");
$("#right").html("");
$("#right").append($("#code_tool_bar"));
$("#right").append($("#code_editor"));
$("#right").append($("#data-augmentation-div"));
$("#right").append($("#submit_code_btn"));
$("#right").append($("#run_code_btn"));
$("#right").append($("#submit-code-status-block"));
$("#right").append($("#run-code-status-block"));
}

// @Deprecated 复制代码功能实现
function copyCode() {
turndownService.addRule('pre', {
filter: 'pre',
replacement: function (content) {
return "\n" + content.trim() + "\n";
}
});

let target = $("div[data-tab='preview-tab-content']");
console.log(target.html());
target.markdown = turndownService.turndown($(target).html());
GM_setClipboard(target.markdown);
swal({
icon: "success",
title: "复制成功",
});
}

// 生成题解功能实现
function generateSolution() {
generateSolutionImpl();
swal({
icon: "success",
title: "生成成功",
});
}

function generateSolutionImpl() {
var solutionTemplate = "";
var problemDescConst = "### 题目描述\n";
copyImpl();
var problemDesc = content;
var splitLine = "\n\n---\n";
var algorithmConst = "### 算法\n"
var specificAlgorithmConst = "#### (暴力枚举) $O(n^2)$";
var solution = "\n\nwrite here...\n\n"
var timeComplexityConst = "#### 时间复杂度";
var timeComplexity = "\n\nwrite here...\n\n"
var spaceComplexityConst = "#### 空间复杂度";
var spaceComplexity = "\n\nwrite here...\n\n";
var codeConst = "#### C++ 代码\n";
var code = "```\n" + "my code...\n" + "```";
solutionTemplate = problemDescConst + problemDesc + splitLine + algorithmConst + specificAlgorithmConst +
solution + timeComplexityConst + timeComplexity + spaceComplexityConst + spaceComplexity + codeConst + code;
GM_setClipboard(solutionTemplate);
}

/**
* html 转 markdown
* @param html
* @returns {void|*}
*/
function handleHtml(html) {
// 处理数学公式
turndownService.addRule("strikethrough", {
filter: ["script"],
replacement: function (content) {
return "$" + content + "$";
},
});
// 跳过 span 标签,不进行处理
turndownService.remove("span");
var markdown = turndownService.turndown(html);
return markdown;
}
})();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import pandas as pd
import datetime # 用于获取时间

# 手动输入文件地址
file_path = input("请输入文件地址:")

# 读取 Excel 文件,去除路径两边的''
df = pd.read_excel(file_path.strip("'"), skiprows= 1, dtype={'学号': str, '卡号': str})

# 输出表
print(df)

# 输出金额的总和
print('分类前行数', len(df))
print('分类前金额总和', df['金额'].sum()/2)
print()

# 去除卡号两边的换行符、空格和中间的空格
df['卡号'] = df['卡号'].fillna('').astype(str).str.strip().str.replace(' ', '')

# 修正学号第一位丢失问题
df['学号'] = df['学号'].astype(str).apply(lambda x: x.zfill(7))

# 筛选出金额数量不为1的记录
filtered = df.groupby(['学号', '姓名'], as_index=False).filter(lambda x: len(x) != 1).sort_values(['学号', '姓名'])

# 输出学号和姓名
print('做了多份工作的同学:')
print(filtered[['学号', '姓名', '金额']])
print()

# 对学号、姓名、银行卡号和年级进行分组,并对金额进行求和
df = df.groupby(['学号', '姓名', '卡号'], as_index=False)['金额'].sum()

# 输出分类后的行数和金额总数
print('分类后行数', len(df))
print('总金额', df['金额'].sum())

# 在 DataFrame 中插入空列
for i in range(5):
df.insert(2, f'{i+1}', '')

# 重新排列列的顺序
df = df.reindex(columns=['姓名', '卡号', 1, 2, 3, 4, 5, '金额', '学号'])

# 保存文件的地址是输入文件的地址+时间+后缀

output_file = file_path.strip("'").replace(".xlsx", '_' + datetime.datetime.now().strftime('%m月%d日%H%M') + '_加密表.xlsx')

# 将结果保存到 Excel 文件中
with pd.ExcelWriter(output_file) as writer:
df.to_excel(writer, sheet_name='Sheet1', index=False)
# writer.close()

print('输出结果已保存到文件中!')

How to use?

保存上方代码为xxx.py
安装 pandas 库 pip install pandas
运行之,复制地址进去,回车即可

感谢 Chatgpt 对这段代码的有力支持!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import pandas as pd

# 手动输入文件地址
file_path = input("请输入文件地址:")

# 读取 Excel 文件,去除路径两边的''
df = pd.read_excel(file_path.strip("'"))
# df = pd.read_excel(file_path)

# 去除银行卡号中的空格
df['银行卡号'] = df['银行卡号'].fillna('').astype(str).str.strip()

# 输出金额的总和
print('分类前行数', len(df))
print('分类前金额总和', df['金额'].sum())
print()

# 修正学号第一位丢失问题
df['学号'] = df['学号'].astype(str).apply(lambda x: x.zfill(7))

# 对学号、姓名、银行卡号和年级进行分组,并对金额进行求和
df = df.groupby(['学号', '姓名', '银行卡号'], as_index=False)['金额'].sum()

# 输出分类后的行数和金额总数
print('分类后', len(df))
print('总金额', df['金额'].sum())

# 在 DataFrame 中插入空列
for i in range(5):
df.insert(2, f'{i+1}', '')

# 手动输入保存文件的地址
output_file = input("请输入保存文件的地址:")

# 将结果保存到 Excel 文件中
with pd.ExcelWriter(output_file) as writer:
df.to_excel(writer, sheet_name='Sheet1', index=False)
writer.save()

print('输出结果已保存到文件中!')

by Chatgpt

1.安装 Brew

请参考先前文字,略

2.安装 Python

安装指定版本在后面加 @
例如:

1
2
3
4
brew install python@3.8
brew install python@3.9
brew install python@3.10
brew install python@3.11

要是想卸载就把 install 改成 uninstall 即可。
如果想更新就输入brew update && brew upgrade

3.打开Pycharm

新建项目或者打开项目设置。
找到 Python 解释器一览,如图设置,选择Virtualenv
基础解释器那一览的路径为 /opt/homebrew/bin/python3.xx

不建议使用 Conda 进行管理。

0%