protohack

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit aa40b8d58863c5dc523da6467bb1b27459ddbca1
parent e77b4bc6e5a705ef31d0de6f00dee739efdde8ce
Author: minerva-jupiter <ryouturn@gmail.com>
Date:   Wed,  1 Apr 2026 10:38:25 +0900

feat(prime): Add prime number checking TCP server

Diffstat:
MCargo.lock | 63+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MCargo.toml | 2++
Asrc/bin/prime.rs | 55+++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 120 insertions(+), 0 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock @@ -31,6 +31,12 @@ dependencies = [ ] [[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] name = "libc" version = "0.2.183" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -46,6 +52,12 @@ dependencies = [ ] [[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] name = "mio" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -98,6 +110,8 @@ dependencies = [ name = "protohack" version = "0.1.0" dependencies = [ + "serde", + "serde_json", "tokio", ] @@ -126,6 +140,49 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] name = "signal-hook-registry" version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -216,3 +273,9 @@ checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ "windows-link", ] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/Cargo.toml b/Cargo.toml @@ -4,4 +4,6 @@ version = "0.1.0" edition = "2024" [dependencies] +serde = { version = "1.0.228", features = ["derive"] } +serde_json = "1.0.149" tokio = { version = "1.50", features = ["full"] } diff --git a/src/bin/prime.rs b/src/bin/prime.rs @@ -0,0 +1,55 @@ +use serde::{Deserialize, Serialize}; +use tokio::io::{AsyncBufReadExt, AsyncWriteExt}; + +#[derive(Deserialize)] +struct PrimeRequest { + method: String, + number: f64, +} + +#[derive(Serialize)] +struct PrimeResponse { + method: String, + is_prime: bool, +} + +#[tokio::main] +async fn main() -> std::io::Result<()> { + println!("Smoketest server has started"); + let listener = tokio::net::TcpListener::bind("0.0.0.0:8080").await?; + loop { + let (mut socket, _) = listener.accept().await?; + tokio::spawn(async move { + let (rd, mut wr) = socket.split(); + let mut reader = tokio::io::BufReader::new(rd).lines(); + while let Ok(Some(line)) = reader.next_line().await { + let request: PrimeRequest = match serde_json::from_str::<PrimeRequest>(&line) { + Ok(r) if r.method == "isPrime" => r, + _ => continue, + }; + let is_prime = is_prime(request.number); + let response = PrimeResponse { + method: "is_prime".to_string(), + is_prime, + }; + let mut payload = serde_json::to_vec(&response).unwrap(); + payload.push(b'\n'); + if wr.write_all(&payload).await.is_err() { + break; + } + } + }); + } +} + +fn is_prime(n: f64) -> bool { + if n.fract() != 0.0 || n < 2.0 { + return false; + } + for i in 2..(n as u64) { + if n % i as f64 == 0.0 { + return false; + } + } + true +}