Initial commit

This commit is contained in:
NortPerm
2023-10-30 15:21:12 +03:00
committed by GitHub
commit 13e2575b4e
149 changed files with 3961 additions and 0 deletions

View File

View File

@@ -0,0 +1,60 @@
## Домашнее задание №3 «Частотный анализ»
Необходимо написать Go функцию, принимающую на вход строку с текстом и
возвращающую слайс с 10-ю наиболее часто встречаемыми в тексте словами.
Если слова имеют одинаковую частоту, то должны быть отсортированы **лексикографически**.
* Словом считается набор символов, разделенных пробельными символами.
* Если есть более 10 самых частотых слов (например 15 разных слов встречаются ровно 133 раза,
остальные < 100), то следует вернуть 10 лексикографически первых слов.
* Словоформы не учитываем: "нога", "ногу", "ноги" - это разные слова.
* Слово с большой и маленькой буквы считать за разные слова. "Нога" и "нога" - это разные слова.
* Знаки препинания считать "буквами" слова или отдельными словами.
"-" (тире) - это отдельное слово. "нога," и "нога" - это разные слова.
#### Пример
```
cat and dog, one dog,two cats and one man
```
Топ 7:
- `and` (2)
- `one` (2)
- `cat` (1)
- `cats` (1)
- `dog,` (1)
- `dog,two` (1)
- `man` (1)
При необходимости можно выделять дополнительные функции / ошибки.
**(*) Дополнительное задание: не учитывать регистр букв и знаки препинания по краям слова:**
* "Нога" и "нога" - это одинаковые слова, "нога!", "нога", "нога," и " 'нога' " - это одинаковые слова;
* "какой-то" и "какойто" - это разные слова.
* "dog,cat", "dog...cat", "dogcat" - разные слова
* "-------" это слово
* "-" словом не является
### Критерии оценки
- Пайплайн зелёный - 4 балла
- Добавлены новые юнит-тесты - до 4 баллов
- Понятность и чистота кода - до 2 баллов
- Дополнительное задание на баллы не влияет
#### Зачёт от 7 баллов
### Подсказки
- `regexp.MustCompile`
- `strings.Split`
- `strings.Fields`
- `sort.Slice`
### Частые ошибки
- `regexp.MustCompile` используется в функции, а не уровне пакета - это плохо по следующим причинам:
* производительность: нет смысла компилировать регулярку каждый раз при вызове функции;
* функция не должна паниковать!
- При выполнении задания со звёздочкой забывают, что тире не должно являться словом.

View File

@@ -0,0 +1,11 @@
module github.com/fixme_my_friend/hw03_frequency_analysis
go 1.19
require github.com/stretchr/testify v1.7.0
require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
)

View File

@@ -0,0 +1,13 @@
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

View File

@@ -0,0 +1,6 @@
package hw03frequencyanalysis
func Top10(_ string) []string {
// Place your code here.
return nil
}

View File

@@ -0,0 +1,82 @@
package hw03frequencyanalysis
import (
"testing"
"github.com/stretchr/testify/require"
)
// Change to true if needed.
var taskWithAsteriskIsCompleted = false
var text = `Как видите, он спускается по лестнице вслед за своим
другом Кристофером Робином, головой вниз, пересчитывая
ступеньки собственным затылком: бум-бум-бум. Другого способа
сходить с лестницы он пока не знает. Иногда ему, правда,
кажется, что можно бы найти какой-то другой способ, если бы он
только мог на минутку перестать бумкать и как следует
сосредоточиться. Но увы - сосредоточиться-то ему и некогда.
Как бы то ни было, вот он уже спустился и готов с вами
познакомиться.
- Винни-Пух. Очень приятно!
Вас, вероятно, удивляет, почему его так странно зовут, а
если вы знаете английский, то вы удивитесь еще больше.
Это необыкновенное имя подарил ему Кристофер Робин. Надо
вам сказать, что когда-то Кристофер Робин был знаком с одним
лебедем на пруду, которого он звал Пухом. Для лебедя это было
очень подходящее имя, потому что если ты зовешь лебедя
громко: "Пу-ух! Пу-ух!"- а он не откликается, то ты всегда
можешь сделать вид, что ты просто понарошку стрелял; а если ты
звал его тихо, то все подумают, что ты просто подул себе на
нос. Лебедь потом куда-то делся, а имя осталось, и Кристофер
Робин решил отдать его своему медвежонку, чтобы оно не пропало
зря.
А Винни - так звали самую лучшую, самую добрую медведицу
в зоологическом саду, которую очень-очень любил Кристофер
Робин. А она очень-очень любила его. Ее ли назвали Винни в
честь Пуха, или Пуха назвали в ее честь - теперь уже никто не
знает, даже папа Кристофера Робина. Когда-то он знал, а теперь
забыл.
Словом, теперь мишку зовут Винни-Пух, и вы знаете почему.
Иногда Винни-Пух любит вечерком во что-нибудь поиграть, а
иногда, особенно когда папа дома, он больше любит тихонько
посидеть у огня и послушать какую-нибудь интересную сказку.
В этот вечер...`
func TestTop10(t *testing.T) {
t.Run("no words in empty string", func(t *testing.T) {
require.Len(t, Top10(""), 0)
})
t.Run("positive test", func(t *testing.T) {
if taskWithAsteriskIsCompleted {
expected := []string{
"а", // 8
"он", // 8
"и", // 6
"ты", // 5
"что", // 5
"в", // 4
"его", // 4
"если", // 4
"кристофер", // 4
"не", // 4
}
require.Equal(t, expected, Top10(text))
} else {
expected := []string{
"он", // 8
"а", // 6
"и", // 6
"ты", // 5
"что", // 5
"-", // 4
"Кристофер", // 4
"если", // 4
"не", // 4
"то", // 4
}
require.Equal(t, expected, Top10(text))
}
})
}