Fiftyville
謎を解決するためのSQLクエリを記述します。
Fiftyvilleの謎
CS50 Duckが盗まれました!Fiftyvilleの町はあなたに盗まれたアヒルの謎を解くように求めています。当局は、泥棒がアヒルを盗み、その後すぐに共犯者の助けを借りて町から飛行機で出たと考えています。目標は、次の項目を特定することです。
- 泥棒は誰か。
- 泥棒はどの都市に逃げたのか。
- 誰が共犯者で、泥棒が逃げるのを助けたのか。
あなたが知っているのは、盗難が2020年7月28日に起きたことと、それがチェンバリン通り (Chamberlin Street) で起きたことだけです。
この謎をどうやって解きますか。Fiftyville当局は、盗難が起きた際の町の記録をいくつか入手し、町周辺のデータのテーブルを含むSQLiteデータベースfiftyville.db
を用意しました。SELECT
クエリを使用してそのテーブルをクエリし、目的のデータにアクセスできます。データベースの情報だけを使って、謎を解くのがあなたの課題です。
始め方
ここでは、この問題をCS50 IDEにダウンロードする方法を説明します。CS 50 IDEにログインし、ターミナルウィンドウで次の各コマンドを実行します。
- すでに存在している
pset7
ディレクトリに移動します。 wget https://cdn.cs50.net/2020/fall/psets/7/fiftyville/fiftyville.zip
を実行して、この問題のディストリビューションを含む (圧縮された) ZIPファイルをダウンロードします。unzip fiftyville.zip
を実行して、そのファイルを解凍します。- そのZIPファイルを削除するには、
rm fiftyville.zip
の後にyes
またはy
を実行します。 ls
を実行します。ZIPファイルの中にfiftyville
というディレクトリがあるはずです。cd fiftyville
を実行して、そのディレクトリに移動します。ls
を実行します。fiftyville.db
ファイル、log.sql
ファイル、およびanswers.txtファイルが表示されます。
仕様
この問題で、謎を解くのと同じくらい重要なのは、謎を解くのに使うプロセスです。log.sql
で、データベースで実行するすべてのSQLクエリのログを保持します。各クエリの上に、なぜそのクエリを実行しているのか、その特定のクエリからどのような情報を取得したいのかを説明するコメント (SQLでは、コメントは--
で始まる行です) を付けます。ログファイル内のコメントを使用して、謎を解決する際の思考プロセスとして追加のメモを追加できます。最終的には、このファイルは泥棒を特定するために使用したプロセスの証拠となります。
謎が解けたら、answers.txt
のそれぞれの行に、泥棒の名前、泥棒が逃げ込んだ町、そして町を脱出するのを手伝った泥棒の共犯者の名前を記入します (ファイル内の既存のテキストを変更したり、ファイルに他の行を追加したりしないでください) 。
最終的に、log.sql
ファイルとanswers.txt
ファイルの両方を送信する必要があります。
ウォークスルー
ヒント
sqlite3 fiftyville.db
を実行して、データベースに対するクエリの実行を開始します。sqlite3
の実行中に.tables
を実行すると、データベース内のすべてのテーブルがリストされます。
sqlite3
の実行中に、schema TABLE_NAME
(TABLE_NAME
はデータベース内のテーブルの名前) を実行すると、テーブルの作成に使用されたCREATE TABLE
コマンドが表示されます。これは、照会する列を知るのに役立ちます。
crime_scene_reports
テーブルから始めると良いでしょう。まず、犯罪の日付と場所に一致する犯罪現場レポートを探します。- 役立つSQL構文については、このSQLキーワードのリファレンスを参照してください。
テスト
check50
を使用して以下を実行し、コードの正確性を評価します。
check50 cs50/problems/2021/x/fiftyville
提出方法
次のコマンドを実行し、GitHubのユーザー名とパスワードを入力してログインします。セキュリティのため、パスワードには実際の文字ではなくアスタリスク (*
) が表示されます。
submit50 cs50/problems/2021/x/fiftyville
SQL Cityの別のケースに触発されました。