0%

2022 年,我所用的语言被评为全球最烂语言。为什么呢?垃圾框架层出不穷,运行环境千差万别,类型错误数量全网第一。

这是事实,无法否认,但开发者们还是蜂拥而来。这语言总会给你一丝希望,vite 也好,next 也罢,但如此近,仿佛触手可及,让人奋不顾身。

这里充斥着网页,而我正是那页面仔!

代码请移步至 GitHub OverflowCat/lanqiao-14-web

凭空消失的 TA

题目

初始代码中的 index.html 在浏览器中并没有显示出来表单组件 myform。考生需要认真检查提供的代码,找出表单消失的原因,并修复掉,最终让表单 “重见天日”。

思路

这题跟 Vue 2 半毛钱关系没有,单纯是 index.html 中没有引用 Element UI 的 js 😅

代码

1
2
3
4
5
6
7
8
diff --git 凭空消失的TA/index.html
@@ -8,6 +8,7 @@ <title>凭空消失的 TA</title>
<script src="./js/vue.min.js"></script>
<script src="./js/http-vue-loader.js"></script>
+ <script src="./element-ui-2.15.10/index.js"></script>
<!-- 引入 element-ui 样式 -->
<link rel="stylesheet" href="./element-ui-2.15.10/index.css" />
</head>

用户名片

思路

The year is 2049...

All websites use Tailwind, there are only 69 people remaining that know how to write custom CSS.

These 69 people have to center divs to save the world.

They are our only hope.

(This is my pitch to Netflix for an upcoming movie)

Credit: TheJackForge

In case you still do not know how to center divs horizontally & vertically, refer to 11 Ways to Center Div or Text in Div in CSS or CSS-水平居中、垂直居中、水平垂直居中.

代码

效果图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
.avatar,
.card {
position: absolute;
left: θ;
top: θ;
bottom: 0;
right: θ;
margin: auto;
}

.user-card {
width: 150px;
height: 100%;
position: relative;
float: left;
display: flex;
justify-content: center;
}

芝麻开门

题目

找到 index.js 文件中的 mPrompt 函数,完成函数中的 TODO 部分。

  1. 点击 “点击弹出对话框,输入咒语” 按钮会调用 mPrompt 函数,mPrompt 调用后页面显示对话框。mPrompt 函数必须返回一个 promise 对象。
  2. 在对话框中的输入框中输入文字后,点击确认按钮,对话框消失, promise 返回成功,promise 成功的值为输入的值。
  3. 只有当成功的值为 “芝麻开门” 时门自动打开(已实现)。
  4. 点击取消,对话框消失,promise 返回失败,失败的值为 false
  5. 对话框的显示隐藏请使用 DOM 节点的添加删除实现。

思路

本题考察 Promise。在返回的 Promise 中添加 onclick 事件,并在函数中调用 Promise 的参数。

代码

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
const incantations = "芝麻开门";
function init(el) {
document.querySelector(".wrapper .btn").addEventListener("click", () => {
mPrompt()
.then((res) => {
if (res === incantations) {
document
.querySelectorAll("#door .doors")[0]
.classList.add("door-left");
document
.querySelectorAll("#door .doors")[1]
.classList.add("door-right");
}
})
.catch((err) => {
console.log(err);
});
});
}
/**
* @description: 调用函数,开启弹窗,记录输入框的内容,并通过 promise 异步返回输入框中的内容
* @return {Promise}
*/
function mPrompt() {
// 弹窗必须使用以下结构 template 保存的是弹窗的结构字符串,可以先转化为 DOM 再通过 appendChild 方式插入到 body 中
const template = `
<div class="modal">
<div class="message-box">
<div class="message-header">请输入咒语</div>
<div class="message-body">
<input type="text">
</div>
<div class="message-footer">
<button class="btn btn-small" id='cancel'>取消</button>
<button class="btn btn-small btn-primary" id='confirm'>确定</button>
</div>
</div>
</div>
`;
const div = document.createElement("div");
// TODO:待补充代码
div.innerHTML = template;
document.body.appendChild(div);
const hide = () => div.remove();
return new Promise(
(resolve, reject) => {
div.querySelector("button#cancel").onclick = e => {
hide();
reject(false);
}
div.querySelector("button#confirm").onclick = e => {
resolve(div.querySelector("input").value);
}
hide();
}
);
}

