Lab 1:文本统计工具¶
题目描述¶
实现一个文本统计工具。从标准输入读入全部内容,输出四项统计结果。输出格式固定为四行,标签后跟一个冒号和一个空格:
lines: <行数>
words: <词数>
chars: <字符数>
longest: <最长一行的长度>
四项的含义:
| 项 | 含义 |
|---|---|
lines |
行数。输入以换行符结尾时不多算一行;不以换行符结尾时最后一行也要算;空输入为 0 |
words |
词数。按空白字符分隔,连续多个空白只算一次分隔,行首行尾空白不产生空词 |
chars |
全部行的字符数之和,不计换行符 |
longest |
最长一行的长度,同样不计换行符;空输入为 0 |
字符数的定义
本题中的「字符数」和「一行的长度」都按 Rust s.chars().count() 的结果计算。Rust 会把 chars() 返回的每一项算作一个字符;这里不按 UTF-8 字节数计算,也不按屏幕上看起来有几个完整图形计算。
例如:你 计 1,😀 计 1,🇨🇳 计 2,👨👩👧👦 计 7。换行符始终不计入 chars 或 longest。
输出就是上面四行,标签后跟一个冒号和一个空格。
下面列出 OJ 题面中的三个样例,方便阅读和本地测试。
样例 1¶
输入:
hello world
输出:
lines: 1
words: 2
chars: 11
longest: 11
样例 2¶
输入:
one two three
four five
输出:
lines: 3
words: 5
chars: 27
longest: 16
第 2 行是空行,计入行数但不产生词。第 1 行 two 和 three 之间有多个空格,仍然只算一次分隔。第 3 行行首的空格不产生空词,但计入该行长度;如果行尾有空格,也同样计入长度。
样例 3¶
输入:
你好世界
hello 中文 mixed
输出:
lines: 2
words: 4
chars: 18
longest: 14
第 1 行 你好世界 是 4 个字符。第 2 行 hello 中文 mixed 是 14 个字符,两行共 18 个。
说明¶
- 连续的多个空白字符只作为一个分隔符,不产生空词
- 空行计入行数,但词数为 0
- 输入完全为空时,四项都输出 0
- 不使用第三方 crate
完成作业¶
建立项目¶
cargo new textstat
cd textstat
在项目根目录建一个 AGENTS.md:
# 文本统计工具
## 运行
`cargo run` 后从标准输入读数据。
## 编码要求
- Rust edition 2024
- 不使用第三方 crate
实现初版¶
在项目目录下启动:
opencode
把需求交给它。可以直接贴题面,也可以自己复述。一个可用的起点:
读标准输入的所有行,统计并输出:
lines: 行数
words: 词数(按空白分隔)
chars: 字符数
longest: 最长一行的长度
输出格式就是上面四行,冒号后一个空格。
注意不是一个 prompt 就能解决的,还需要自己进行测试和 review,别把所有内容都丢给 Agent。
导出 Session¶
做完并且通过 OJ 测试之后,可以导出 Session:
opencode session list --format json
opencode export ses_... > session-lab1.json
把 ses_... 换成实际的 Session ID。导出后必须按检查与脱敏说明扫一遍,确认没有 API Key 一类的敏感内容,再按提交要求准备上传。
这一步是第一次做,请完整走一遍那四条扫描命令 —— 后面三个 Lab 都要重复这个流程。
若这个过程涉及多个 Session,请分别导出、检查,并在必要时完成脱敏后全部上传。
提交内容¶
- 在 OJ 上提交你的
.rs文件 - 在网络学堂作业中上传一个或多个已经检查、并在必要时完成脱敏的 Session JSON
格式见环境配置。
五组数据分别测试:单行 ASCII、多行含空行和连续空格、含中文和 emoji、空输入、较大规模的混合数据。
评分¶
| 项目 | 分值 |
|---|---|
| 五组数据(每组 0.4 分) | 2.0 |
| Session 文件完整 | 0.5 |
| 合计 | 2.5 |