Решение на Spell Checker от Моника Киркова
Резултати
- 17 точки от тестове
- 0 бонус точки
- 17 точки общо
- 13 успешни тест(а)
- 2 неуспешни тест(а)
Код
use std::collections::HashMap;
use std::collections::HashSet;
use std::fmt;
pub const ALPHABET_EN: &'static str = "abcdefghijklmnopqrstuvwxyz";
pub const ALPHABET_BG: &'static str = "абвгдежзийклмнопрстуфхцчшщъьюя";
pub fn clean_line(input: &str) -> String{
let mut output : String = "".to_string();
let mut count = 0;
let mut chars = input.chars();
let mut ch = chars.next();
while(ch.is_some()){
let mut c = ch.unwrap();
if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == ' ' || c == '-' || c == '`'
|| (c >= 'а' && c <= 'я') || (c >= 'А' && c <= 'Я')){
output.push(c);
}
else{
output.push(' ');
}
ch = chars.next();
count += 1;
}
output = output.trim().to_string();
return output
}
pub struct WordCounter {
word_count: HashMap<String, i32>,
}
impl WordCounter {
pub fn new() -> Self {
let mut hash = HashMap::new();
let mut words : WordCounter = WordCounter{word_count: hash};
return words
}
pub fn from_str(input: &str) -> Self {
let mut a : String = "".to_string();
let mut wordCounter = WordCounter::new();
let mut chars = input.chars();
let mut chs = chars.next();
let mut ch;
while(chs.is_some()){
ch = chs.unwrap();
let mut text : String = "".to_string();
while(ch != '\n'){
text.push(ch);
chs = chars.next();
if chs.is_none(){
break;
}
ch = chs.unwrap();
}
text = clean_line(&text);
chs = chars.next();
let mut texts = text.chars();
let mut text_chars = texts.next();
let mut text_ch;
while(text_chars.is_some()){
text_ch = text_chars.unwrap();
let mut word : String = "".to_string();
while(text_ch != ' '){
word.push(text_ch);
text_chars = texts.next();
if(text_chars.is_none()){
break;
}
text_ch = text_chars.unwrap();
}
text_chars = texts.next();
wordCounter.add(&word);
}
}
wordCounter.word_count.remove("");
return wordCounter
}
pub fn words(&self) -> Vec<&String> {
let mut vec = Vec::new();
for key in self.word_count.keys() {
vec.push(key);
}
vec.sort();
return vec
}
pub fn add(&mut self, item: &str) {
let mut word = item.to_lowercase();
if self.word_count.contains_key(&word){
for (key, val) in self.word_count.iter_mut() {
if *key == word{
*val += 1;
}
}
}
else{
&self.word_count.insert(word.to_string(), 1);
}
}
pub fn get(&self, word: &str) -> u32 {
let mut count: u32 = 0;
for (key, val) in self.word_count.iter() {
if key == word{
count = *val as u32
}
}
return count
}
pub fn total_count(&self) -> u32 {
let mut count: u32 = 0;
for val in self.word_count.values() {
count += *val as u32
}
return count
}
}
impl std::fmt::Display for WordCounter {
fn fmt(&self, f: &mut fmt::Formatter) -> std::fmt::Result {
let tmp = self.total_count().to_string();
f.write_str("WordCounter, total count: ");
f.pad(&tmp);
f.write_str("\n");
let mut maxVal:i32 = 0;
let mut maxKey:String = "".to_string();
let mut map:HashMap<String, i32> = HashMap::new();
for (key, val) in self.word_count.iter(){
map.insert(key.to_string(), *val);
}
while(!map.is_empty()){
for (key, val) in &map{
if val > &maxVal{
maxVal = *val;
maxKey = key.to_string();
}
}
f.write_str(&maxKey);
f.write_str(": ");
f.pad(&maxVal.to_string());
f.write_str("\n");
map.remove(&maxKey);
maxVal = 0;
}
Ok(())
}
}
pub struct SpellChecker {
corpus: String,
alphabet: String,
}
impl SpellChecker {
pub fn new(corpus: &str, alphabet: &str) -> Self {
let spell_checker: SpellChecker = SpellChecker{corpus: corpus.to_string(), alphabet: alphabet.to_string()};
return spell_checker
}
pub fn correction(&self, word: &str) -> String {
let mut rightWord: String = "".to_string();
let mut result: Vec<String> = Vec::new();
let mut lowerWord = word.to_lowercase().trim().to_string();
result = self.candidates(&lowerWord);
if result.len() == 1{
rightWord = result.pop().unwrap();
}else{
let mut wordCounter:WordCounter;
wordCounter = WordCounter::from_str(&self.corpus);
let mut maxCount: i32 = 0;
for (key, val) in wordCounter.word_count.iter_mut(){
if val > &mut maxCount && result.contains(key){
maxCount = *val;
rightWord = key.to_string();
}
}
}
return rightWord
}
pub fn probability(&self, word: &str) -> f64 {
let wordCounter:WordCounter;
wordCounter = WordCounter::from_str(&self.corpus);
return wordCounter.get(&word.to_lowercase()) as f64 / wordCounter.total_count() as f64
}
pub fn known<'a>(&self, words: &'a HashSet<String>) -> Vec<&'a String> {
let mut vec: Vec<&'a String> = Vec::new();
let wordCounter:WordCounter;
wordCounter = WordCounter::from_str(&self.corpus);
for x in words.iter(){
let lower : String = x.to_lowercase();
if wordCounter.word_count.contains_key(&lower){
vec.push(x);
}
}
return vec
}
pub fn candidates(&self, word: &str) -> Vec<String> {
let wordCounter:WordCounter;
wordCounter = WordCounter::from_str(&self.corpus);
let mut result: Vec<String> = Vec::new();
let mut result1: Vec<String> = Vec::new();
let mut result2: Vec<String> = Vec::new();
let lower : String = word.to_lowercase();
let mut edited1 = HashSet::new();
edited1 = self.edits1(word);
result1 = self.known(&edited1).iter().map(|x| x.to_string()).collect::<Vec<String>>();
let mut edited2 = HashSet::new();
edited2 = self.edits2(word);
result2 = self.known(&edited2).iter().map(|x| x.to_string()).collect::<Vec<String>>();
if wordCounter.word_count.contains_key(&lower){
result.push(word.to_string());
}else if !result1.is_empty(){
result = result1;
}else if !result2.is_empty(){
result = result2;
}else{
result.push(word.to_string());
}
return result
}
pub fn edits1(&self, word: &str) -> HashSet<String> {
let mut count = 0;
let mut result = HashSet::new();
let mut newWord: String = "".to_string();
let mut wordLength = word.len();
let mut i = 1;
if word != "" && word.get(0..1).is_none(){
i = 2;
}
while(count < word.len()){
newWord = word.to_string();
newWord.replace_range(count..count+i, "");
count += 1;
if newWord != ""{
result.insert(newWord);
}
if i == 2{
count += 1;
}
}
count = 0;
while(count < word.len() - i){
let mut a = word.get(count..count+i).unwrap();
let mut b = word.get(count+i..count+i+i).unwrap();
newWord = word.to_string();
newWord.replace_range(count..count+i, b);
newWord.replace_range(count+i..count+i+i, a);
result.insert(newWord);
count += 1;
if i == 2{
count += 1;
}
}
count = 0;
while(count < word.len()){
let mut alphabet = self.alphabet.chars();
let mut a = alphabet.next();
while(a.is_some()){
newWord = word.to_string();
newWord.replace_range(count..count+i, &a.unwrap().to_string());
a = alphabet.next();
result.insert(newWord);
}
count += 1;
if i == 2{
count += 1;
}
}
count = 0;
while(count <= word.len()){
let mut alphabet = self.alphabet.chars();
let mut a = alphabet.next();
while(a.is_some()){
newWord = String::from(word.to_string());
newWord.insert_str(count, &a.unwrap().to_string());
a = alphabet.next();
result.insert(newWord);
}
count += 1;
if i == 2{
count += 1;
}
}
return result
}
pub fn edits2(&self, word: &str) -> HashSet<String> {
let mut count = 0;
let mut result: HashSet<String> = HashSet::new();
let mut result1: HashSet<String> = HashSet::new();
result1 = self.edits1(word);
for x in result1{
let mut result2: HashSet<String> = self.edits1(&x);
for y in result2{
result.insert(y);
}
}
return result
}
}
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20200114-2173579-pzntfm/solution)
warning: unnecessary parentheses around `while` condition
--> src/lib.rs:13:10
|
13 | while(ch.is_some()){
| ^^^^^^^^^^^^^^ help: remove these parentheses
|
= note: `#[warn(unused_parens)]` on by default
warning: unnecessary parentheses around `if` condition
--> src/lib.rs:15:11
|
15 | if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == ' ' || c == '-' || c == '`'
| ___________^
16 | | || (c >= 'а' && c <= 'я') || (c >= 'А' && c <= 'Я')){
| |____________________________________________________________^
|
help: remove these parentheses
|
15 | if (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == ' ' || c == '-' || c == '`'
16 | || (c >= 'а' && c <= 'я') || (c >= 'А' && c <= 'Я') {
|
warning: unnecessary parentheses around `while` condition
--> src/lib.rs:46:14
|
46 | while(chs.is_some()){
| ^^^^^^^^^^^^^^^ help: remove these parentheses
warning: unnecessary parentheses around `while` condition
--> src/lib.rs:49:18
|
49 | while(ch != '\n'){
| ^^^^^^^^^^^^ help: remove these parentheses
warning: unnecessary parentheses around `while` condition
--> src/lib.rs:62:18
|
62 | while(text_chars.is_some()){
| ^^^^^^^^^^^^^^^^^^^^^^ help: remove these parentheses
warning: unnecessary parentheses around `while` condition
--> src/lib.rs:65:22
|
65 | while(text_ch != ' '){
| ^^^^^^^^^^^^^^^^ help: remove these parentheses
warning: unnecessary parentheses around `if` condition
--> src/lib.rs:68:23
|
68 | if(text_chars.is_none()){
| ^^^^^^^^^^^^^^^^^^^^^^ help: remove these parentheses
warning: unnecessary parentheses around `while` condition
--> src/lib.rs:138:14
|
138 | while(!map.is_empty()){
| ^^^^^^^^^^^^^^^^^ help: remove these parentheses
warning: unnecessary parentheses around `while` condition
--> src/lib.rs:244:14
|
244 | while(count < word.len()){
| ^^^^^^^^^^^^^^^^^^^^ help: remove these parentheses
warning: unnecessary parentheses around `while` condition
--> src/lib.rs:256:14
|
256 | while(count < word.len() - i){
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: remove these parentheses
warning: unnecessary parentheses around `while` condition
--> src/lib.rs:270:14
|
270 | while(count < word.len()){
| ^^^^^^^^^^^^^^^^^^^^ help: remove these parentheses
warning: unnecessary parentheses around `while` condition
--> src/lib.rs:273:18
|
273 | while(a.is_some()){
| ^^^^^^^^^^^^^ help: remove these parentheses
warning: unnecessary parentheses around `while` condition
--> src/lib.rs:285:14
|
285 | while(count <= word.len()){
| ^^^^^^^^^^^^^^^^^^^^^ help: remove these parentheses
warning: unnecessary parentheses around `while` condition
--> src/lib.rs:288:18
|
288 | while(a.is_some()){
| ^^^^^^^^^^^^^ help: remove these parentheses
warning: variable `count` is assigned to, but never used
--> src/lib.rs:10:13
|
10 | let mut count = 0;
| ^^^^^
|
= note: `#[warn(unused_variables)]` on by default
= note: consider using `_count` instead
warning: unused variable: `a`
--> src/lib.rs:41:17
|
41 | let mut a : String = "".to_string();
| ^ help: consider prefixing with an underscore: `_a`
warning: value assigned to `result` is never read
--> src/lib.rs:170:17
|
170 | let mut result: Vec<String> = Vec::new();
| ^^^^^^
|
= note: `#[warn(unused_assignments)]` on by default
= help: maybe it is overwritten before being read?
warning: value assigned to `result1` is never read
--> src/lib.rs:214:17
|
214 | let mut result1: Vec<String> = Vec::new();
| ^^^^^^^
|
= help: maybe it is overwritten before being read?
warning: value assigned to `result2` is never read
--> src/lib.rs:215:17
|
215 | let mut result2: Vec<String> = Vec::new();
| ^^^^^^^
|
= help: maybe it is overwritten before being read?
warning: value assigned to `edited1` is never read
--> src/lib.rs:217:17
|
217 | let mut edited1 = HashSet::new();
| ^^^^^^^
|
= help: maybe it is overwritten before being read?
warning: value assigned to `edited2` is never read
--> src/lib.rs:220:17
|
220 | let mut edited2 = HashSet::new();
| ^^^^^^^
|
= help: maybe it is overwritten before being read?
warning: value assigned to `newWord` is never read
--> src/lib.rs:238:17
|
238 | let mut newWord: String = "".to_string();
| ^^^^^^^
|
= help: maybe it is overwritten before being read?
warning: unused variable: `wordLength`
--> src/lib.rs:239:17
|
239 | let mut wordLength = word.len();
| ^^^^^^^^^^ help: consider prefixing with an underscore: `_wordLength`
warning: unused variable: `count`
--> src/lib.rs:303:17
|
303 | let mut count = 0;
| ^^^^^ help: consider prefixing with an underscore: `_count`
warning: value assigned to `result1` is never read
--> src/lib.rs:305:17
|
305 | let mut result1: HashSet<String> = HashSet::new();
| ^^^^^^^
|
= help: maybe it is overwritten before being read?
warning: variable does not need to be mutable
--> src/lib.rs:14:13
|
14 | let mut c = ch.unwrap();
| ----^
| |
| help: remove this `mut`
|
= note: `#[warn(unused_mut)]` on by default
warning: variable does not need to be mutable
--> src/lib.rs:35:13
|
35 | let mut hash = HashMap::new();
| ----^^^^
| |
| help: remove this `mut`
warning: variable does not need to be mutable
--> src/lib.rs:36:13
|
36 | let mut words : WordCounter = WordCounter{word_count: hash};
| ----^^^^^
| |
| help: remove this `mut`
warning: variable does not need to be mutable
--> src/lib.rs:41:13
|
41 | let mut a : String = "".to_string();
| ----^
| |
| help: remove this `mut`
warning: variable does not need to be mutable
--> src/lib.rs:92:13
|
92 | let mut word = item.to_lowercase();
| ----^^^^
| |
| help: remove this `mut`
warning: variable does not need to be mutable
--> src/lib.rs:171:13
|
171 | let mut lowerWord = word.to_lowercase().trim().to_string();
| ----^^^^^^^^^
| |
| help: remove this `mut`
warning: variable does not need to be mutable
--> src/lib.rs:239:13
|
239 | let mut wordLength = word.len();
| ----^^^^^^^^^^
| |
| help: remove this `mut`
warning: variable does not need to be mutable
--> src/lib.rs:257:17
|
257 | let mut a = word.get(count..count+i).unwrap();
| ----^
| |
| help: remove this `mut`
warning: variable does not need to be mutable
--> src/lib.rs:258:17
|
258 | let mut b = word.get(count+i..count+i+i).unwrap();
| ----^
| |
| help: remove this `mut`
warning: variable does not need to be mutable
--> src/lib.rs:303:13
|
303 | let mut count = 0;
| ----^^^^^
| |
| help: remove this `mut`
warning: variable does not need to be mutable
--> src/lib.rs:308:17
|
308 | let mut result2: HashSet<String> = self.edits1(&x);
| ----^^^^^^^
| |
| help: remove this `mut`
warning: variable `wordCounter` should have a snake case name
--> src/lib.rs:42:17
|
42 | let mut wordCounter = WordCounter::new();
| ^^^^^^^^^^^ help: convert the identifier to snake case: `word_counter`
|
= note: `#[warn(non_snake_case)]` on by default
warning: unused `std::result::Result` that must be used
--> src/lib.rs:129:9
|
129 | f.write_str("WordCounter, total count: ");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(unused_must_use)]` on by default
= note: this `Result` may be an `Err` variant, which should be handled
warning: unused `std::result::Result` that must be used
--> src/lib.rs:130:9
|
130 | f.pad(&tmp);
| ^^^^^^^^^^^^
|
= note: this `Result` may be an `Err` variant, which should be handled
warning: unused `std::result::Result` that must be used
--> src/lib.rs:131:9
|
131 | f.write_str("\n");
| ^^^^^^^^^^^^^^^^^^
|
= note: this `Result` may be an `Err` variant, which should be handled
warning: variable `maxVal` should have a snake case name
--> src/lib.rs:132:17
|
132 | let mut maxVal:i32 = 0;
| ^^^^^^ help: convert the identifier to snake case: `max_val`
warning: variable `maxKey` should have a snake case name
--> src/lib.rs:133:17
|
133 | let mut maxKey:String = "".to_string();
| ^^^^^^ help: convert the identifier to snake case: `max_key`
warning: unused `std::result::Result` that must be used
--> src/lib.rs:145:13
|
145 | f.write_str(&maxKey);
| ^^^^^^^^^^^^^^^^^^^^^
|
= note: this `Result` may be an `Err` variant, which should be handled
warning: unused `std::result::Result` that must be used
--> src/lib.rs:146:13
|
146 | f.write_str(": ");
| ^^^^^^^^^^^^^^^^^^
|
= note: this `Result` may be an `Err` variant, which should be handled
warning: unused `std::result::Result` that must be used
--> src/lib.rs:147:13
|
147 | f.pad(&maxVal.to_string());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: this `Result` may be an `Err` variant, which should be handled
warning: unused `std::result::Result` that must be used
--> src/lib.rs:148:13
|
148 | f.write_str("\n");
| ^^^^^^^^^^^^^^^^^^
|
= note: this `Result` may be an `Err` variant, which should be handled
warning: variable `rightWord` should have a snake case name
--> src/lib.rs:169:17
|
169 | let mut rightWord: String = "".to_string();
| ^^^^^^^^^ help: convert the identifier to snake case: `right_word`
warning: variable `lowerWord` should have a snake case name
--> src/lib.rs:171:17
|
171 | let mut lowerWord = word.to_lowercase().trim().to_string();
| ^^^^^^^^^ help: convert the identifier to snake case: `lower_word`
warning: variable `wordCounter` should have a snake case name
--> src/lib.rs:176:21
|
176 | let mut wordCounter:WordCounter;
| ^^^^^^^^^^^ help: convert the identifier to snake case: `word_counter`
warning: variable `maxCount` should have a snake case name
--> src/lib.rs:178:21
|
178 | let mut maxCount: i32 = 0;
| ^^^^^^^^ help: convert the identifier to snake case: `max_count`
warning: variable `wordCounter` should have a snake case name
--> src/lib.rs:190:13
|
190 | let wordCounter:WordCounter;
| ^^^^^^^^^^^ help: convert the identifier to snake case: `word_counter`
warning: variable `wordCounter` should have a snake case name
--> src/lib.rs:198:13
|
198 | let wordCounter:WordCounter;
| ^^^^^^^^^^^ help: convert the identifier to snake case: `word_counter`
warning: variable `wordCounter` should have a snake case name
--> src/lib.rs:211:13
|
211 | let wordCounter:WordCounter;
| ^^^^^^^^^^^ help: convert the identifier to snake case: `word_counter`
warning: variable `newWord` should have a snake case name
--> src/lib.rs:238:17
|
238 | let mut newWord: String = "".to_string();
| ^^^^^^^ help: convert the identifier to snake case: `new_word`
warning: variable `wordLength` should have a snake case name
--> src/lib.rs:239:17
|
239 | let mut wordLength = word.len();
| ^^^^^^^^^^ help: convert the identifier to snake case: `word_length`
warning: unnecessary parentheses around `while` condition
--> src/lib.rs:13:10
|
13 | while(ch.is_some()){
| ^^^^^^^^^^^^^^ help: remove these parentheses
|
= note: `#[warn(unused_parens)]` on by default
warning: unnecessary parentheses around `if` condition
--> src/lib.rs:15:11
|
15 | if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == ' ' || c == '-' || c == '`'
| ___________^
16 | | || (c >= 'а' && c <= 'я') || (c >= 'А' && c <= 'Я')){
| |____________________________________________________________^
|
help: remove these parentheses
|
15 | if (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == ' ' || c == '-' || c == '`'
16 | || (c >= 'а' && c <= 'я') || (c >= 'А' && c <= 'Я') {
|
warning: unnecessary parentheses around `while` condition
--> src/lib.rs:46:14
|
46 | while(chs.is_some()){
| ^^^^^^^^^^^^^^^ help: remove these parentheses
warning: unnecessary parentheses around `while` condition
--> src/lib.rs:49:18
|
49 | while(ch != '\n'){
| ^^^^^^^^^^^^ help: remove these parentheses
warning: unnecessary parentheses around `while` condition
--> src/lib.rs:62:18
|
62 | while(text_chars.is_some()){
| ^^^^^^^^^^^^^^^^^^^^^^ help: remove these parentheses
warning: unnecessary parentheses around `while` condition
--> src/lib.rs:65:22
|
65 | while(text_ch != ' '){
| ^^^^^^^^^^^^^^^^ help: remove these parentheses
warning: unnecessary parentheses around `if` condition
--> src/lib.rs:68:23
|
68 | if(text_chars.is_none()){
| ^^^^^^^^^^^^^^^^^^^^^^ help: remove these parentheses
warning: unnecessary parentheses around `while` condition
--> src/lib.rs:138:14
|
138 | while(!map.is_empty()){
| ^^^^^^^^^^^^^^^^^ help: remove these parentheses
warning: unnecessary parentheses around `while` condition
--> src/lib.rs:244:14
|
244 | while(count < word.len()){
| ^^^^^^^^^^^^^^^^^^^^ help: remove these parentheses
warning: unnecessary parentheses around `while` condition
--> src/lib.rs:256:14
|
256 | while(count < word.len() - i){
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: remove these parentheses
warning: unnecessary parentheses around `while` condition
--> src/lib.rs:270:14
|
270 | while(count < word.len()){
| ^^^^^^^^^^^^^^^^^^^^ help: remove these parentheses
warning: unnecessary parentheses around `while` condition
--> src/lib.rs:273:18
|
273 | while(a.is_some()){
| ^^^^^^^^^^^^^ help: remove these parentheses
warning: unnecessary parentheses around `while` condition
--> src/lib.rs:285:14
|
285 | while(count <= word.len()){
| ^^^^^^^^^^^^^^^^^^^^^ help: remove these parentheses
warning: unnecessary parentheses around `while` condition
--> src/lib.rs:288:18
|
288 | while(a.is_some()){
| ^^^^^^^^^^^^^ help: remove these parentheses
warning: variable `count` is assigned to, but never used
--> src/lib.rs:10:13
|
10 | let mut count = 0;
| ^^^^^
|
= note: `#[warn(unused_variables)]` on by default
= note: consider using `_count` instead
warning: unused variable: `a`
--> src/lib.rs:41:17
|
41 | let mut a : String = "".to_string();
| ^ help: consider prefixing with an underscore: `_a`
warning: value assigned to `result` is never read
--> src/lib.rs:170:17
|
170 | let mut result: Vec<String> = Vec::new();
| ^^^^^^
|
= note: `#[warn(unused_assignments)]` on by default
= help: maybe it is overwritten before being read?
warning: value assigned to `result1` is never read
--> src/lib.rs:214:17
|
214 | let mut result1: Vec<String> = Vec::new();
| ^^^^^^^
|
= help: maybe it is overwritten before being read?
warning: value assigned to `result2` is never read
--> src/lib.rs:215:17
|
215 | let mut result2: Vec<String> = Vec::new();
| ^^^^^^^
|
= help: maybe it is overwritten before being read?
warning: value assigned to `edited1` is never read
--> src/lib.rs:217:17
|
217 | let mut edited1 = HashSet::new();
| ^^^^^^^
|
= help: maybe it is overwritten before being read?
warning: value assigned to `edited2` is never read
--> src/lib.rs:220:17
|
220 | let mut edited2 = HashSet::new();
| ^^^^^^^
|
= help: maybe it is overwritten before being read?
warning: value assigned to `newWord` is never read
--> src/lib.rs:238:17
|
238 | let mut newWord: String = "".to_string();
| ^^^^^^^
|
= help: maybe it is overwritten before being read?
warning: unused variable: `wordLength`
--> src/lib.rs:239:17
|
239 | let mut wordLength = word.len();
| ^^^^^^^^^^ help: consider prefixing with an underscore: `_wordLength`
warning: unused variable: `count`
--> src/lib.rs:303:17
|
303 | let mut count = 0;
| ^^^^^ help: consider prefixing with an underscore: `_count`
warning: value assigned to `result1` is never read
--> src/lib.rs:305:17
|
305 | let mut result1: HashSet<String> = HashSet::new();
| ^^^^^^^
|
= help: maybe it is overwritten before being read?
warning: variable does not need to be mutable
--> src/lib.rs:14:13
|
14 | let mut c = ch.unwrap();
| ----^
| |
| help: remove this `mut`
|
= note: `#[warn(unused_mut)]` on by default
warning: variable does not need to be mutable
--> src/lib.rs:35:13
|
35 | let mut hash = HashMap::new();
| ----^^^^
| |
| help: remove this `mut`
warning: variable does not need to be mutable
--> src/lib.rs:36:13
|
36 | let mut words : WordCounter = WordCounter{word_count: hash};
| ----^^^^^
| |
| help: remove this `mut`
warning: variable does not need to be mutable
--> src/lib.rs:41:13
|
41 | let mut a : String = "".to_string();
| ----^
| |
| help: remove this `mut`
warning: variable does not need to be mutable
--> src/lib.rs:92:13
|
92 | let mut word = item.to_lowercase();
| ----^^^^
| |
| help: remove this `mut`
warning: variable does not need to be mutable
--> src/lib.rs:171:13
|
171 | let mut lowerWord = word.to_lowercase().trim().to_string();
| ----^^^^^^^^^
| |
| help: remove this `mut`
warning: variable does not need to be mutable
--> src/lib.rs:239:13
|
239 | let mut wordLength = word.len();
| ----^^^^^^^^^^
| |
| help: remove this `mut`
warning: variable does not need to be mutable
--> src/lib.rs:257:17
|
257 | let mut a = word.get(count..count+i).unwrap();
| ----^
| |
| help: remove this `mut`
warning: variable does not need to be mutable
--> src/lib.rs:258:17
|
258 | let mut b = word.get(count+i..count+i+i).unwrap();
| ----^
| |
| help: remove this `mut`
warning: variable does not need to be mutable
--> src/lib.rs:303:13
|
303 | let mut count = 0;
| ----^^^^^
| |
| help: remove this `mut`
warning: variable does not need to be mutable
--> src/lib.rs:308:17
|
308 | let mut result2: HashSet<String> = self.edits1(&x);
| ----^^^^^^^
| |
| help: remove this `mut`
warning: variable `wordCounter` should have a snake case name
--> src/lib.rs:42:17
|
42 | let mut wordCounter = WordCounter::new();
| ^^^^^^^^^^^ help: convert the identifier to snake case: `word_counter`
|
= note: `#[warn(non_snake_case)]` on by default
warning: unused `std::result::Result` that must be used
--> src/lib.rs:129:9
|
129 | f.write_str("WordCounter, total count: ");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(unused_must_use)]` on by default
= note: this `Result` may be an `Err` variant, which should be handled
warning: unused `std::result::Result` that must be used
--> src/lib.rs:130:9
|
130 | f.pad(&tmp);
| ^^^^^^^^^^^^
|
= note: this `Result` may be an `Err` variant, which should be handled
warning: unused `std::result::Result` that must be used
--> src/lib.rs:131:9
|
131 | f.write_str("\n");
| ^^^^^^^^^^^^^^^^^^
|
= note: this `Result` may be an `Err` variant, which should be handled
warning: variable `maxVal` should have a snake case name
--> src/lib.rs:132:17
|
132 | let mut maxVal:i32 = 0;
| ^^^^^^ help: convert the identifier to snake case: `max_val`
warning: variable `maxKey` should have a snake case name
--> src/lib.rs:133:17
|
133 | let mut maxKey:String = "".to_string();
| ^^^^^^ help: convert the identifier to snake case: `max_key`
warning: unused `std::result::Result` that must be used
--> src/lib.rs:145:13
|
145 | f.write_str(&maxKey);
| ^^^^^^^^^^^^^^^^^^^^^
|
= note: this `Result` may be an `Err` variant, which should be handled
warning: unused `std::result::Result` that must be used
--> src/lib.rs:146:13
|
146 | f.write_str(": ");
| ^^^^^^^^^^^^^^^^^^
|
= note: this `Result` may be an `Err` variant, which should be handled
warning: unused `std::result::Result` that must be used
--> src/lib.rs:147:13
|
147 | f.pad(&maxVal.to_string());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: this `Result` may be an `Err` variant, which should be handled
warning: unused `std::result::Result` that must be used
--> src/lib.rs:148:13
|
148 | f.write_str("\n");
| ^^^^^^^^^^^^^^^^^^
|
= note: this `Result` may be an `Err` variant, which should be handled
warning: variable `rightWord` should have a snake case name
--> src/lib.rs:169:17
|
169 | let mut rightWord: String = "".to_string();
| ^^^^^^^^^ help: convert the identifier to snake case: `right_word`
warning: variable `lowerWord` should have a snake case name
--> src/lib.rs:171:17
|
171 | let mut lowerWord = word.to_lowercase().trim().to_string();
| ^^^^^^^^^ help: convert the identifier to snake case: `lower_word`
warning: variable `wordCounter` should have a snake case name
--> src/lib.rs:176:21
|
176 | let mut wordCounter:WordCounter;
| ^^^^^^^^^^^ help: convert the identifier to snake case: `word_counter`
warning: variable `maxCount` should have a snake case name
--> src/lib.rs:178:21
|
178 | let mut maxCount: i32 = 0;
| ^^^^^^^^ help: convert the identifier to snake case: `max_count`
warning: variable `wordCounter` should have a snake case name
--> src/lib.rs:190:13
|
190 | let wordCounter:WordCounter;
| ^^^^^^^^^^^ help: convert the identifier to snake case: `word_counter`
warning: variable `wordCounter` should have a snake case name
--> src/lib.rs:198:13
|
198 | let wordCounter:WordCounter;
| ^^^^^^^^^^^ help: convert the identifier to snake case: `word_counter`
warning: variable `wordCounter` should have a snake case name
--> src/lib.rs:211:13
|
211 | let wordCounter:WordCounter;
| ^^^^^^^^^^^ help: convert the identifier to snake case: `word_counter`
warning: variable `newWord` should have a snake case name
--> src/lib.rs:238:17
|
238 | let mut newWord: String = "".to_string();
| ^^^^^^^ help: convert the identifier to snake case: `new_word`
warning: variable `wordLength` should have a snake case name
--> src/lib.rs:239:17
|
239 | let mut wordLength = word.len();
| ^^^^^^^^^^ help: convert the identifier to snake case: `word_length`
Finished test [unoptimized + debuginfo] target(s) in 4.21s
Running target/debug/deps/solution-a73e64ec87929bd0
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Running target/debug/deps/solution_test-38971695424b36d5
running 15 tests
test solution_test::test_best_word_is_returned ... ok
test solution_test::test_clean_line_removes_punctuation ... FAILED
test solution_test::test_clean_line_trims_the_input ... ok
test solution_test::test_correction ... ok
test solution_test::test_correction_fails_to_produce_new_result ... FAILED
test solution_test::test_correction_normalizes_case ... ok
test solution_test::test_counting ... ok
test solution_test::test_display ... ok
test solution_test::test_edits1 ... ok
test solution_test::test_edits2 ... ok
test solution_test::test_empty_counter ... ok
test solution_test::test_from_empty_str ... ok
test solution_test::test_from_str ... ok
test solution_test::test_known_words ... ok
test solution_test::test_probability ... ok
failures:
---- solution_test::test_clean_line_removes_punctuation stdout ----
thread 'main' panicked at 'assertion failed: `(left == right)`
left: `"foo bar baz"`,
right: `"foo bar baz"`', tests/solution_test.rs:60:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
---- solution_test::test_correction_fails_to_produce_new_result stdout ----
thread 'main' panicked at 'assertion failed: self.is_char_boundary(n)', src/liballoc/string.rs:1602:30
failures:
solution_test::test_clean_line_removes_punctuation
solution_test::test_correction_fails_to_produce_new_result
test result: FAILED. 13 passed; 2 failed; 0 ignored; 0 measured; 0 filtered out
error: test failed, to rerun pass '--test solution_test'