宝贵的一票

题目

完成 index.html 文件中的 TODO 部分。 1. 点击添加选项,页面中新增一个选项。选项前文字按照:选项 1,选项 2,选项 3 ...... 顺序排列,当页面中的选项大于 2 个时,选项后面跟随删除按钮(即 x 图标)。带有删除图标的选项 DOM 结构如下:

1
2
3
4
5
6
7
8
9
10
<div>
<label>选项1</label>
<div>
<input type="text" />
</div>
<div>
<!-- 删除图标 -->
<img src="./images/x.svg" alt="" />
</div>
</div>
2. 点击删除按钮,删除当前选项,并且选项前文字按照:选项 1,选项 2,选项 3 ...... 顺序排列,当选项数量小于等于 2 个时,选项后面无删除按钮。

思路

这题要求点删除按钮的时候删除的是对应的文本框,并且后面的选项序号需要再次排序。注意如果增加了选项的话,选项1选项2 也是需要删除按钮的。直接 querySelector 改内容就好了,注意 template 的结构。

代码

./宝贵的一票/index.html

粒粒皆辛苦

介绍

俗话说 “民以食为天”,粮食的收成直接影响着民生问题,通过对农作物产量的统计数据也能分析出诸多实际问题。

接下来就让我们使用 ECharts 图表,完成 X 市近五年来的农作物产量的统计图吧~

准备

本题已经内置了初始代码,打开实验环境,目录结构如下:

1
2
3
4
5
├── data.json
├── index.html
└── js
├── axios.min.js
└── echarts.min.js

其中:

  • index.html 是主页面。
  • js/echarts.min.js 是 ECharts 文件。
  • js/axios.min.js 是 axios 文件。
  • data.json 是对应年份的粮食产量数据,单位为万吨。

选中 index.html 右键启动 Web Server 服务(Open with Live Server),让项目运行起来。

接着,打开环境右侧的【Web 服务】,就可以在浏览器中看到如下效果:

目标

请完成 index.html 文件中的 TODO 部分。

  1. 完成数据请求(数据来源 ./data.json)。
  2. data.json 中的数据中英文对照如下:
    英文名称 中文名称
    wheat 小麦
    soybean 大豆
    potato 马铃薯
    corn 玉米
  3. 在页面的折线图和饼形图中正确显示粮食产量数据。其中折线图为五年数据,饼图只显示 2022 年数据。

思路

使用 myChart.setOption() 更新数据。EChart 会检测 diff。这个框架可以看一看 菜鸟教程

绝美宋词

题目

请使用 Vue ,完成 index.html 文件中的 TODO 部分。

  1. 完成数据请求(数据来源 ./data.json),data.json 是宋词数据,poetry_content 表示词句,title 表示词牌名,author 表示词人。
  2. 在输入框输入关键词时在 ulclass = suggestions)的元素中实时显示词牌名、词句、词人中包含关键词的完整词句(包含词牌名、词人)列表,当关键词为空或者匹配不到时 ulclass = suggestions)元素的子节点为空。完整词句的 DOM 结构按照如下规定显示:
1
2
3
4
<li>
<span>词句</span>
<span>词牌名 - 词人</span>
</li>

例:

1
2
3
4
5
6
<li>
<span
>常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭</span
>
<span>如梦令 - 李清照</span>
</li>
  1. 高亮匹配到的所有词句中的关键词。即使用 <span></span> 标签包裹所有关键词。

例:(关键词:雨)

1
2
3
4
5
6
7
<li>
<span
>寒蝉凄切,对长亭晚,骤<span>雨</span
>初歇。都门帐饮无绪,方留恋处,兰舟催发。执手相看泪眼,竟无语凝噎。念去去千里烟波,暮霭沉沉楚天阔。多情自古伤离别,更那堪冷落清秋节。今宵酒醒何处,杨柳岸晓风残月。此去经年,应是良辰美景虚设。便纵有千种风情,更与何人说</span
>
<span><span></span>霖铃 - 柳永</span>
</li>

注意本题要求的是实时显示,即输入完成的同时显示结果,非失去焦点显示

思路

