Skip to content

Commit

Permalink
Fix the green-yellow tests.
Browse files Browse the repository at this point in the history
Also comment the solution, and avoid the need to clone the inputs.
  • Loading branch information
jonathanpallant committed Oct 8, 2024
1 parent 3c5648d commit 7024413
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 33 deletions.
29 changes: 21 additions & 8 deletions exercise-solutions/green-yellow/src/bin/complete.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,34 @@ use rand::Rng;

fn calc_green_and_yellow(guess: &[u8; 4], secret: &[u8; 4]) -> String {
let mut result = ["⬜"; 4];
let mut guess = guess.clone();
let mut secret = secret.clone();
let mut secret_handled = [false; 4];

for i in 0..guess.len() {
if guess[i] == secret[i] {
// that's a match
result[i] = "🟩";
secret[i] = 0;
guess[i] = 0;
// don't match this secret digit again
secret_handled[i] = true;
}
}

for i in 0..guess.len() {
for j in 0..secret.len() {
if guess[i] == secret[j] && secret[j] != 0 && guess[i] != 0 {
result[i] = "🟨";
'guess: for g_idx in 0..guess.len() {
// only process guess digits we haven't already dealt with
if result[g_idx] == "🟩" {
continue;
}
for s_idx in 0..secret.len() {
// only process secret digits we haven't already dealt with
if secret_handled[s_idx] {
continue;
}
if guess[g_idx] == secret[s_idx] {
// put a yellow block in for this guess
result[g_idx] = "🟨";
// never match this secret digit again
secret_handled[s_idx] = true;
// stop comparing this guessed digit to any other secret digits
continue 'guess;
}
}
}
Expand Down
29 changes: 21 additions & 8 deletions exercise-solutions/green-yellow/src/bin/step4.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,34 @@
fn calc_green_and_yellow(guess: &[u8; 4], secret: &[u8; 4]) -> String {
let mut result = ["⬜"; 4];
let mut guess = *guess;
let mut secret = *secret;
let mut secret_handled = [false; 4];

for i in 0..guess.len() {
if guess[i] == secret[i] {
// that's a match
result[i] = "🟩";
secret[i] = 0;
guess[i] = 0;
// don't match this secret digit again
secret_handled[i] = true;
}
}

for i in 0..guess.len() {
for j in 0..secret.len() {
if guess[i] == secret[j] && secret[j] != 0 && guess[i] != 0 {
result[i] = "🟨";
'guess: for g_idx in 0..guess.len() {
// only process guess digits we haven't already dealt with
if result[g_idx] == "🟩" {
continue;
}
for s_idx in 0..secret.len() {
// only process secret digits we haven't already dealt with
if secret_handled[s_idx] {
continue;
}
if guess[g_idx] == secret[s_idx] {
// put a yellow block in for this guess
result[g_idx] = "🟨";
// never match this secret digit again
secret_handled[s_idx] = true;
// stop comparing this guessed digit to any other secret digits
continue 'guess;
}
}
}
Expand Down
29 changes: 21 additions & 8 deletions exercise-solutions/green-yellow/src/bin/step5.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,34 @@ use rand::Rng;

fn calc_green_and_yellow(guess: &[u8; 4], secret: &[u8; 4]) -> String {
let mut result = ["⬜"; 4];
let mut guess = *guess;
let mut secret = *secret;
let mut secret_handled = [false; 4];

for i in 0..guess.len() {
if guess[i] == secret[i] {
// that's a match
result[i] = "🟩";
secret[i] = 0;
guess[i] = 0;
// don't match this secret digit again
secret_handled[i] = true;
}
}

for i in 0..guess.len() {
for j in 0..secret.len() {
if guess[i] == secret[j] && secret[j] != 0 && guess[i] != 0 {
result[i] = "🟨";
'guess: for g_idx in 0..guess.len() {
// only process guess digits we haven't already dealt with
if result[g_idx] == "🟩" {
continue;
}
for s_idx in 0..secret.len() {
// only process secret digits we haven't already dealt with
if secret_handled[s_idx] {
continue;
}
if guess[g_idx] == secret[s_idx] {
// put a yellow block in for this guess
result[g_idx] = "🟨";
// never match this secret digit again
secret_handled[s_idx] = true;
// stop comparing this guessed digit to any other secret digits
continue 'guess;
}
}
}
Expand Down
30 changes: 21 additions & 9 deletions exercise-solutions/green-yellow/src/bin/step6.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,40 @@ use rand::Rng;
#[allow(unused)]
fn calc_green_and_yellow(guess: &[u8; 4], secret: &[u8; 4]) -> String {
let mut result = ["⬜"; 4];
let mut guess = *guess;
let mut secret = *secret;
let mut secret_handled = [false; 4];

for i in 0..guess.len() {
if guess[i] == secret[i] {
// that's a match
result[i] = "🟩";
secret[i] = 0;
guess[i] = 0;
// don't match this secret digit again
secret_handled[i] = true;
}
}

for i in 0..guess.len() {
for j in 0..secret.len() {
if guess[i] == secret[j] && secret[j] != 0 && guess[i] != 0 {
result[i] = "🟨";
'guess: for g_idx in 0..guess.len() {
// only process guess digits we haven't already dealt with
if result[g_idx] == "🟩" {
continue;
}
for s_idx in 0..secret.len() {
// only process secret digits we haven't already dealt with
if secret_handled[s_idx] {
continue;
}
if guess[g_idx] == secret[s_idx] {
// put a yellow block in for this guess
result[g_idx] = "🟨";
// never match this secret digit again
secret_handled[s_idx] = true;
// stop comparing this guessed digit to any other secret digits
continue 'guess;
}
}
}

result.join("")
}

fn main() {
let mut rng = rand::thread_rng();
let stdin = std::io::stdin();
Expand Down

0 comments on commit 7024413

Please sign in to comment.