From bd67a41875b9455e20faef10657ff79cb52b1538 Mon Sep 17 00:00:00 2001 From: Alexandr Mayorskiy Date: Mon, 7 Oct 2019 17:19:31 +0300 Subject: [PATCH] Refactor --- calc/calc.go | 34 +++++++++------------------------- calc/calc_test.go | 12 +++++++----- main.go | 6 +++--- 3 files changed, 19 insertions(+), 33 deletions(-) diff --git a/calc/calc.go b/calc/calc.go index d5c96a0..fcaaea7 100644 --- a/calc/calc.go +++ b/calc/calc.go @@ -5,33 +5,17 @@ import ( "unicode" ) -const ( - CHAR_OTHER = 0 - CHAR_LETTER = 1 -) +func WordsBeginsByLetter(txt string, letter rune) int { + cnt := 0 + letter = unicode.ToLower(letter) + lastControl := true -func CalcRWords(txt, letter string) int { - num_r_words := 0 - current_char_type := CHAR_OTHER - word := "" - for _, l := range txt { - if unicode.IsLetter(l) { - if current_char_type == CHAR_LETTER { - word += string(l) - } else { - current_char_type = CHAR_LETTER - word = string(l) - } - } else { - if current_char_type == CHAR_LETTER { - if strings.HasPrefix(strings.ToLower(word), strings.ToLower(letter)) { - num_r_words += 1 - } - } - current_char_type = CHAR_OTHER + for _, r := range strings.ToLower(txt) { + if lastControl && unicode.ToLower(r) == letter { + cnt++ } + lastControl = !unicode.IsLetter(r) } - return num_r_words + return cnt } - diff --git a/calc/calc_test.go b/calc/calc_test.go index cf98e21..6c4f0a4 100644 --- a/calc/calc_test.go +++ b/calc/calc_test.go @@ -6,13 +6,15 @@ import ( ) func TestCalcRWords(t *testing.T) { - assert.Equal(t, CalcRWords("ааа ррр ббб", "р"), 1) - assert.Equal(t, CalcRWords("ааа ррр ббб\nробот\nработа твоя", "р"), 3) - assert.Equal(t, CalcRWords(` + assert.Equal(t, WordsBeginsByLetter("ааа ррр ббб", 'р'), 1) + assert.Equal(t, WordsBeginsByLetter("ааа ррр ббб\nробот\nработа твоя", 'р'), 3) + assert.Equal(t, WordsBeginsByLetter(` Главное, любой бы засмущался, находясь на вечеринке в штанах на пять размеров больше. А этому – все по-барабану. Взял еще пива, попросил бумажку с ручкой и стал что-то быстро писать на листочке. -`, "р"), 2) -} \ No newline at end of file +`, 'р'), 2) + assert.Equal(t, WordsBeginsByLetter("нужная буква в скобках: (р)", 'р'), 1) + assert.Equal(t, WordsBeginsByLetter("буква заглавная Р", 'р'), 1) +} diff --git a/main.go b/main.go index 5354380..f4bfc56 100644 --- a/main.go +++ b/main.go @@ -12,13 +12,13 @@ This script calculates the number of words in the text */ const FILENAME = "Exler.txt" -const LETTER = "р" +const LETTER = 'р' func main() { txt, err := ioutil.ReadFile(FILENAME) if err != nil { log.Fatalf("Failed to open text file: %s", err.Error()) } - num := calc.CalcRWords(string(txt), LETTER) - fmt.Printf("The text %s contains %d words starting from letter '%s'\n", FILENAME, num, LETTER) + num := calc.WordsBeginsByLetter(string(txt), LETTER) + fmt.Printf("The text %s contains %d words starting from letter %q\n", FILENAME, num, LETTER) }