这是我第一次用 Vue。在 Vue 2 中把 <input/>value 绑定到变量并且在 input 更新时调用函数的方法:

1
2
3
4
5
6
7
8
<input
type="text"
id="search"
class="search"
placeholder="词牌名 词句 词人"
+ v-model="query"
+ @input="handleInput"
/>

根据文档,@input 会过滤掉 IME 的 buffer。题目给的效果图好像并没有这个行为,不过也过了,毕竟不知评测机制,并且没人会写带 IME 的 test。

代码

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
@@ -14,8 +14,12 @@
<h1 style="text-align: center">输入关键字,找一首词</h1>
<!-- TODO:待补充代码 -->
<div class="search-form">
- <input type="text" id="search" class="search" placeholder="词牌名 词句 词人" />
+ <input type="text" id="search" class="search" placeholder="词牌名 词句 词人" v-model="query" @input="handleInput" />
<ul class="suggestions">
+ <li v-for="poem in filtered">
+ <span class="poet" v-html="poem.poetry_content"></span>
+ <span class="title" v-html="poem.title"></span>
+ </li>
</ul>
</div>
</div>
@@ -23,6 +27,40 @@
let vm = new Vue({
el: '#app',
// TODO:待补充代码
+ data: {
+ query: '',
+ poems: [],
+ filtered: []
+ },
+ created() {
+ this.queryData()
+ },
+ methods: {
+ highlight(text) {
+ return `<span class="highlight">${text}</span>`;
+ },
+ queryData() {
+ axios.get('./data.json').then(res => {
+ this.poems = res.data;
+ })
+ },
+ handleInput(e) {
+ if (this.query) this.filterData(this.query);
+ else this.filterData("哈哈哈没有东西!!")
+ },
+ filterData(keyword) {
+ this.filtered = this.poems.filter(
+ x => x.poetry_content.includes(keyword)
+ || x.author.includes(keyword)
+ || x.title.includes(keyword)
+ ).map(x => {
+ return {
+ poetry_content: x.poetry_content.replaceAll(keyword, this.highlight(keyword)),
+ title: `${x.title} - ${x.author}`.replaceAll(keyword, this.highlight(keyword)),
+ }
+ })
+ }
+ }
})
</script>
</body>

资讯接口

题目

介绍

随着技术的发展,很多前端工程师已经不满足于只做诸如页面布局和交互这些开发工作了,很多人将目光逐渐转向了 “大前端” 范围,其中就包括不需要依赖后端提供接口自己就可以使用 node.js 编写一个后端接口服务。

下面就让我们也来使用 node.js 完成一个新闻资讯接口吧。

目标

  1. 通过在 app.js 书写代码,创建一个服务器,使服务在 8080 端口运行。
  2. 访问 /news 返回资讯数据,访问其他任意路径均返回字符串 404
Url 请求方式 参数 响应结果
news GET 显示资讯数据

数据需要设置为 utf8 格式,资讯数据格式如下:

1
2
3
4
5
6
7
8
9
10
[
{
"channelId": "5572a108b3cdc86cf39001cd",
"name": "国内焦点"
},
{
"channelId": "5572a108b3cdc86cf39001ce",
"name": "国际焦点"
}
]

设置 utf8 格式代码:

1
res.setHeader("Content-type", "text/html;charset=utf8");
  1. 通过 node app.js 运行代码,使服务处于运行状态,点击右侧 【web 服务】,页面上显示访问域名 +'/news' 返回资讯数据。

思路

使用 http.createServer()。注意一下设置 Content-type 的方式。

代码

见对应目录。

平地起高楼

题目

相当于把 {id: number, parent_id: number: name}[] 嵌套起来返回 {id: number, parent_id: number: name, children: self[]}

思路

维护一个 pid => id[] 的 Map,并把原数组转成以 id 为 key 的 Map 即可。

收快递了

题目

相当于在 {id: number, parent_id: number: name, children: self[]} 中找到目标。

思路

递归即可。最后这两道标为了「困难」的题目其实就是不会 TLE 的算法题,没啥难度。倒是好久没写 JS 老是类型错误,尤其是前面 宝贵的一票 parent 就没类型了,比较讨厌。📃

在 AutoCAD 2014 中,有两种标注公差的方式。

通过「特性」窗格

