跳转至

Lab 1:文本统计工具

题目描述

实现一个文本统计工具。从标准输入读入全部内容,输出四项统计结果。输出格式固定为四行,标签后跟一个冒号和一个空格:

lines: <行数>
words: <词数>
chars: <字符数>
longest: <最长一行的长度>

四项的含义:

含义
lines 行数。输入以换行符结尾时不多算一行;不以换行符结尾时最后一行也要算;空输入为 0
words 词数。按空白字符分隔,连续多个空白只算一次分隔,行首行尾空白不产生空词
chars 全部行的字符数之和,不计换行符
longest 最长一行的长度,同样不计换行符;空输入为 0

字符数的定义

本题中的「字符数」和「一行的长度」都按 Rust s.chars().count() 的结果计算。Rust 会把 chars() 返回的每一项算作一个字符;这里不按 UTF-8 字节数计算,也不按屏幕上看起来有几个完整图形计算。

例如: 计 1,😀 计 1,🇨🇳 计 2,👨‍👩‍👧‍👦 计 7。换行符始终不计入 charslongest

输出就是上面四行,标签后跟一个冒号和一个空格。

下面列出 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 行 twothree 之间有多个空格,仍然只算一次分隔。第 3 行行首的空格不产生空词,但计入该行长度;如果行尾有空格,也同样计入长度。

样例 3

输入:

你好世界
hello 中文 mixed

输出:

lines: 2
words: 4
chars: 18
longest: 14

第 1 行 你好世界 是 4 个字符。第 2 行 hello 中文 mixed 是 14 个字符,两行共 18 个。

说明

  • 连续的多个空白字符只作为一个分隔符,不产生空词
  • 空行计入行数,但词数为 0
  • 输入完全为空时,四项都输出 0
  • 不使用第三方 crate

完成作业

先完成环境配置

本节假设你已经按环境配置装好 OpenCode 并完成登录。确认这两条命令都有正常输出:

opencode --version
opencode auth list

建立项目

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,请分别导出、检查,并在必要时完成脱敏后全部上传。

提交内容

  1. 在 OJ 上提交你的 .rs 文件
  2. 在网络学堂作业中上传一个或多个已经检查、并在必要时完成脱敏的 Session JSON

格式见环境配置

五组数据分别测试:单行 ASCII、多行含空行和连续空格、含中文和 emoji、空输入、较大规模的混合数据。

评分

项目 分值
五组数据(每组 0.4 分) 2.0
Session 文件完整 0.5
合计 2.5