Wrote program for Day 28
This commit is contained in:
parent
4f35f76454
commit
c83bdbae92
@ -74,7 +74,7 @@ We encourage you to share your progress and ask questions in the Discussions sec
|
|||||||
| Day #25 | [Coin Trouble](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-04/Day-25_Coin-Trouble) | :white_check_mark: |
|
| Day #25 | [Coin Trouble](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-04/Day-25_Coin-Trouble) | :white_check_mark: |
|
||||||
| Day #26 | [Briefcase Lock](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-04/Day-26_Briefcase-Lock) | :white_check_mark: |
|
| Day #26 | [Briefcase Lock](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-04/Day-26_Briefcase-Lock) | :white_check_mark: |
|
||||||
| Day #27 | [Task Scheduler](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-04/Day-27_Task-Scheduler) | :white_check_mark: |
|
| Day #27 | [Task Scheduler](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-04/Day-27_Task-Scheduler) | :white_check_mark: |
|
||||||
| Day #28 | [Word Search](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-04/Day-28_Word-Search) | :white_large_square: |
|
| Day #28 | [Word Search](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-04/Day-28_Word-Search) | :white_check_mark: |
|
||||||
| Day #29 | [Traffic Light Checker](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-05/Day-29_Traffic-Light-Checker) | :white_large_square: |
|
| Day #29 | [Traffic Light Checker](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-05/Day-29_Traffic-Light-Checker) | :white_large_square: |
|
||||||
| Day #30 | [The Maximum Value](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-05/Day-30_The-Maximum-Value) | :white_large_square: |
|
| Day #30 | [The Maximum Value](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-05/Day-30_The-Maximum-Value) | :white_large_square: |
|
||||||
| Day #31 | [The Time In Words](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-05/Day-31_The-Time-In-Words) | :white_large_square: |
|
| Day #31 | [The Time In Words](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-05/Day-31_The-Time-In-Words) | :white_large_square: |
|
||||||
|
6
Week-04/Day-28_Word-Search/day28/Cargo.toml
Normal file
6
Week-04/Day-28_Word-Search/day28/Cargo.toml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
[package]
|
||||||
|
name = "day28"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
72
Week-04/Day-28_Word-Search/day28/src/lib.rs
Normal file
72
Week-04/Day-28_Word-Search/day28/src/lib.rs
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
use std::{char, collections::HashMap};
|
||||||
|
|
||||||
|
pub fn word_search(board: &[Vec<char>], words: &[&str]) -> Vec<String> {
|
||||||
|
let mut first_char_to_word = HashMap::new();
|
||||||
|
for w in words {
|
||||||
|
first_char_to_word
|
||||||
|
.entry(w.chars().next().unwrap())
|
||||||
|
.or_insert(vec![])
|
||||||
|
.push(w);
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut result = Vec::new();
|
||||||
|
|
||||||
|
for (rown, row) in board.iter().enumerate() {
|
||||||
|
for (column, ch) in row.iter().enumerate() {
|
||||||
|
if let Some(possible_words) = first_char_to_word.get(ch) {
|
||||||
|
for word in possible_words {
|
||||||
|
if search(
|
||||||
|
rown,
|
||||||
|
column,
|
||||||
|
board,
|
||||||
|
&word.chars().skip(1).collect::<Vec<char>>(),
|
||||||
|
) {
|
||||||
|
result.push(word.to_owned().to_owned().to_owned());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
|
fn search(row: usize, column: usize, board: &[Vec<char>], word: &[char]) -> bool {
|
||||||
|
if word.is_empty() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
let (first_char, other_chars) = word.split_first().unwrap();
|
||||||
|
|
||||||
|
if row > 0 {
|
||||||
|
if let Some(char_row) = board.get(row - 1) {
|
||||||
|
if char_row.get(column).unwrap() == first_char
|
||||||
|
&& search(row - 1, column, board, other_chars)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if let Some(char_row) = board.get(row + 1) {
|
||||||
|
if char_row.get(column).unwrap() == first_char
|
||||||
|
&& search(row + 1, column, board, other_chars)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if let Some(char_row) = board.get(row) {
|
||||||
|
if column > 0
|
||||||
|
&& char_row.get(column - 1).unwrap() == first_char
|
||||||
|
&& search(row, column - 1, board, other_chars)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if column + 1 < char_row.len()
|
||||||
|
&& char_row.get(column + 1).unwrap() == first_char
|
||||||
|
&& search(row, column + 1, board, other_chars)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
false
|
||||||
|
}
|
40
Week-04/Day-28_Word-Search/day28/src/main.rs
Normal file
40
Week-04/Day-28_Word-Search/day28/src/main.rs
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
use std::io::{self, Write};
|
||||||
|
|
||||||
|
use day28::word_search;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let mut buffer = String::new();
|
||||||
|
let mut board = Vec::new();
|
||||||
|
|
||||||
|
println!("Insert the characters of the rows without any space (press enter alone to stop creating the board): ");
|
||||||
|
|
||||||
|
loop {
|
||||||
|
print!("Row: ");
|
||||||
|
io::stdout().flush().expect("Failed to flush stdout");
|
||||||
|
|
||||||
|
io::stdin()
|
||||||
|
.read_line(&mut buffer)
|
||||||
|
.expect("Failed to read line");
|
||||||
|
|
||||||
|
if buffer.trim().is_empty() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
board.push(buffer.trim().chars().collect());
|
||||||
|
buffer.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer.clear();
|
||||||
|
|
||||||
|
print!("Insert the words separated by a space: ");
|
||||||
|
io::stdout().flush().expect("Failed to flush stdout");
|
||||||
|
|
||||||
|
io::stdin()
|
||||||
|
.read_line(&mut buffer)
|
||||||
|
.expect("Failed to read line");
|
||||||
|
|
||||||
|
let words: Vec<&str> = buffer.split_whitespace().collect();
|
||||||
|
|
||||||
|
let result = word_search(&board, &words);
|
||||||
|
println!("Words in the board: {:?}", result);
|
||||||
|
}
|
20
Week-04/Day-28_Word-Search/day28/tests/example.rs
Normal file
20
Week-04/Day-28_Word-Search/day28/tests/example.rs
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#[cfg(test)]
|
||||||
|
mod example {
|
||||||
|
use day28::word_search;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn example() {
|
||||||
|
assert_eq!(
|
||||||
|
word_search(
|
||||||
|
&[
|
||||||
|
vec!['o', 'a', 'a', 'n'],
|
||||||
|
vec!['e', 't', 'a', 'e'],
|
||||||
|
vec!['i', 'h', 'k', 'r'],
|
||||||
|
vec!['i', 'f', 'l', 'v']
|
||||||
|
],
|
||||||
|
&["oath", "pea", "eat", "rain"]
|
||||||
|
),
|
||||||
|
["oath", "eat"]
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user