commit 30e335789a02925ae7e3ac4556787bb325a38982 Author: bot50 Date: Thu Mar 28 20:29:41 2024 +0000 kukemuna-cs50/problems/2024/x/fiftyville@20240328T202941.876162621Z diff --git a/answers.txt b/answers.txt new file mode 100644 index 0000000..ea760c3 --- /dev/null +++ b/answers.txt @@ -0,0 +1,3 @@ +The THIEF is: Bruce +The city the thief ESCAPED TO: New York City +The ACCOMPLICE is: Robin diff --git a/log.sql b/log.sql new file mode 100644 index 0000000..00caca2 --- /dev/null +++ b/log.sql @@ -0,0 +1,295 @@ +-- Keep a log of any SQL queries you execute as you solve the mystery. + +-- Get overview of available data (tables) +.tables + + -- airports crime_scene_reports people + -- atm_transactions flights phone_calls + -- bakery_security_logs interviews + -- bank_accounts passengers + + +-- Get structure of crime_scene_reports +.schema crime_scene_reports + + -- id INTEGER, + -- year INTEGER, + -- month INTEGER, + -- day INTEGER, + -- street TEXT, + -- description TEXT, + -- PRIMARY KEY(id) + +-- All you know is that the theft took place on July 28, 2023 and that it took place on Humphrey Street. +SELECT description FROM crime_scene_reports +WHERE year = 2023 AND month = 7 AND day = 28 +AND street = 'Humphrey Street'; + + -- Theft of the CS50 duck took place at 10:15am at the Humphrey Street bakery. Interviews were conducted today with three witnesses who were present at the time – + -- each of their interview transcripts mentions the bakery. + + -- Littering took place at 16:36. No known witnesses. + + +-- Get structure of interviews +.schema interviews + + -- id INTEGER, + -- name TEXT, + -- year INTEGER, + -- month INTEGER, + -- day INTEGER, + -- transcript TEXT, + -- PRIMARY KEY(id) + + +-- Get transcripts from the same day with mentions to bakery +SELECT transcript FROM interviews +WHERE year = 2023 AND month = 7 AND day = 28 +AND transcript LIKE '%bakery%'; + + -- Sometime within ten minutes of the theft, I saw the thief get into a car in the bakery parking lot and drive away. If you have security footage from the bakery parking lot, + -- you might want to look for cars that left the parking lot in that time frame. + + -- I don't know the thief's name, but it was someone I recognized. Earlier this morning, before I arrived at Emma's bakery, I was walking by the ATM on Leggett Street + -- and saw the thief there withdrawing some money. + + -- As the thief was leaving the bakery, they called someone who talked to them for less than a minute. In the call, I heard the thief say that they were planning to take + -- the earliest flight out of Fiftyville tomorrow. The thief then asked the person on the other end of the phone to purchase the flight ticket. + + +-- Get structure of bakery_security_logs +.schema bakery_security_logs + + -- id INTEGER, + -- year INTEGER, + -- month INTEGER, + -- day INTEGER, + -- hour INTEGER, + -- minute INTEGER, + -- activity TEXT, + -- license_plate TEXT, + -- PRIMARY KEY(id) + +-- Get licence plates of leaving customers from within 10 minutes of theft (10:15am) +SELECT license_plate FROM bakery_security_logs +WHERE year = 2023 AND month = 7 AND day = 28 AND hour = 10 AND minute BETWEEN 5 AND 25 +AND activity = 'exit'; + + -- 5P2BI95 + -- 94KL13X + -- 6P58WS2 + -- 4328GD8 + -- G412CB7 + -- L93JTIZ + -- 322W7JE + -- 0NTHK55 + + +-- Get structure of atm_transactions +.schema atm_transactions + + -- id INTEGER, + -- account_number INTEGER, + -- year INTEGER, + -- month INTEGER, + -- day INTEGER, + -- atm_location TEXT, + -- transaction_type TEXT, + -- amount INTEGER, + -- PRIMARY KEY(id) + +-- Get account numbers of withdrawals from Leggett Street ATM on the day of theft +SELECT account_number FROM atm_transactions +WHERE year = 2023 AND month = 7 AND day = 28 +AND atm_location = 'Leggett Street' AND transaction_type = 'withdraw'; + + -- 28500762 + -- 28296815 + -- 76054385 + -- 49610011 + -- 16153065 + -- 25506511 + -- 81061156 + -- 26013199 + + +-- Get structure of phone_calls +.schema phone_calls + + -- id INTEGER, + -- caller TEXT, + -- receiver TEXT, + -- year INTEGER, + -- month INTEGER, + -- day INTEGER, + -- duration INTEGER, + -- PRIMARY KEY(id) + +-- Get caller and receiver of calls with duration under a minute +SELECT caller FROM phone_calls +WHERE year = 2023 AND month = 7 AND day = 28 +AND duration < 60; + + -- Caller | Receiver + -- (130) 555-0289 | (996) 555-8899 + -- (499) 555-9472 | (892) 555-8872 + -- (367) 555-5533 | (375) 555-8161 + -- (499) 555-9472 | (717) 555-1342 + -- (286) 555-6063 | (676) 555-6554 + -- (770) 555-1861 | (725) 555-3243 + -- (031) 555-6622 | (910) 555-3251 + -- (826) 555-1652 | (066) 555-9701 + -- (338) 555-6650 | (704) 555-2131 + + +-- Get structure of flights +.schema flights + + -- id INTEGER, + -- origin_airport_id INTEGER, + -- destination_airport_id INTEGER, + -- year INTEGER, + -- month INTEGER, + -- day INTEGER, + -- hour INTEGER, + -- minute INTEGER, + -- PRIMARY KEY(id), + -- FOREIGN KEY(origin_airport_id) REFERENCES airports(id), + -- FOREIGN KEY(destination_airport_id) REFERENCES airports(id) + +-- Get structure of airports +.schema airports + + -- id INTEGER, + -- abbreviation TEXT, + -- full_name TEXT, + -- city TEXT, + -- PRIMARY KEY(id) + +-- Get structure of passengers +.schema passengers + + -- flight_id INTEGER, + -- passport_number INTEGER, + -- seat TEXT, + -- FOREIGN KEY(flight_id) REFERENCES flights(id) + +-- Get passengers (passport_number) of earliest flight out of Fiftyville the next day +SELECT passport_number FROM passengers +WHERE flight_id IN ( + SELECT flights.id FROM flights + JOIN airports ON flights.origin_airport_id = airports.id + WHERE year = 2023 AND month = 7 AND day = 29 + AND city = 'Fiftyville' + ORDER BY hour LIMIT 1 +); + + -- 7214083635 + -- 1695452385 + -- 5773159633 + -- 1540955065 + -- 8294398571 + -- 1988161715 + -- 9878712108 + -- 8496433585 + +-- Get destination airport for that flight +SELECT city FROM airports +WHERE id IN ( + SELECT destination_airport_id FROM flights + JOIN airports ON flights.origin_airport_id = airports.id + WHERE year = 2023 AND month = 7 AND day = 29 + AND city = 'Fiftyville' + ORDER BY hour LIMIT 1 +); + + -- New York City + + +-- Get structure of people +.schema people + + -- id INTEGER, + -- name TEXT, + -- phone_number TEXT, + -- passport_number INTEGER, + -- license_plate TEXT, + -- PRIMARY KEY(id) + +-- Get structure of bank_accounts +.schema bank_accounts + + -- account_number INTEGER, + -- person_id INTEGER, + -- creation_year INTEGER, + -- FOREIGN KEY(person_id) REFERENCES people(id) + +-- Get the name of the thief and a phone number of accomplice +SELECT name, receiver FROM people +JOIN bank_accounts ON people.id = bank_accounts.person_id +JOIN phone_calls ON people.phone_number = phone_calls.caller +WHERE license_plate IN ( -- Licence plates of leaving customers from within 10 minutes of theft (10:15am) + SELECT license_plate FROM bakery_security_logs + WHERE year = 2023 AND month = 7 AND day = 28 AND hour = 10 AND minute BETWEEN 5 AND 25 + AND activity = 'exit' +) +AND passport_number IN ( -- Ppassport numbers of people on earliest flight out of Fiftyville the next day + SELECT passport_number FROM passengers + WHERE flight_id IN ( + SELECT flights.id FROM flights + JOIN airports ON flights.origin_airport_id = airports.id + WHERE year = 2023 AND month = 7 AND day = 29 + AND city = 'Fiftyville' + ORDER BY hour LIMIT 1 +) +AND phone_number IN ( -- Caller numbers with duration under a minute + SELECT caller FROM phone_calls + WHERE year = 2023 AND month = 7 AND day = 28 + AND duration < 60 +) +AND account_number IN ( -- Account numbers of withdrawals from Leggett Street ATM on the day of theft + SELECT account_number FROM atm_transactions + WHERE year = 2023 AND month = 7 AND day = 28 + AND atm_location = 'Leggett Street' AND transaction_type = 'withdraw' +) +AND day = 28 AND duration < 60 +); + + -- Bruce + +-- Get the name of the accomplice +SELECT name FROM people +WHERE phone_number IN ( + SELECT receiver FROM people + JOIN bank_accounts ON people.id = bank_accounts.person_id + JOIN phone_calls ON people.phone_number = phone_calls.caller + WHERE license_plate IN ( -- Licence plates of leaving customers from within 10 minutes of theft (10:15am) + SELECT license_plate FROM bakery_security_logs + WHERE year = 2023 AND month = 7 AND day = 28 AND hour = 10 AND minute BETWEEN 5 AND 25 + AND activity = 'exit' + ) + AND passport_number IN ( -- Ppassport numbers of people on earliest flight out of Fiftyville the next day + SELECT passport_number FROM passengers + WHERE flight_id IN ( + SELECT flights.id FROM flights + JOIN airports ON flights.origin_airport_id = airports.id + WHERE year = 2023 AND month = 7 AND day = 29 + AND city = 'Fiftyville' + ORDER BY hour LIMIT 1 + ) + AND phone_number IN ( -- Caller numbers with duration under a minute + SELECT caller FROM phone_calls + WHERE year = 2023 AND month = 7 AND day = 28 + AND duration < 60 + ) + AND account_number IN ( -- Account numbers of withdrawals from Leggett Street ATM on the day of theft + SELECT account_number FROM atm_transactions + WHERE year = 2023 AND month = 7 AND day = 28 + AND atm_location = 'Leggett Street' AND transaction_type = 'withdraw' + ) + AND day = 28 AND duration < 60 + ) +); + + -- Robin