From 0b2c9f1465cd2b801874da3851112b7dbcefdc20 Mon Sep 17 00:00:00 2001 From: Aadi Desai <21363892+supleed2@users.noreply.github.com> Date: Tue, 12 Dec 2023 18:06:21 +0000 Subject: [PATCH] Day 12 --- Cargo.lock | 14 +++++++ Cargo.toml | 3 ++ src/cal/day12.rs | 95 ++++++++++++++++++++++++++++++++++++++++++++++++ src/cal/mod.rs | 2 + 4 files changed, 114 insertions(+) create mode 100644 src/cal/day12.rs diff --git a/Cargo.lock b/Cargo.lock index 08fad26..02b43f3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -316,6 +316,7 @@ dependencies = [ "axum 0.7.2", "axum-extra", "base64", + "chrono", "image", "reqwest", "serde", @@ -325,6 +326,8 @@ dependencies = [ "tokio", "tower-http 0.5.0", "tracing", + "ulid", + "uuid", ] [[package]] @@ -2851,6 +2854,17 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "ulid" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e37c4b6cbcc59a8dcd09a6429fbc7890286bcbb79215cea7b38a3c4c0921d93" +dependencies = [ + "rand", + "serde", + "uuid", +] + [[package]] name = "unicase" version = "2.7.0" diff --git a/Cargo.toml b/Cargo.toml index feeee17..9268bbb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ edition = "2021" axum = { version = "0.7.2", features = ["macros", "multipart"] } axum-extra = { version = "0.9.0", features = ["typed-header"] } base64 = "0.21.5" +chrono = { version = "0.4.31", default-features = false, features = ["std"] } image = "0.24.7" reqwest = { version = "0.11.22", features = ["json"] } serde = { version = "1.0.193", features = ["derive"] } @@ -16,3 +17,5 @@ shuttle-runtime = "0.35.0" tokio = "1.34.0" tower-http = { version = "0.5.0", features = ["fs"] } tracing = "0.1.40" +ulid = { version = "1.1.0", features = ["uuid", "serde"] } +uuid = "1.6.1" diff --git a/src/cal/day12.rs b/src/cal/day12.rs new file mode 100644 index 0000000..f5054a6 --- /dev/null +++ b/src/cal/day12.rs @@ -0,0 +1,95 @@ +use axum::{ + extract::{Path, State}, + http::StatusCode, + response::IntoResponse, + routing::{get, post}, + Json, Router, +}; +use chrono::{DateTime, Datelike, Utc}; +use std::{ + collections::HashMap, + sync::{Arc, Mutex}, + time::SystemTime, +}; + +struct Day12State { + times: HashMap, +} + +pub(crate) fn router() -> Router { + Router::new() + .route("/12/save/:string", post(save)) + .route("/12/load/:string", get(load)) + .route("/12/ulids", post(ulids)) + .route("/12/ulids/:weekday", post(ulids_weekday)) + .with_state(Arc::new(Mutex::new(Day12State { + times: HashMap::new(), + }))) +} + +async fn save(State(state): State>>, Path(string): Path) { + state + .lock() + .expect("Should not error unless another thread panics") + .times + .insert(string, SystemTime::now()); +} + +async fn load( + State(state): State>>, + Path(string): Path, +) -> Result { + Ok(state + .lock() + .expect("Should not error unless another thread panics") + .times + .get(&string) + .ok_or(( + StatusCode::NOT_FOUND, + "String not saved previously".to_string(), + ))? + .elapsed() + .expect("Time should not go backwards") + .as_secs() + .to_string()) +} + +async fn ulids(Json(ulids): Json>) -> Json> { + Json(ulids.into_iter().map(Into::into).rev().collect()) +} + +#[derive(serde::Serialize)] +struct UlidsWeekday { + #[serde(rename = "christmas eve")] + christmas_eve: usize, + weekday: usize, + #[serde(rename = "in the future")] + in_the_future: usize, + #[serde(rename = "LSB is 1")] + lsb_is_1: usize, +} + +#[axum::debug_handler] +async fn ulids_weekday( + Path(weekday): Path, + Json(ulids): Json>, +) -> Json { + let lsb_is_1 = ulids.iter().filter(|u| u.random() & 1 == 1).count(); + let ulids: Vec> = ulids.into_iter().map(|u| u.datetime().into()).collect(); + let christmas_eve = ulids + .iter() + .filter(|u| u.month() == 12 && u.day() == 24) + .count(); + let weekday = ulids + .iter() + .filter(|u| u.weekday().num_days_from_monday() == weekday) + .count(); + let now = Utc::now(); + let in_the_future = ulids.iter().filter(|&u| u > &now).count(); + Json(UlidsWeekday { + christmas_eve, + weekday, + in_the_future, + lsb_is_1, + }) +} diff --git a/src/cal/mod.rs b/src/cal/mod.rs index 097ecac..ada9dec 100644 --- a/src/cal/mod.rs +++ b/src/cal/mod.rs @@ -5,6 +5,7 @@ mod day06; mod day07; mod day08; mod day11; +mod day12; pub(crate) fn router() -> axum::Router { axum::Router::new() @@ -15,4 +16,5 @@ pub(crate) fn router() -> axum::Router { .nest("/", day07::router()) .nest("/", day08::router()) .nest("/", day11::router()) + .nest("/", day12::router()) }