From 7713382709b92e2c917f0eebbae5b5934d30334a Mon Sep 17 00:00:00 2001 From: sangge <2251250136@qq.com> Date: Sun, 31 Aug 2025 16:33:01 +0800 Subject: [PATCH] feat: finish 22 --- problems/p22/Cargo.toml | 8 ++++++++ problems/p22/src/main.rs | 42 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 problems/p22/Cargo.toml create mode 100644 problems/p22/src/main.rs diff --git a/problems/p22/Cargo.toml b/problems/p22/Cargo.toml new file mode 100644 index 0000000..7f4cd2a --- /dev/null +++ b/problems/p22/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "p22" +version = "0.1.0" +edition = "2024" + +[dependencies] +common = { path = "../../common/" } +rand = { workspace = true } diff --git a/problems/p22/src/main.rs b/problems/p22/src/main.rs new file mode 100644 index 0000000..8e1e611 --- /dev/null +++ b/problems/p22/src/main.rs @@ -0,0 +1,42 @@ +use common::MT19937; +use rand::{prelude::*, rng}; +use std::thread::sleep; +use std::time::{Duration, SystemTime, UNIX_EPOCH}; + +fn get_sec() -> u32 { + let now = SystemTime::now(); + let duration_since_epoch = now.duration_since(UNIX_EPOCH).expect("Time went backwards"); // Handle potential errors if system time is earlier than epoch. + + let unix_timestamp_seconds = duration_since_epoch.as_secs(); + // overflow at 2038 + unix_timestamp_seconds as u32 +} + +fn crack(rand_num: u32) -> u32 { + let now = get_sec(); + for i in 5..20 { + let mut mt19937 = MT19937::new(now - i); + let result = mt19937.extract_number(); + if rand_num == result { + return now - i; + } + } + 0 +} + +fn main() { + let mut rng = rng(); + let sleep_time: u64 = rng.random_range(5..20); + sleep(Duration::from_secs(sleep_time)); + let seed = get_sec(); + let mut mt19937 = MT19937::new(seed); + let sleep_time: u64 = rng.random_range(5..20); + sleep(Duration::from_secs(sleep_time)); + let result = mt19937.extract_number(); + let cracked = crack(result); + if cracked == seed { + println!("cracked"); + } else { + println!("failed"); + } +}