use std::cmp::min;
pub fn get_word_half(word: &str) -> String {
let len = word.chars().count();
let half_len = min((len + 1) / 2, 2);
word.chars().take(half_len).collect()
}
pub fn is_valid_word(word: &str) -> bool {
let len = word.len();
if !(2..=30).contains(&len) {
return false; }
if !word.chars().all(|c| c.is_ascii_alphanumeric()) {
return false; }
if !word.chars().any(|c| c.is_ascii_alphabetic()) {
return false; }
let mut repeat_count = 1;
let mut last_char = '\0';
for c in word.chars() {
if c == last_char {
repeat_count += 1;
if repeat_count >= 4 {
return false;
}
} else {
repeat_count = 1;
}
last_char = c;
}
let max_pattern_len = len / 2;
for pat_len in 1..=max_pattern_len {
if len % pat_len == 0 {
let pattern = &word[..pat_len];
if word == pattern.repeat(len / pat_len) {
return false;
}
}
}
let digit_ratio = word.chars().filter(|c| c.is_ascii_digit()).count() as f32 / len as f32;
if digit_ratio > 0.5 {
return false;
}
true
}