Fiftyville

要解决的问题

CS50 鸭子被偷了!Fiftyville 小镇请你来解开鸭子被盗之谜。当局认为,盗贼偷走了鸭子,然后不久之后在共犯的帮助下乘飞机离开了小镇。你的目标是找出:

  • 谁是盗贼,
  • 盗贼逃到了哪个城市,以及
  • 谁是帮助盗贼逃脱的共犯

你只知道盗窃发生在 2025 年 7 月 28 日,并且发生在 Humphrey Street

你将如何着手解开这个谜团?Fiftyville 当局收集了盗窃前后小镇的一些记录,并为你准备了一个 SQLite 数据库 fiftyville.db,其中包含小镇各处数据的表格。你可以使用 SQL SELECT 查询来查询该表,以获取你感兴趣的数据。仅使用数据库中的信息,你的任务就是解开这个谜团。

演示

入门

对于这个问题,你’将使用由 CS50 工作人员提供的数据库。

下载分发代码

登录 cs50.dev, 点击你的终端窗口,然后执行 cd 本身。你应该会发现你的终端窗口的提示符类似于下面所示:

$

接下来执行

wget https://cdn.cs50.net/2026/x/psets/7/fiftyville.zip

从而将一个名为 fiftyville.zip 的 ZIP 文件下载到你的 codespace 中。

然后执行

unzip fiftyville.zip

来创建一个名为 fiftyville 的文件夹。你不再需要这个 ZIP 文件了,所以可以执行

rm fiftyville.zip

and 在提示符下回复 “y” 然后按 Enter 键来删除你下载的 ZIP 文件。

现在输入

cd fiftyville

然后按 Enter 键进入(即打开)该目录。你的提示符现在应该类似于下面这样。

fiftyville/ $

单独执行 ls,你应该会看到一些文件:

answers.txt  fiftyville.db  log.sql

如果你遇到任何问题,请再次按照这些相同的步骤操作,看看能否确定哪里出错了!

规格说明

对于这个问题,与解开谜团本身同样重要的是你用来解开谜团的过程。在 log.sql 中,记录你对数据库运行的所有 SQL 查询。在每个查询的上方,用注释(在 SQL 中,注释是以 -- 开头的任何行)标注每个查询,描述你为什么要运行这个查询和/或你希望从该特定查询中获得什么信息。你可以在日志文件中使用注释来添加关于你在解谜过程中思维过程的额外笔记:最终,该文件应该作为你用来识别盗贼的过程的证据!

在编写查询时,你可能会注意到其中一些可能会变得相当复杂。为了帮助保持查询的可读性,请参阅 sqlstyle.guide 上的良好风格原则。缩进部分可能会特别有帮助!

一旦你解开了谜团,请填写 answers.txt 中的每一行,填上盗贼的名字、盗贼逃到的城市,以及帮助盗贼逃离小镇的共犯的名字。(请确保不要更改文件中的任何现有文本,也不要向文件中添加任何其他行!)

最终,你应该提交你的 log.sqlanswers.txt 文件。

讲解视频

提示

  • 执行 sqlite3 fiftyville.db 开始对数据库运行查询。
    • 在运行 sqlite3 时,执行 .tables 将列出数据库中的所有表。
    • 在运行 sqlite3 时,执行 .schema TABLE_NAME(其中 TABLE_NAME 是数据库中表的名称)将显示用于创建该表的 CREATE TABLE 命令。这对于知道要查询哪些列很有帮助!
  • 你可能会发现从 crime_scene_reports 表开始很有帮助。首先查找与犯罪日期和地点匹配的犯罪现场报告。
  • 请参阅此 SQL 关键字参考以获取一些可能有帮助的 SQL 语法!

如何测试

正确性

check50 cs50/problems/2026/x/fiftyville

如何提交

在终端中执行以下命令提交你的作业,并按提示完成操作。

submit50 cs50/problems/2026/x/fiftyville