在已有的标注上右键,打开「特性」窗格。

右键菜单
右键菜单
公差
公差

需要将「显示公差」设为「极限偏差」。注意选择精度。

「公差消去前导零」为「是」会省略小数点前面的 0。

开启公差消去前导零
开启公差消去前导零

「公差消去后续零」为「否」会填充 0。

关闭公差消去后续零
关闭公差消去后续零

通过「堆叠」

输入 符号 值 上偏差/下偏差,然后选中 上偏差/下偏差

在选中的文本中有 / 时右键菜单会多出一个「堆叠」的选项。

或者,也可以点选 TEXTEDIT 工具栏中的图标。

图标
图标

再次右键堆叠后的文字,打开「堆叠特性」。

堆叠特性
堆叠特性

「样式」选择「公差」以消除分数线。

堆叠特性
堆叠特性

结果如下。

以上。🅰️

题目

今天的力扣(LCUS)每日挑战是 587. 安装栅栏

在一个二维的花园中,有一些用 \((x, y)\) 坐标表示的树.由于安装费用十分昂贵,你的任务是先用最短的绳子围起所有的树.只有当所有的树都被绳子包围时,花园才能围好栅栏.你需要找到正好位于栅栏边界上的树的坐标.

知识点

其实质是求若干点组成的二维 凸包(convex hull).常用的求法有 Graham 扫描法(Graham's scan)和 Andrew 算法,本文提供了一个由 Rust 实现的 Graham 扫描法.

思路

算法的步骤如下:

  1. 若点个数少于 3 个,则直接返回输入.否则按如下方法求解.
  2. 首先,找出纵坐标最小的点.若有多个,则选横坐标最小的点.以该点建立极坐标系.
  3. 此时,将所有的点按照极角的大小升序排列,若有极角相同的,则再按该点到极点距离升序排列.
  4. 然后维护一个栈.先将排列好的点的前两个入栈,然后对于其后的每一个点 \(C\),记栈中最后一个点为 \(B\),倒数第二个点为 \(A\),若以 \(A\) 为圆心,\(\overrightarrow{AC}\)\(\overrightarrow{AB}\) 顺时针方向,则说明为凹,需要出栈一次,重复上述步骤,直至\(\overrightarrow{AC}\)\(\overrightarrow{AB}\) 重合,或前者在后者逆时针方向.此时再将 C 点入栈.
  5. 处理完所有的点后,需要再找出不在栈中但在栈的最后一个点与栈的第一个点构成的线段上的点.

示例

输入数据

1
[[3,0],[4,0],[5,0],[6,1],[7,2],[7,3],[7,4],[6,5],[5,5],[4,5],[3,5],[2,5],[1,4],[1,3],[1,2],[2,1],[4,2],[0,3]]
1
2
3
4
5
6
- - * * * * * -
- * - - - - - *
* * - - - - - *
- * - - * - - *
- - * - - - * -
- - - * * * - -

预期结果

1
[[4,5],[2,5],[6,1],[3,5],[2,1],[1,4],[1,2],[7,4],[7,3],[7,2],[3,0],[0,3],[5,0],[5,5],[4,0],[6,5]]
1
2
3
4
5
6
- - * * * * * -
- * - - - - - *
* - - - - - - *
- * - - - - - *
- - * - - - * -
- - - * - * - -

错误结果

若没有第 5 步,则缺少两点 \((1, 2), (2, 1)\) \(\small{\mathrm{(0-indexed)}}\)

1
[[7,3],[5,0],[7,4],[4,5],[1,4],[4,0],[5,5],[6,1],[3,0],[6,5],[2,5],[7,2],[0,3],[3,5]]
1
2
3
4
5
6
- - * * * * * -
- * - - - - - *
* - - - - - - *
- - - - - - - *
- - - - - - * -
- - - * * * - -

计算

需要用到一些向量的性质.

判断逆时针

两向量叉积为正,则 \(\overrightarrow{AC}\)\(\overrightarrow{AB}\) 的逆时针方向.

判断点在线段上

记线段为 \(AB\),点为 \(P\),保证 \(A\)\(B\)\(P\) 三点不重合.若 \(\overrightarrow{AP}\cdot\overrightarrow{BP} = -|AP|\cdot|BP|\),则点在线段上.

代码

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
use std::{cmp::Ordering::*, collections::HashSet};
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
struct Tree(i32, i32);
impl Solution {
#[inline]
fn cross_product(x_1: i32, y_1: i32, x_2: i32, y_2: i32) -> i32 {
x_1 * y_2 - x_2 * y_1
}

pub fn outer_trees(trees: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
if trees.len() < 3 {
return trees;
}
let mut init = (114514, 114514);
trees.iter().for_each(|t| match t[1].cmp(&init.1) {
Less => {
init = (t[0], t[1]);
}
Equal => {
init.0 = init.0.min(t[0]);
}
_ => {}
});
// println!("左下角的点是 {:?}", init);
let mut trees: Vec<Tree> = trees
.into_iter()
.map(|t| Tree(t[0] - init.0, t[1] - init.1))
// 这里以左下角的点为 (0, 0)
.collect();
trees.sort_by(
|a, b| match { 0.cmp(&Self::cross_product(a.0, a.1, b.0, b.1)) } {
Equal => (a.0.pow(2) + a.1.pow(2)).cmp(&(b.0.pow(2) + b.1.pow(2))),
res => res,
},
);
let mut stack = Vec::new();
stack.push(trees[0]);
stack.push(trees[1]);
for t in trees.iter().skip(2) {
while {
let length = stack.len();
length > 1 && {
let (a, b) = (stack[stack.len() - 2], stack[stack.len() - 1]);
let x_1 = t.0 - a.0;
let y_1 = t.1 - a.1;
let x_2 = b.0 - a.0;
let y_2 = b.1 - a.1;
Self::cross_product(x_1, y_1, x_2, y_2) > 0
}
} {
stack.pop().unwrap();
}
stack.push(t.clone());
}
let mut trees: HashSet<_> = trees.into_iter().collect();
for x in &stack {
trees.remove(x);
}
let Tree(p1x, p1y) = stack[stack.len() - 1];
let Tree(p2x, p2y) = stack[0];
let extra: Vec<Tree> = trees // 栈中最后一个点与栈中第一个点构成的线段上的点
.into_iter()
.filter_map(|a| {
let Tree(p_x, p_y) = a;
let vec1 = (p_x - p1x, p_y - p1y);
let vec2 = (p_x - p2x, p_y - p2y);
if (vec1.0 * vec2.0 + vec1.1 * vec2.1).pow(2)
== (vec1.0.pow(2) + vec1.1.pow(2)) * (vec2.0.pow(2) + vec2.1.pow(2))
{
Some(a)
} else {
None
}
})
.collect();
stack
.into_iter()
.chain(extra.into_iter())
.map(|x| vec![x.0 + init.0, x.1 + init.1])
.collect()
}
}

// 以下是测试部分
struct Solution;
fn main() {
let res: HashSet<Vec<i32>> = HashSet::from_iter(
Solution::outer_trees(vec![vec![1, 1], vec![2, 2],
vec![2, 0], vec![2, 4], vec![3, 3], vec![4, 2]]).into_iter(),
);
assert_eq!(
res,
HashSet::from_iter(
vec![vec![1, 1], vec![2, 0], vec![4, 2],
vec![3, 3], vec![2, 4]].into_iter()
)
);

let res: HashSet<Vec<i32>> = HashSet::from_iter(Solution::outer_trees(vec![
vec![3, 0], vec![4, 0], vec![5, 0], vec![6, 1], vec![7, 2], vec![7, 3],
vec![7, 4], vec![6, 5], vec![5, 5], vec![4, 5], vec![3, 5], vec![2, 5],
vec![1, 4], vec![1, 3], vec![1, 2], vec![2, 1], vec![4, 2], vec![0, 3]
]));
assert_eq!(
res, HashSet::from_iter(
vec![vec![4, 5], vec![2, 5], vec![6, 1], vec![3, 5], vec![2, 1],
vec![1, 4], vec![1, 2], vec![7, 4], vec![7, 3], vec![7, 2], vec![3, 0],
vec![0, 3], vec![5, 0], vec![5, 5], vec![4, 0], vec![6, 5]].into_iter()
)
);
}

以上.🌲

静距和形心

定义

\(S_z\) 表示截面到 \(z\) 轴的静距, \(y_C\) 表示形心的 \(y\) 轴坐标.

静距的量纲为长度的 3 次方.

截面对某个轴线的静距是微元面积与其到该轴线距离的乘积的积分,即

\[S_y=\int\limits_{A} z\mathrm d A\]

\[S_z=\int\limits_{A} y\mathrm d A\]

定理

合力矩定理可得

\[z_C=\frac{S_y}{A}, y_C=\frac{S_z}{A}.\]

故我们有

\[S_y=z_CA, S_z=y_CA.\]

如果我们选择的坐标轴穿过了形心,则其称作形心轴.此时 \(z_C\)\(y_C\)\(0\) .又 \(A\) 不为 \(0\) ,所以 \(S_y\)\(S_z\)\(0\).即有定理:若坐标轴是形心轴,则截面对其静矩为 \(0\).其逆命题也成立.

计算

若界面形状由多个基本图形组成,则形心坐标为各图形静距之和与各图形面积之和的比值.

实际计算中,可以记住基本图形的公式,无需通过积分求.

矩形的静距

矩形的静距为长、宽、矩形形心到轴距离三者的乘积:

\[S_z=bh\cdot\frac 1 2 h=\frac 1 2 bh^2.\]

惯性矩

定义

惯性矩的量纲为长度的 4 次方.

截面对某个轴线的惯性矩是微元面积与其到该轴线距离 2 次方乘积的积分,即

\[I_{z}=\int\limits_{A} y^{2} \mathrm{~d} A\]

\[I_{y}=\int\limits_{A} z^{2} \mathrm{~d} A\]

计算

矩形的惯性矩

\(z\)

\[I_z=\frac{bh^3}{3}\]

其中, \(b\) 为宽, \(h\) 为高.

对形心轴

\[I_z=\frac{bh^3}{12}\]

圆的惯性矩

对形心轴

\[I_z = \frac{\pi D^4}{64}\]

圆环的惯性矩

\[I_z = \frac{\pi D^4(1-{\frac d D}^4)}{64}\]

其中, \(d\) 为内环直径, \(D\) 为外环直径.

三角形的惯性矩

\[I_z = \frac{bh^3}{36}\]

其中, \(b\) 为底边长, \(h\) 为高.

定理

平行轴定理,对转动惯量,我们有

\[I_{z'}=I_C+Md^2\]

其中, \(M\) 为刚体质量.

对惯性矩,我们也有

\[I_z = I_x + Ad^2\]

极惯性矩

定义

截面对于一个轴的极惯性矩,又称截面二次极矩,是截面上微元面积与其到坐标原点距离 2 次方乘积的积分,即

\[I_p = \int\limits_A\rho^2\mathrm d A\]

其中, \(\rho\) 为微元距轴的距离.

\[I_p = \int\limits_A\rho^2\mathrm d A=\int\limits_A(z^2+y^2)\mathrm d A=I_y+I_z.\]

以上.🪵

胡桃沢 · サタニキア · マクドウェル在频道「心惊报」上 投稿

duolingo-question
duolingo-question

虽然多邻国的「通过中文学…」的课程中,句子翻译接受的答案数量与英文课程相比来说少得可怜,但是「はい、元気です」这一句话在给定的词汇下,的确只能翻译成「是的,我很好」而不是「是,我好的[sic]很」。首先,在形容词後应该用「得 + 副词」修饰程度,而非「的」。粤语没有这个问题,因为「dik1」「dak1」「dei6」三个字的发音不同。其次,原句中没有出现程度,在这一句式中,「很」並不表示程度。比如 这篇文章 中就提到:

今天很热。她很高兴。我的猫很聪明。英语很难。 在这些句子里,形容词:“热”、“高兴”、“聪明”、“难”前都有一个副词“很”,这个“很”字,不总是代表“非常”或“及[sic]其”的意思,而只是语气的需要。

因为你毕竟不能说「今天是热的」「她是高兴的」「我的猫是聪明的」「英语是难的」「我是好的」,所以你只能借助「很」「挺」这几个词来连接主语和形容词。

王力的《中国现代语法》中也说:

试拿“两家很和厚”和“两家和厚得很”相比较,则见后者比前者更有力量,这是因为特别着重“很”字,把它升为次系谓语的缘故。

尽管如此,我都不推荐你在多邻国通过中文(简体)学任何非汉语语言。

本文译自德国驻美大使馆 2011 年 10 月 28 日的文章:Word of the Week: Eierlegende Wollmilchsau。封面图片:Eierlegende Wollmilchsau, German for "egg-laying wool-milk-sow" by de:User:PixelrauschCC BY-SA 2.0

想象这样一幅画面:一头猪,浑身长着蓬松的毛,会下蛋,会产奶。这就是本周的关键词——Eierlegende Wollmilchsau,直译为「生蛋的 羊毛-牛奶-母猪」。虽然这种小动物可能听起来有点像自然界的怪胎,但它确是每个农民的梦想——结合了鸡(下蛋)、羊(产毛)、牛(产奶)和猪(做成熏肉)的品质的完美农场动物。它味道鲜美,还可以生产所有的日常必需品:它是一种没有缺点的动物。不消说,这种生物并不存在。

虽然这样一种可爱、美味又有用的生物可能不存在,但它确实存在于比喻中。其比喻意义是试图做多种工作的工具或人。当然,找到像这样的一个全能的工具或人,几乎和找到神话中的生物一样难。

是故如今该词语大多被用于描述一些无法实现的理想。这证明德国人不仅具有精巧的讽刺意识,而且比人们认为的更有创造力。一个完美而又讽刺的使用例是,招聘广告上的要求如此之多、如此之泛,以至于没有一个人会满足所有这些要求。

不过,随着新技术的惊人发展,完全可以想象这个词会有新的含义。过去,最接近这个词的东西是瑞士军刀,但看起来这个词将能出色地形容新一代的智能机。至于手机公司是否乐意他们的产品被描述为「下蛋的毛奶猪」,那就又是另一回事了。🥚


John Gruber 在其博客 Daring Fireball 中 引用了这篇文章并评论道

如果「X」不成功的话,这会是 Elon Musk 的「Everything App」的一个良好的暂定名称(译注:原文为 working name)。
感谢 Maximilian Mackh 提供的链接。(还有感谢德国大使馆将这一「春梦」写成一篇有趣的文章。)


2022 年 10 月 8 日。点此在 IPFS 上查看

北京高考英语、生物和语文注重考查逻辑。

这是我在江苏未曾想到的。以英语为例,就是说即使译成中文,明明白白地知道作者在说什么,你也不知道依逻辑推断出的正确的答案。我第一次做北京的一篇简单的阅读,四道选择居然全部错误:你无法在文章中找到完全匹配的答案。命题人试图通过「同义替换」来考察,然而他们的想法天马行空而深刻奇妙,替换后的内容与原文是否一致,全仗那标准答案说了算。

怎么能说是有逻辑呢?

无独有偶,语文的非连续性文本阅读也如此,不过稍为简单一些。这样一来,我在阅读文章的时候会想,我理解的作者那乖张的说话口气不是叙述时的自然流露,而是为了印证中心论点,并且试图脑控读者。

而生物的逻辑体现在实验题上。从描述实验现象到写出推断过程,从填空到画示意图,考察生物基础知识的着实很少,考察逻辑「关系」的很多。大抵就是让看看两者之间的关系、三者之间上下游的调控关系、四者之间是否有协同作用… 不一而足。而生物老师的讲课语音语调都没有突出重点,让所有上伊的课的人都昏昏欲睡。

至于数学,压轴题固然不是我所能做出来的,顶多第二问能写上一些。主要是过于创新,导致平时训练的内容和考察的内容没有什么关系,感觉练了考试也只能听天由命——这在任何学科上都是常有的现象。而且简单的题过于简单,不太适合咱这个分数段上的。而且平时模拟考试也很少,周测只有短短的 45 分钟,实在找不到感觉。

数学老师常说,《考纲》「要求考生克服紧张情绪,以平和的心态参加考试,合理支配考试时间,以实事求是的科学态度解答试题,树立战胜困难的信心,体现锲而不舍的精神」。就好像你深知你练习的内容可能跟高考毫无关联,深知你高考的时候该错的还是会错,深知你要用你那并不娴熟的逻辑推理去做那并没有什么逻辑道理的题,但是你依然满怀信心地参加考试一样。📝


2021 年 5 月 7 日 9 时于纯纯写作。

昨天早上偶然听到一个人谈论他在付费自习室的体验。

自习室有单独的包间,价格 40 元每小时,然而因为使用的人太少了,租用时间长后就会有巨大优惠。在普通的位置上,有隔着隔板面对面的位置。他对面的人是有些 abnormal,没有按规矩每天离开时把自己的物品拿走,总是穿着人大附中的校服,在桌上贴了个写着「700」(注:指高考分数)的纸张,并且读《红楼梦》。

这才想起コロナ涌现伊始的那段时间,扬州市图书馆关门大吉。之后的几月是限流,每日数百人,最多同时进入若干人。因为很早就取消了借书不还的期限,所以还书并不是一件需要着急的事,更何况二层图书馆门外还有自动还书机,限流似乎是合情合理的事。于是图书馆学习无望。即使到了北京来,大部分图书馆还是要预约。コロナ!!把多少人的生活!!!都毁了!?!?!?我不得而知。


在自习室学习有效吗?《考研中年人,走进付费自习室》中提及的理由是家里太吵不适合学习之类的。换个环境的确有用,但是一切都是稍近益狎,久了注意力依然会减弱。不过花钱应该会效率很高;可是我看了看支付宝口碑上的价格,除了一开始的几个小时 1 元优惠,即便是包日也是很贵的,纵然值得,想必破费的感觉也不好受。

文章里面还有提到有特色的暗室自习室:

我搜了搜,大概长这样?

这家自习室主打暗室自习,突出一个「暗」字。一推开门,就跟钻进黑暗隧道差不多。只在有人学习的地方会亮起一盏黄色的灯,像是隧道尽头的亮光。 这一点亮光隐喻着「希望」。

虽然听起来奇出怪样,但是作为 ADHD,确实常有在夜已央时在暗淡的黄色护眼灯光下体会到 random bursts of energy or focus for no reason(r/ADHD) 而一门心思做题上瘾的时候。

于是更加怀念且贪恋起扬州的好。偌大的图书馆高峰时也不会坐得特别满;二十几个城市书房遍布于风景优美的人口众多处。明月湖(维基百科)畔便有两个,一个是商城附近,人较多;另一个紧邻图书馆,以俟闭馆后的读者。常常周末在那里写作业,即使周末时间紧迫也会赶过去。学校旁边是风景区,那边的城市书房在二楼(?),房间挺高,装饰也好看,只是不愿见到我们学校的学生和无所事事的家长。📝


2021 年 3 月 13 日晚于 Notion,页面标题是「自习室」。

今天是圣诞节。学校门口在一周前就摆了个圣诞树🎄。每层内还另有一棵,挂着所有人写的「新年愿望」。

还记得 17 年的那场大雪,盆景园、护城河畔,静谧的雪里心情虽不舒畅,但却也能有暂时的慰藉。当时的焦虑大部分现在已经随风而逝,但谁又能想到今天的境遇呢?

18 年的圣诞好像在听「Christmas」(网易云音乐)。应该是自从那年,能在公共场合看到圣诞树已是一件十分稀有的事情。我在这意外的拥抱中,也懒散而且舒适,从白天以至初夜的焦虑,全给这圣诞节的空气一扫而空了,只觉得天龙人们歆享了牲醴和香烟,都醉醺醺的在空中蹒跚,预备给(如今再也不是)小镇的做题家们以无限的幸福。📝

今天做听力的时候,有第四道题的对话是一个人在广告上看到了修车的广告,到这里来修车。选项问这是什么地方:a parking lot, a factory or a garage。正确答案是 garage,因为有一项意思是汽车修理间。

🔑 [countable] a place where vehicles are repaired and where you can buy a car or buy petrol/gas and oil (兼营汽车销售、修理及加油的)汽车修理厂

考熟词生义总比奇怪题目不知所云要好。

PS: 今天再去机房考试,学校已经 ban 了网络连接。发现进入考试后可以通过极域电子教室的浮动面板调出资源管理器,然后新建 .rtf 文件,用写字板打开,按 PrtScr 截图后粘贴用来应付听后转述。📝


写于 Telegraph,2020 年 10 月 23 日。如果你看不到图片,说明你无法访问 telegra.ph