Exercício 1
Derive o número secreto da semente
stub.rs
// secret_from_seed deriva o número secreto (1..=100) da semente:
// multiplique por 1_103_515_245, some 12_345 — ambos com transbordo
// modular (wrapping) — e reduza com % 100 + 1. Sem panic para NENHUMA semente.
pub fn secret_from_seed(seed: u32) -> u32 {
// implemente:
seed % 100 + 1
}
harness.rs
fn json_escape(value: &str) -> String {
value
.replace('\\', "\\\\")
.replace('"', "\\\"")
.replace('\n', "\\n")
}
fn print_result(case: usize, pass: bool, input: &str, want: &str, got: &str) {
println!(
"RESULT {{\"case\":{case},\"pass\":{pass},\"input\":\"{}\",\"want\":\"{}\",\"got\":\"{}\"}}",
json_escape(input),
json_escape(want),
json_escape(got)
);
}
fn main() {
let cases: [(u32, u32); 5] = [(42, 76), (0, 46), (1, 91), (7, 65), (2026, 96)];
for (index, (seed, want)) in cases.iter().enumerate() {
let got = secret_from_seed(*seed);
let in_range = (1..=100).contains(&got);
let pass = got == *want && in_range;
print_result(
index + 1,
pass,
&seed.to_string(),
&want.to_string(),
&got.to_string(),
);
}
}
cases.json
[
{
"case": 1,
"input": "42",
"want": "76"
},
{
"case": 2,
"input": "0",
"want": "46"
},
{
"case": 3,
"input": "1",
"want": "91"
},
{
"case": 4,
"input": "7",
"want": "65"
},
{
"case": 5,
"input": "2026",
"want": "96"
}
]
Casos e valores esperados
| Caso | Entrada | Valor esperado |
|---|---|---|
| 1 | 42 |
76 |
| 2 | 0 |
46 |
| 3 | 1 |
91 |
| 4 | 7 |
65 |
| 5 | 2026 |
96 |
Execute com o Cargo local
- Execute os comandos de preparação.
- Copie os arquivos acima para os arquivos vazios com os mesmos nomes.
- Execute a verificação de base. O stub deve mostrar o comportamento atual.
Comandos de preparação
cargo new --bin --edition 2024 imersao-05-primeiro-programa-exercicio-1
cd imersao-05-primeiro-programa-exercicio-1
touch stub.rs harness.rs cases.json
printf 'include!("../stub.rs");\ninclude!("../harness.rs");\n' > src/main.rs
Verificação de base — confirme o comportamento atual antes da mudança
cargo fmt --check
cargo run --bin imersao-05-primeiro-programa-exercicio-1
cargo clippy -- -D warnings
Mostrar dicas
- São três passos na ordem da fórmula: multiplicar pela constante, somar o incremento e reduzir com % 100 + 1 — use wrapping_mul e wrapping_add para o transbordo proposital.
- seed.wrapping_mul(1103515245).wrapping_add(12345) % 100 + 1 — os métodos wrapping_* aplicam a aritmética modular que a fórmula exige sem panic em debug.
Revelar solução
solution.rs
// secret_from_seed deriva o número secreto (1..=100) da semente:
// multiplique por 1_103_515_245, some 12_345 — ambos com transbordo
// modular (wrapping) — e reduza com % 100 + 1. Sem panic para NENHUMA semente.
pub fn secret_from_seed(seed: u32) -> u32 {
seed.wrapping_mul(1_103_515_245).wrapping_add(12_345) % 100 + 1
}
O gerador congruencial mistura a semente com multiplicação e soma módulo 2³², e o % 100 + 1 leva o resultado para 1..=100. A armadilha é usar * e + diretos: em debug, o transbordo intencional vira panic — wrapping_mul/wrapping_add declaram que dar a volta é o comportamento desejado.