72 lines
1.6 KiB
Rust
72 lines
1.6 KiB
Rust
|
use rand::Rng;
|
||
|
use std::time::Instant;
|
||
|
|
||
|
type Ticket = [u8; 5];
|
||
|
const NUM_ENTRIES: usize = 10_000_000;
|
||
|
|
||
|
// println!("char: {}", rand::random::<char>());
|
||
|
|
||
|
fn gen_num() -> u8 {
|
||
|
rand::thread_rng().gen_range(0..90)
|
||
|
}
|
||
|
|
||
|
fn gen_ticket() -> Ticket {
|
||
|
let num1 = gen_num();
|
||
|
let mut num2: u8 = gen_num();
|
||
|
while num2 == num1 {
|
||
|
num2 = gen_num()
|
||
|
}
|
||
|
let mut num3: u8 = gen_num();
|
||
|
while num3 == num1 || num3 == num2 {
|
||
|
num3 = gen_num()
|
||
|
}
|
||
|
let mut num4: u8 = gen_num();
|
||
|
while num4 == num1 || num4 == num2 || num4 == num3 {
|
||
|
num4 = gen_num()
|
||
|
}
|
||
|
let mut num5: u8 = gen_num();
|
||
|
while num5 == num1 || num5 == num2 || num5 == num3 || num5 == num4 {
|
||
|
num5 = gen_num()
|
||
|
}
|
||
|
[num1, num2, num3, num4, num5]
|
||
|
}
|
||
|
|
||
|
fn num_matches(t1: Ticket, t2: Ticket) -> usize {
|
||
|
let mut result = 0;
|
||
|
for n1 in t1 {
|
||
|
for n2 in t2 {
|
||
|
if n1 == n2 {
|
||
|
result += 1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
result
|
||
|
}
|
||
|
|
||
|
fn main() {
|
||
|
println!("Generating entries");
|
||
|
let mut entries: Vec<Ticket> = Vec::with_capacity(NUM_ENTRIES);
|
||
|
for _ in 0..NUM_ENTRIES {
|
||
|
entries.push(gen_ticket());
|
||
|
}
|
||
|
let winning = gen_ticket();
|
||
|
|
||
|
let start = Instant::now();
|
||
|
|
||
|
println!("Counting winners...");
|
||
|
let mut winners: [usize; 6] = [0, 0, 0, 0, 0, 0];
|
||
|
|
||
|
for n in entries {
|
||
|
let num_winning = num_matches(n, winning);
|
||
|
winners[num_winning] += 1
|
||
|
}
|
||
|
|
||
|
let duration = start.elapsed();
|
||
|
|
||
|
println!(
|
||
|
"Winners: {:?}\nTime Elapsed: {}ms",
|
||
|
winners,
|
||
|
duration.subsec_millis()
|
||
|
);
|
||
|
}
|