mirror of
https://github.com/supleed2/cch23-8bit.git
synced 2024-09-19 21:26:19 +00:00
Day 21
This commit is contained in:
parent
7c3030c8ca
commit
581e83b241
89
Cargo.lock
generated
89
Cargo.lock
generated
|
@ -66,6 +66,15 @@ version = "1.0.75"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6"
|
checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "approx"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3f2a05fd1bd10b2527e20a2cd32d8873d115b8b39fe219ee25f42a8aca6ba278"
|
||||||
|
dependencies = [
|
||||||
|
"num-traits",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "arrayvec"
|
name = "arrayvec"
|
||||||
version = "0.7.4"
|
version = "0.7.4"
|
||||||
|
@ -360,6 +369,18 @@ dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bigdecimal"
|
||||||
|
version = "0.3.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a6773ddc0eafc0e509fb60e48dff7f450f8e674a0686ae8605e8d9901bd5eefa"
|
||||||
|
dependencies = [
|
||||||
|
"num-bigint",
|
||||||
|
"num-integer",
|
||||||
|
"num-traits",
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bit_field"
|
name = "bit_field"
|
||||||
version = "0.10.2"
|
version = "0.10.2"
|
||||||
|
@ -434,10 +455,14 @@ dependencies = [
|
||||||
"base64",
|
"base64",
|
||||||
"bytes",
|
"bytes",
|
||||||
"chrono",
|
"chrono",
|
||||||
|
"country-boundaries",
|
||||||
"futures",
|
"futures",
|
||||||
"image",
|
"image",
|
||||||
|
"isocountry",
|
||||||
|
"radians",
|
||||||
"regex",
|
"regex",
|
||||||
"reqwest",
|
"reqwest",
|
||||||
|
"s2",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"sha256",
|
"sha256",
|
||||||
|
@ -460,6 +485,16 @@ version = "1.0.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cgmath"
|
||||||
|
version = "0.18.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1a98d30140e3296250832bbaaff83b27dcd6fa3cc70fb6f1f3e5c9c0023b5317"
|
||||||
|
dependencies = [
|
||||||
|
"approx",
|
||||||
|
"num-traits",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "chrono"
|
name = "chrono"
|
||||||
version = "0.4.31"
|
version = "0.4.31"
|
||||||
|
@ -524,6 +559,12 @@ version = "0.8.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
|
checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "country-boundaries"
|
||||||
|
version = "1.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8a949524fd9d83cd48e5046cd6212c1e533477d376b82570b6c0bcc4c6775625"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cpufeatures"
|
name = "cpufeatures"
|
||||||
version = "0.2.11"
|
version = "0.2.11"
|
||||||
|
@ -827,6 +868,15 @@ dependencies = [
|
||||||
"miniz_oxide",
|
"miniz_oxide",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "float_extras"
|
||||||
|
version = "0.1.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b22b70f8649ea2315955f1a36d964b0e4da482dfaa5f0d04df0d1fb7c338ab7a"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "flume"
|
name = "flume"
|
||||||
version = "0.11.0"
|
version = "0.11.0"
|
||||||
|
@ -1447,6 +1497,16 @@ dependencies = [
|
||||||
"windows-sys 0.48.0",
|
"windows-sys 0.48.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "isocountry"
|
||||||
|
version = "0.3.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1ea1dc4bf0fb4904ba83ffdb98af3d9c325274e92e6e295e4151e86c96363e04"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
"thiserror",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "itertools"
|
name = "itertools"
|
||||||
version = "0.10.5"
|
version = "0.10.5"
|
||||||
|
@ -2233,6 +2293,15 @@ dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "radians"
|
||||||
|
version = "0.3.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9cbdc3e524e4d0d8f8e962046fa011ab2beaba74269f8d4aa6f61dc900b22568"
|
||||||
|
dependencies = [
|
||||||
|
"real_float",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand"
|
name = "rand"
|
||||||
version = "0.8.5"
|
version = "0.8.5"
|
||||||
|
@ -2283,6 +2352,12 @@ dependencies = [
|
||||||
"crossbeam-utils",
|
"crossbeam-utils",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "real_float"
|
||||||
|
version = "0.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3dee308ef52b7603c018d9a0c2ff03fe65fb064bb8605a8c7ac99fb2dfb7542f"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "redox_syscall"
|
name = "redox_syscall"
|
||||||
version = "0.4.1"
|
version = "0.4.1"
|
||||||
|
@ -2462,6 +2537,20 @@ version = "1.0.15"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
|
checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "s2"
|
||||||
|
version = "0.0.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "cc7fbc04bb52c40b5f48c9bb2d2961375301916e0c25d9f373750654d588cd5c"
|
||||||
|
dependencies = [
|
||||||
|
"bigdecimal",
|
||||||
|
"cgmath",
|
||||||
|
"float_extras",
|
||||||
|
"lazy_static",
|
||||||
|
"libm",
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "schannel"
|
name = "schannel"
|
||||||
version = "0.1.22"
|
version = "0.1.22"
|
||||||
|
|
|
@ -11,10 +11,14 @@ axum-extra = { version = "0.9.0", features = ["typed-header"] }
|
||||||
base64 = "0.21.5"
|
base64 = "0.21.5"
|
||||||
bytes = "1.5.0"
|
bytes = "1.5.0"
|
||||||
chrono = { version = "0.4.31", default-features = false, features = ["std"] }
|
chrono = { version = "0.4.31", default-features = false, features = ["std"] }
|
||||||
|
country-boundaries = "1.2.0"
|
||||||
futures = "0.3.29"
|
futures = "0.3.29"
|
||||||
image = "0.24.7"
|
image = "0.24.7"
|
||||||
|
isocountry = "0.3.2"
|
||||||
|
radians = "0.3.1"
|
||||||
regex = "1.10.2"
|
regex = "1.10.2"
|
||||||
reqwest = { version = "0.11.22", features = ["json"] }
|
reqwest = { version = "0.11.22", features = ["json"] }
|
||||||
|
s2 = "0.0.12"
|
||||||
serde = { version = "1.0.193", features = ["derive"] }
|
serde = { version = "1.0.193", features = ["derive"] }
|
||||||
serde_json = "1.0.108"
|
serde_json = "1.0.108"
|
||||||
sha256 = "1.4.0"
|
sha256 = "1.4.0"
|
||||||
|
|
55
src/cal/day21.rs
Normal file
55
src/cal/day21.rs
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
use axum::{extract::Path, http::StatusCode, response::IntoResponse, routing::get, Router};
|
||||||
|
use country_boundaries::{CountryBoundaries, LatLon, BOUNDARIES_ODBL_360X180};
|
||||||
|
use s2::{cellid::CellID, latlng::LatLng};
|
||||||
|
|
||||||
|
pub(crate) fn router() -> Router {
|
||||||
|
Router::new()
|
||||||
|
.route("/21/coords/:id", get(coords))
|
||||||
|
.route("/21/country/:id", get(country))
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn coords(Path(id): Path<String>) -> Result<impl IntoResponse, (StatusCode, String)> {
|
||||||
|
let id = u64::from_str_radix(&id, 2).map_err(|e| (StatusCode::BAD_REQUEST, e.to_string()))?;
|
||||||
|
let cell = CellID(id);
|
||||||
|
if !cell.is_valid() {
|
||||||
|
return Err((StatusCode::BAD_REQUEST, "Invalid cell ID".to_string()));
|
||||||
|
}
|
||||||
|
let pos = LatLng::from(cell);
|
||||||
|
let lat = format!("{:.3}", radians::Deg::new(pos.lat.deg()));
|
||||||
|
let lat = if let Some(lat) = lat.strip_prefix('-') {
|
||||||
|
format!("{lat}S")
|
||||||
|
} else {
|
||||||
|
lat + "N"
|
||||||
|
};
|
||||||
|
let lng = format!("{:.3}", radians::Deg::new(pos.lng.deg()));
|
||||||
|
let lng = if let Some(lng) = lng.strip_prefix('-') {
|
||||||
|
format!("{lng}W")
|
||||||
|
} else {
|
||||||
|
lng + "E"
|
||||||
|
};
|
||||||
|
Ok(lat + " " + &lng)
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn country(Path(id): Path<String>) -> Result<impl IntoResponse, (StatusCode, String)> {
|
||||||
|
let id = u64::from_str_radix(&id, 2).map_err(|e| (StatusCode::BAD_REQUEST, e.to_string()))?;
|
||||||
|
let cell = CellID(id);
|
||||||
|
if !cell.is_valid() {
|
||||||
|
return Err((StatusCode::BAD_REQUEST, "Invalid cell ID".to_string()));
|
||||||
|
}
|
||||||
|
|
||||||
|
let pos = LatLng::from(cell);
|
||||||
|
let pos = LatLon::new(pos.lat.deg(), pos.lng.deg())
|
||||||
|
.map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()))?;
|
||||||
|
|
||||||
|
let countries = CountryBoundaries::from_reader(BOUNDARIES_ODBL_360X180)
|
||||||
|
.map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()))?;
|
||||||
|
|
||||||
|
Ok(countries
|
||||||
|
.ids(pos)
|
||||||
|
.into_iter()
|
||||||
|
.find_map(|id| isocountry::CountryCode::for_alpha2(id).ok())
|
||||||
|
.ok_or((StatusCode::INTERNAL_SERVER_ERROR, "Not found".to_string()))?
|
||||||
|
.name()
|
||||||
|
.trim_end_matches(" Darussalam")
|
||||||
|
.to_string())
|
||||||
|
}
|
|
@ -13,6 +13,7 @@ mod day15;
|
||||||
mod day18;
|
mod day18;
|
||||||
mod day19;
|
mod day19;
|
||||||
mod day20;
|
mod day20;
|
||||||
|
mod day21;
|
||||||
|
|
||||||
pub(crate) fn router(pool: sqlx::PgPool) -> axum::Router {
|
pub(crate) fn router(pool: sqlx::PgPool) -> axum::Router {
|
||||||
axum::Router::new()
|
axum::Router::new()
|
||||||
|
@ -31,4 +32,5 @@ pub(crate) fn router(pool: sqlx::PgPool) -> axum::Router {
|
||||||
.nest("/", day18::router(pool))
|
.nest("/", day18::router(pool))
|
||||||
.nest("/", day19::router())
|
.nest("/", day19::router())
|
||||||
.nest("/", day20::router())
|
.nest("/", day20::router())
|
||||||
|
.nest("/", day21::router())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue